Каков наилучший алгоритм поиска ближайшего цвета в массиве для другого цвета?

У меня есть цвет (RGB), который считывается с датчика. У меня также есть список "известных" цветов, каждый из которых связан с именем строки.

Каким будет лучший способ (т.е. вести себя как человек, выбирающий цвета), чтобы вытащить имя ближайшего цвета из этого списка?

Я пробовал кратчайшее декартовое расстояние с RGB, но это делает серое ближе к зеленому, чем к черному или белому.

Ответ 1

Вместо использования RGB попробуйте использовать цветную модель

Ответ 2

Джон Скит прав. Вам нужно использовать систему с Hue в качестве компонента вместо RGB, если вы обеспокоены тем, что компонент цвета в матче слишком сильно отличается. HSL или HSV будут работать отлично для этой цели.

Затем вам нужно возиться с формулой расстояния, чтобы высвечивать оттенок, пока вы не будете довольны результатами. Обратите внимание, что вы обнаружите, что проблема на самом деле практически неразрешима, если у вас нет большого количества цветов для соответствия или ваши входные цвета ограничены небольшим диапазоном возможных значений. Это потому, что, хотя может показаться, что вы можете прикрепить любой цвет к одному из 8 (красный, оранжевый, зеленый, синий, фиолетовый, черный и белый) или один из 16, на самом деле вы найдете, что ваш алгоритм всегда найдет кажущиеся явно неправильными совпадения, потому что с тремя осями движения (оттенок, насыщенность, значение или красный, зеленый, синий), есть намного больше "основных" цветов, чем вы могли бы подумать на первый взгляд.

Ответ 3

Я бы подумал, что если вы обрабатываете цвета как координаты RGB в трехмерном пространстве и вычисляете расстояние от выборочных до известных значений, вы можете определить ближайшее совпадение. Я, вероятно, также попытаюсь масштабировать R G B в соответствии с чувствительностью к глазам (т.е. Y = 0,3 * R + 0,59 * G + 0,11 * B), вы достигнете наилучшего результата