Обработка и печать фото

Сложный вопрос для любителей и профессионалов фотошопа (проверьте себя):

Пусть у меня есть рисунок. Пусть мне задан вопрос: определить доминирующий цвет на фотографии (какого больше) . Верно ли утверждение, что если я смотрю кривые, каждый цветовой канал по отдельности: что общая площадь графика данных гистограмм отражает кол-во цвета в рисунке; и где площадь больше - такого и цвета больше?

Если нет, и этот путь неверен - какие есть пути ответа на поставленный вопрос?

Спасибо.
Юрий Добрин
Юрий Добрин
12 852
Очнь простая формула:
getImageColor($pic , $colors_num, $step);
*
* $pic = 'путь к файлу'; (string)
*$colors_num = 'количество возвращаемых цветов'; (int)
*$step = 'шаг пикселей по вертикали и горизонтали'; (int)
*
*$colors -> возращается ассоциативный массив ( [цвет в hex]=>[количество вхождений] )
*/

// start of class : Generator Image Color Palette
class GeneratorImageColorPalette
{
public $error = 1;
//default 0x33;
//погрешность определения цвета

// get image color in RGB format function
function getImageColor($imageFile_URL, $numColors, $image_granularity = 5)
{
$image_granularity = max(1, abs((int)$image_granularity));
$colors = array();
//find image size
$size = @getimagesize($imageFile_URL);
if($size === false)
{
user_error("Unable to get image size data");
return false;
}
// open image
$img = @imagecreatefromjpeg($imageFile_URL);
if(!$img)
{
user_error("Unable to open image file");
return false;
}

// fetch color in RGB format
for($x = 0; $x < $size[0]; $x += $image_granularity)
{
for($y = 0; $y < $size[1]; $y += $image_granularity)
{
$thisColor = imagecolorat($img, $x, $y);
$rgb = imagecolorsforindex($img, $thisColor);

$red = round(round(($rgb['red'] / $this->error)) * $this->error);
$green = round(round(($rgb['green'] / $this->error)) * $this->error);
$blue = round(round(($rgb['blue'] / $this->error)) * $this->error);

$red = ($red>255) ? 255 : $red;
$green = ($green>255) ? 255 : $green;
$blue = ($blue>255) ? 255 : $blue;

$red = dechex($red);
$green = dechex($green);
$blue = dechex($blue);

$red = (strlen($red) == 1) ? '0'.$red : $red;
$green = (strlen($green) == 1) ? '0'.$green : $green;
$blue = (strlen($blue) == 1) ? '0'.$blue : $blue;

//$thisRGB = sprintf('XXX', $red, $green, $blue);
//$thisRGB = dechex($red).dechex($green).dechex($blue);
$thisRGB = $red.$green.$blue;

if(array_key_exists($thisRGB, $colors))
{
$colors[$thisRGB]++;
}
else
{
$colors[$thisRGB] = 1;
}
}
}
arsort($colors);
// returns maximum used color of image format like #C0C0C0.
return array_slice(($colors), 0, $numColors,true);
}

// html color to convert in RGB format color like R(255) G(255) B(255)
function getHtml2Rgb($str_color)
{
if ($str_color[0] == '#')
$str_color = substr($str_color, 1);

if (strlen($str_color) == 6)
list($r, $g, $b) = array($str_color[0].$str_color[1],
$str_color[2].$str_color[3],
$str_color[4].$str_color[5]);
elseif (strlen($str_color) == 3)
list($r, $g, $b) = array($str_color[0].$str_color[0], $str_color[1].$str_color[1], $str_color[2].$str_color[2]);
else
return false;

$r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
$arr_rgb = array($r, $g, $b);
// Return colors format liek R(255) G(255) B(255)
ОЛ
Ольга Леонова
26 445
Лучший ответ
..неверно - количество цветов на картинке, обычно значительно больше, чем количество цветовых каналов...
А вы н в курсе что там яркость цвета отображается.. .
это вопрос не для ,..фотошопа а для детей... .

Задайте корректно вопрос.. .
Учитывая частоты... .
или хоть пространство цветовое...
Вообще-то для начал неплохо бы определиться, что такое преобладающий цвет и вообще, с какой стороны мы его будем определять: как цвет, занимающий не менее заданного процента от площади изображения или как цвет, имеющий отклонение не выше заданного от "центрального".
В частности, каков будет преобладающий цвет на картинке из 30% красного, 30% оранжевого и 40% зелеого? Красно-оранжевый или зеленый?
Если нам задана (или вычислена) некоторая погрешность, мы можем разбить цветовой куб на зоны, размеры которых примерно соответствуют величине погрешности (например на 10 частей при 10% и 20 частей при 5%) по каждой из цветовых координат.
При 10% получаем примерно 1000 зон (цвет трехмерен) .
Далее оцениваем, по сколько в среднем пикселей попадет в одну зону. Например, для рисунка 320х240 - примерно 77 штук. Если это число оказалось меньше нескольких единиц (например 4), вряд ли задача в такой постановке разрешима.
Далее мы выделяем зоны скопления цветов. Обозначив их границы примерно, можно разделить окрестности раниц на более подробные подзоны - для более точного опрелеления. Находим самую представительную зону скопления и принимаем решение о том, как будем вычислять средний по зоне цвет - как максимально удаленный от границ зоны либо как средневзвешенное значение по пикселям, входящим в зону.
Азизчони Нозим
Азизчони Нозим
16 765
...у меня встречный вопрос - зачем???
Вот когда собаке делать нечего, она яйца лижет. Уж извините.
Сергей Ковалев
Сергей Ковалев
10 392
Не сложный а дебильный вопрос.
пил??
Елена И
Елена И
6 083
что такое фотошеп?
грузим фото и радуваемся :D
Ни фига!.. Там какая-то сложная формула... ну вот тут даже скрипт какой-то есть.