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

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

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

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

 Rooke12 нояб. 2009 г., 08:35
Я считаю, что это может помочь (очень похожая проблема):stackoverflow.com/questions/1678457/...

Ответы на вопрос(3)

Решение Вопроса

Вместо того, чтобы использовать RGB, попробуйте использоватьHSL (оттенок, насыщенность, яркость) или HSV (оттенок, насыщенность и значение) цветовая модель. Затем поэкспериментируйте с различными элементами смещения, например, оттенок важнее, чем яркость, когда выПересчет расстояния.

 Jon Skeet21 июл. 2013 г., 21:49
@AlbertRenshaw: яЯ не совсем уверен, какую информацию ваш комментарий предназначен для передачи ...
 Jon Skeet21 июл. 2013 г., 21:58
@AlbertRenshaw: На каком языке / платформе, хотя? Я предполагаю, что Objective-C ... но вопрос не имеет абсолютно никаких указаний на платформу.
 Dave Haynes06 мая 2014 г., 19:09
HSV и HSL, вероятно, будут лучше, чем RGB, но лучшим способом будет преобразование в цветовое пространство LAB, а затем вычисление "дельта-е» используя одно из существующих стандартных сравнений цветов (CIE1976, CIE94, CIEDE2000). Я недавно нашелColorMine библиотека для .NET, которая делает все это на одном дыхании.
 Albert Renshaw21 июл. 2013 г., 22:05
Ах! Вы'верный 0 :) яудаляю комментарий хаха! (И да, это было объективно!)
 Albert Renshaw21 июл. 2013 г., 21:54
Кроме того, если это кому-то поможет ... Я нашел лучшие результаты в своем приложении, когда значение HUE составляет 47,5%, насыщенность - 28,75%, а ЯРКОСТЬ - 23,75%.

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

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

 Eric12 нояб. 2009 г., 23:15
По идее, датчик находит "ближайший» цвет в списке цветов. Приложение этой проблемы - робот, который должен обнаруживать пятна 4 заданных цветов на белом фоне.
 Southern Hospitality13 нояб. 2009 г., 04:44
Зависит от того "ближайший» средства. Зеленый был ближе всего к серому из-за ошибки RMS RMS в вашем исходном коде. Так было ли это неправильно? Учитывая, что вы говорите «да», вы явно навязываете какую-то другую идею ближайшего, основанную на восприятии цвета. И я'Я говорю, что вы найдете, что вы не 'Я действительно доволен результатами, пока у вас не найдется что-то вроде 64 правильно подобранных цветов. По крайней мере, для человеческого глаза. Представленный код должен работать для сравнения с 4 предварительно определенными пазами, при условии, что пачки нене очень похожи друг на друга.

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

 Jason Satterfield08 февр. 2013 г., 02:31
Единственная проблема с использованием RGB и нахождением величины между двумя цветами состоит в том, что величина может быть одинаковой для двух одинаково удаленных цветов, но в противоположных направлениях от сравниваемого цвета. Например (для простоты это не учитывает масштабирование для чувствительности глаз): если RGB равен 0xFF0000 и сравнивается с 0x00FF00 и 0x0000FF, величины одинаковы, но ближе ли зеленый к красному, чем синему?

Ваш ответ на вопрос