php проблема с получением ближайшего подходящего цвета

Мне нужна помощь в поиске ближайшего цветового соответствия из набора предопределенных цветов и одного случайного цвета, вот мой код:

color = array('124','197','118'); // LIGHT GREEN

$match = array(
    array('255', '000', '000', 'FF0000'), //red
    array('000', '255', '000', '00FF00'), //green
    array('000', '000', '255', '0000FF'), //blue    
    array('0', '255', '255', '00ffff'), //cyan
    array('117', '076', '036', '754c24'), //brown
    array('000', '000', '000', '000000'), //black
    array('149', '149', '149', '959595'), //grey
    array('242', '101', '034', 'f26522'), //orange
    array('245', '152', '157', 'f5989d'), //pink
    array('255', '255', '000', 'FFFF00'), //yellow
    array('102', '045', '145', '662d91'), //purple
    array('255', '255', '255', 'FFFFFF')); //white

echo 'Color: <div style="background-color:#'.$color.';width:25px;height:25px"></div>';    //color

foreach($match as $co) $temp[] = array( sqrt(($color[0]-$co[0])^2+($color[1]-$co[1])^2+($color[2]-$co[2])^2) , $co[3]);

asort($temp);

foreach($temp as $ta) { echo 'Matched Color: <div style="background-color:#'.$ta[1].';width:25px;height:25px"></div>'; break; } 

Он возвращает серый вместо зеленого? Как я могу решить эту проблему? Чем


person John    schedule 06.01.2011    source источник
comment
Вы, вероятно, захотите изучить значения цвета HSL (оттенок, насыщенность, свет), так как это будет более точным при поиске почти совпадающих цветов, чем RGB. У меня нет примера (поэтому это комментарий, а не ответ), но найти что-то не составит труда.   -  person Jonathan Kuhn    schedule 07.01.2011


Ответы (2)


вот ссылка на соответствующий вопрос с ответом:

от RGB до ближайшего предопределенного цвета

но, если у вас уже есть проиндексированное изображение, я предлагаю вместо этого использовать это:

http://php.net/manual/en/function.imagecolorclosest.php

person dqhendricks    schedule 06.01.2011
comment
В этой первой ссылке используется та же формула, что и в моем сценарии. Я также пытался использовать php-функцию imagecolorcloset, создавая изображение, содержащее все предопределенные цвета, однако это дает те же результаты. - person John; 07.01.2011

Я помещаю ваши цвета в свой конвертер цветов для анализа вашей проблемы. Я думаю, вы можете видеть, что серый также визуально наиболее близок.

Я думаю, что тройка 124/197/118 — это не светло-зеленый, а прежде всего ненасыщенный зеленый, что объясняет результат.

Я не уверен в некоторых ваших определениях цвета. Для меня

000 255 000 = Lime Green
000 128 000 = Green
128 128 128 = Gray (50%)

Если вам все еще не нравится результат:

1, leave out gray from your predefined colors

or

2, define a threshold for returning gray
-> If result is gray but distance > threshold x,
then take the second colosest match
person John wwc    schedule 07.01.2011
comment
Я попытался исключить серый цвет, и теперь вместо зеленого в качестве соответствующего цвета отображается оранжевый. - person John; 07.01.2011
comment
Попробуйте: коричневый (150,75,0) | оранжевый(255,127,0) | [яркий] розовый (255,0,127) | фиолетовый (127,0,255) ... обратите внимание, однако, что коричневый - это просто темно-оранжевый! Возможно, вы захотите взглянуть на палитру цветов на моем сайте и сместить чистые цвета на расстояние 30 ° для ваших предопределенных цветов. - person John wwc; 07.01.2011