Как сопоставить диапазон шестнадцатеричных значений цвету

Мне нужно получить наиболее доминирующий цвет на изображении, и мне удалось найти шестнадцатеричное значение (RGB) соответствует этому. Следующее, что нужно шестнадцатеричные значения карты в общие цвета (лайк красный, желтый, зеленый, синий, фиолетовый, розовый, белый, серый, черный, коричневый так далее). Так что в основном мне нужен способ отображения диапазон гекса значения в определенный цвет.
Например, # ff5050, # ff1a1a, # e60000 и т. Д. Красного цвета. Так что если # ff5050 дается в качестве входных данных, результат должен быть красный. Таким образом, все шестнадцатеричные значения должны соответствовать некоторым общим цветам, которые были упомянуты выше.
Как можно этого добиться?

Я предпочитаю язык программирования php.

0

Решение

Вы можете получить гистограмму изображения в PHP. Вы можете найти больше информации и пример кода здесь: http://php.net/manual/en/imagick.getimagehistogram.php

Чтобы сопоставить ваш цвет с именем html, вы можете просмотреть массив цветов и рассчитать цветовое расстояние с цветом, который вы ищете. Цвет с наименьшим расстоянием — это тот, который даст наилучшее название HTML. Вы можете найти больше ресурсов о цветовом расстоянии здесь: https://en.m.wikipedia.org/wiki/Color_difference

Это может занять огромное количество времени каждый раз, когда вы обрабатываете каждую новую картинку, так ЛУЧШЕЕ РЕШЕНИЕ:
Вы находитесь в цветовом пространстве RGB. Это означает, что у вас есть 256x256x256 разных цветов. Каждый цвет определяется координатами RGB — http://www.w3schools.com/colors/colors_names.asp. Например, у ‘aqua’ есть координаты RGB (0,255,255). Ваша цель состоит в том, чтобы назвать все цвета в пространстве RGB именем, но вам не нужно уникальное имя для очень одного цвета в пространстве RGB, потому что вы не можете различить каждую деталь своим глазом (например, (0,0,1) и (0,0,2) будет выглядеть так же). Поэтому вы указываете список названий цветов, которые вы хотите:

$colorNames = array(
[0] => 'white', //#FFFFFF
[1] => 'red',   //#FF0000
...
);

Теперь для быстрого картирования цвета С, заданный координатами (r, g, b), имени цвета, вы должны посмотреть, какой индекс в массиве $ colorNames соответствует цвету С. Для этого вы можете заранее подготовить файл размером 256 * 256 * 256 = 16 МБ. Каждый байт представляет одну точку в пространстве RGB. Значение байта — это индекс цвета в массиве $ colorNames, с которым цвет больше всего похож. Как создать файл (псевдокод):

for every value of R coordinate
for every value of G coordinate
for every value of B coordinate
find which color name in $colorName has the smallest distance to coordinates (R,G,B)
store the index for this color name to file

Теперь у вас есть файл, который содержит все индексы для любого цвета. Это означает, что все, что вам нужно сделать сейчас, чтобы сопоставить любой цвет с именем, — это прочитать один байт в этом файле и посмотреть в массиве имя цвета.

open mapping file
read one byte on position (R*256*256 + G*256 + B)
this byte is the 'index' in colorNames array
read the color name (colorNames['index'])
0

Другие решения

Или более инженерный подход. Разделите пространство RGB на 8 подпространств и сделайте приблизительное название цвета. Тогда вам просто нужно выяснить, в каком подпространстве ваш цвет.

$colorNames = array(
array(
array(
'black', // 0 0 0
'blue'   // 0 0 1
),
array(
'green', // 0 1 0
'cyan'   // 0 1 1
)
),
array(
array(
'red',   // 1 0 0
'violet' // 1 0 1
),
array(
'yellow',// 1 1 0
'white'  // 1 1 1
)
)
);

function GetColorName($r, $g, $b)
{
global $colorNames;
echo $r_appx = (int)($r/0x80);
echo $g_appx = (int)($g/0x80);
echo $b_appx = (int)($b/0x80);

return $colorNames[$r_appx][$g_appx][$b_appx];
}

echo GetColorName(0xAA,0x40,0x40); // red
echo GetColorName(0x40,0xAA,0x40); // green
echo GetColorName(0x40,0x40,0xAA); // blue
echo GetColorName(0xAA,0x40,0xAA); // violet
echo GetColorName(0xAA,0xAA,0x40); // yellow
echo GetColorName(0x00,0xAA,0xAA); // cyan
echo GetColorName(0x40,0x40,0x40); // black
echo GetColorName(0xAA,0xAA,0xAA); // white

Точно так же вы можете легко разделить пространство RGB на 27 подпространств, если вам нужно больше цветов.

0

По вопросам рекламы [email protected]