ProDomainer.ru - Клуб Домейнеров  
     

Войти через OpenID
Left Nav Справка ПортфолиоАукцион (39) Календарь Поиск Сообщения за день Все разделы прочитаны Right Nav

Left Container Right Container
 
Старый 01.11.2012, 20:18   #1
Член Клуба ProDomainer.ru
 

Кто шарит в математике?

Есть вот такой вот код "фотошопа"
PHP код:
<?php
$in_filename 
'in.jpg';
$out_filename 'out.jpg';
list(
$width$height,$type) = getimagesize($in_filename);
switch (
$type) {
    case 
IMAGETYPE_JPEG:
        
$in imagecreatefromjpeg($in_filename);
        break;
    case 
IMAGETYPE_PNG:
        
$in imagecreatefrompng($in_filename);
        break;
    case 
IMAGETYPE_GIF:
        
$in imagecreatefromgif($in_filename);
        break;
    default:
        die();
        break;
}
    
///
$resize 0;
$m max($width,$height);
if (
$m >512$resize $m/512;
else 
$resize 1;
$newwidth =  floor($width/$resize);
$newheight floor($height/$resize);
// изменение размера
$out imagecreatetruecolor($newwidth$newheight);
imagecopyresized($out$in0000$newwidth$newheight$width$height);
$in $out;
$width $newwidth;
$height $newheight;
// Создадим пустое изображение, чтобы не конфликтовать с ресурсом $in
$out imagecreatetruecolor($newwidth$newheight);
// в цикле переместим все точки в нужное место
for($i=0;$i<$width;$i++) {
    for(
$j=0;$j<$height;$j++) {
        
$rgb imagecolorat($in,$i,$j);
        
$r = ($rgb >> 16) & 0xFF;
        
$g = ($rgb >> 8) & 0xFF;
        
$b $rgb 0xFF;
        list(
$h,$s,$v) = rgb2hsv(array($r,$g,$b));
//if($s>0.15) $s = pow($s,0.2);
//$h = 0;
//        $s = pow(10*$s,0.4)/pow(10,0.4);
        
list($r,$g,$b) = hsv2rgb(array($h,$s,$v));
//        $r=255-$r;$g=255-$g;$b=255-$b;
//        $r=$g=$b=$v*255;
        
$rgb imagecolorallocate($out$r$g$b);
        
imagesetpixel($out,$i,$j,$rgb);
    }
}
imagepng ($out,$out_filename);
imagejpeg ($out,$out_filename,75);
die();

// $c = array($red, $green, $blue)
function rgb2hsv($c) {
 list(
$r,$g,$b)=$c;
// $r = $r/256;$g=$g/256;$b=$b/256;
 
$v=max($r,$g,$b);
 
$t=min($r,$g,$b);
 
$s=($v==0)?0:($v-$t)/$v;
 if (
$s==0)
  
$h=-1;
 else {
  
$a=$v-$t;
  
$cr=($v-$r)/$a;
  
$cg=($v-$g)/$a;
  
$cb=($v-$b)/$a;
  
$h=($r==$v)?$cb-$cg:(($g==$v)?2+$cr-$cb:(($b==$v)?$h=4+$cg-$cr:0));
  
$h=60*$h;
  
$h=($h<0)?$h+360:$h;
 }
// $h = round($h/0.36);
// $h = $h/0.36;
 
return array($h,$s,$v);
}

// $c = array($hue, $saturation, $brightness)
// $hue=[0..360], $saturation=[0..1], $brightness=[0..1]
function hsv2rgb($c) {
 list(
$h,$s,$v)=$c;
//  $h = $h*0.36;
  
if ($s==0)
  return array(
$v,$v,$v);
 else {
  
$h=($h%=360)/60;
  
$i=floor($h);
  
$f=$h-$i;
  
$q[0]=$q[1]=$v*(1-$s);
  
$q[2]=$v*(1-$s*(1-$f));
  
$q[3]=$q[4]=$v;
  
$q[5]=$v*(1-$s*$f);
//  return(array($q[($i+4)%5]*255,$q[($i+2)%5]*255,$q[$i%5]*255));
  
return(array($q[($i+4)%6],($q[($i+2)%6]), ($q[$i%6]))); //[1]
//  return(array($q[($i+4)%6],$q[($i+2)%6], $q[$i%6])); //[1]
 
}
}
Код производит разные манипуляции с цветами фотки....
Собственно манипуляции как раз закоментированны
Наиболее интересные это:
PHP код:
if($s>0.15$s pow($s,0.2); 
Она увеличивает насыщенность у тех, у кого она больше чем 0.15
Почему такое ограничение? Потому что если увеличивать ее тем, у кого она маленькая, то мы усилим шум....
Такая схема показывает себя неплохо, разве что лица у смуглых типа меня становятся немного неестественными. Однако есть проблема - в местах около 0.15 имеем разрыв, вроде по смыслу цвета гладко меняются, а у нас резкий скачек....
Если у нас в оригинале функция
s_new = s_old
то в идеале мне кажется функция которая в начале, до некоторой контрольной точки идет несколько меньше s_old а дальше несколько больше, и так чтобы на концах они совпадали... Я пробовал добавлять синусоиду. Получалось похоже на то, что я хочу, но точка пересечения графиков идет по середине, т.е. в 0.5, а мне нужно заметно ниже....
Даже моя синяя рубашка (которая стала основой моей красной аватарки , см ниже) при таком графике оказывается недостаточно насыщенной.
т.е. надо подправить функцию, чтобы первый полупериод имел большую частоту чем второй, и чтобы это было плавно.... Ну или другую функцию....


ПЫСЫ: Второй интересный эффект это замена цвета - $h=0;
Ноль это красный. Опытным путем получилось, что красный наиболее естественно выглядит. Пример:

В оригинале рубашка ярко синяя, а кросовки голубые...
Фон я размыл и ослабил, ибо там была еще одна девочка, а половинку от девочки оставлять не хотелось.

В любой ситуации выбор всегда за вами. Вы либо гуляете под дождем, либо просто под ним мокнете.
Mendel вне форума   Ответить с цитированием
Старый 03.11.2012, 02:50   #2
Член Клуба ProDomainer.ru
 

Если от синусоиды нужен только первый полупериод, то лучше взять за основу гиперболическую или параболическую функцию. Возможно экспоненциальная подойдет. Момент предела преобразований взять за единицу по шкале ОY или за 10, - это уж зависит от плавности функции.
Причем гиперболическая с асимптотическим характером, по-моему, вообще идеально подходит.

«А вы, друзья, как не садитесь,
Всё в музыканты не годитесь» ©
UFO вне форума   Ответить с цитированием
Старый 03.11.2012, 14:19   #3
Член Клуба ProDomainer.ru
 

Я знаю карате, бокс, дзюдо и много других страшных слов)

В любой ситуации выбор всегда за вами. Вы либо гуляете под дождем, либо просто под ним мокнете.
Mendel вне форума   Ответить с цитированием
Старый 04.11.2012, 01:55   #4
Член Клуба ProDomainer.ru
 

А что, так шокирует? Я думал норм написал

«А вы, друзья, как не садитесь,
Всё в музыканты не годитесь» ©
UFO вне форума   Ответить с цитированием
Старый 04.11.2012, 03:50   #5
Член Клуба ProDomainer.ru
 

норм это было бы что-то типа:
y = x+ 0.2*sin(-pi*x)
(если не ошибаюсь это мой наиболее близкий к искомому вариант
А так ты накидал много умных слов, часть из которых я не помню, а часть надо шаманить в любом случае и пытаться сделать что-то приличное...
Я в экселе шаманил, что нашаманил выше....
Задача в том, чтобы получить решение, а не список разных уравнений.
А решение мне надо такое, чтобы мой график пересекся с y = x
не в 0.5 как оно происходит, а в нужном мне месте, скажем названном цифрой а.
Я уже пытался туда и логарифмы вставлять и все что угодно, но пока толку нет.
Не так бошка работает.
Пока склоняюсь к тому, чтобы таки оставить один if, только сгладив функцию, чтобы перелом был, но в целом график был гладким... но пока и это еще не изобразил.

В любой ситуации выбор всегда за вами. Вы либо гуляете под дождем, либо просто под ним мокнете.

Последний раз редактировалось Mendel; 04.11.2012 в 03:54..
Mendel вне форума   Ответить с цитированием
Старый 04.11.2012, 13:28   #6
Член Клуба ProDomainer.ru
 

Попробуй y=5/x

«А вы, друзья, как не садитесь,
Всё в музыканты не годитесь» ©
UFO вне форума   Ответить с цитированием
Старый 04.11.2012, 13:38   #7
Член Клуба ProDomainer.ru
 

деление на ноль в нуле, вместо необходимого нуля.

В любой ситуации выбор всегда за вами. Вы либо гуляете под дождем, либо просто под ним мокнете.
Mendel вне форума   Ответить с цитированием
Старый 04.11.2012, 13:41   #8
Член Клуба ProDomainer.ru
 

Для случая с нулем: y=x^5
Если x>0, то y=5/x

«А вы, друзья, как не садитесь,
Всё в музыканты не годитесь» ©
UFO вне форума   Ответить с цитированием
Старый 04.11.2012, 14:04   #9
Член Клуба ProDomainer.ru
 

Антон, перечитай еще раз ТЗ
Цитата:
Сообщение от Mendel Посмотреть сообщение
Если у нас в оригинале функция
s_new = s_old
то в идеале мне кажется функция которая в начале, до некоторой контрольной точки идет несколько меньше s_old а дальше несколько больше, и так чтобы на концах они совпадали... Я пробовал добавлять синусоиду. Получалось похоже на то, что я хочу, но точка пересечения графиков идет по середине, т.е. в 0.5, а мне нужно заметно ниже....

В любой ситуации выбор всегда за вами. Вы либо гуляете под дождем, либо просто под ним мокнете.
Mendel вне форума   Ответить с цитированием
Старый 04.11.2012, 16:24   #10
Член Клуба ProDomainer.ru
 

Не понимаю. Функция, которая совпадает на концах, - замкнутая - круг или овал, в конце концов просто пятилепестковая роза (т.е. (в полярных координатах))!

«А вы, друзья, как не садитесь,
Всё в музыканты не годитесь» ©
UFO вне форума   Ответить с цитированием
Старый 04.11.2012, 17:00   #11
Член Клуба ProDomainer.ru
 

Ок.
Условие:
при х = 0, у = 0
при х = 1, у = 1
при х = b, y = b
при x < b, y < x
при x > b, y > x
функция должна быть дифференцируема на участке от нуля до единицы.
у всегда лежит в диапазоне от нуля до единицы

В любой ситуации выбор всегда за вами. Вы либо гуляете под дождем, либо просто под ним мокнете.
Mendel вне форума   Ответить с цитированием
Старый 05.11.2012, 05:03   #12
Член Клуба ProDomainer.ru
 

при х = 0, у = 0
при х = 1, у = 1
при х = b, y = b

Это х=y

А другие два условия - синусоида, все правильно.

«А вы, друзья, как не садитесь,
Всё в музыканты не годитесь» ©
UFO вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
Быстрый переход


Часовой пояс GMT +4, время: 04:31.