2016-07-26 2 views
4

Есть ли способ определить цвета, заданные их шестнадцатеричными кодами, как оттенки определенного цвета?
Я думаю, что нашел способ, не уверен, насколько точным - но как я могу определить, соответствует ли найденный вами цвет не достаточно хорошо?Поиск наилучшего совпадения цвета - и отклонение, если нет оттенков цвета

Мне нужно определить цветовые соответствия для определенных цветов - фиксированный набор (красный, желтый, оранжевый, синий, зеленый, коричневый, фиолетовый, серый, черный, белый).

На данный момент я делаю матч цвета в зависимости от расстояния:

Учитывая цвет c из списка фиксированного цвета выше (я набор с помощью шестигранных цвета, мы надеемся, будет в середине диапазона для этого цвета , который я не совсем уверен, как получить - прямо сейчас я использую цвет, который выглядит «хорошо»), а список доступных цветов list, я пытаюсь найти индекс из списка с самым близким цветом.

int matchColor(QColor c, QList<QColor> list) 
{ 
    int bestIndex = 0; 
    int distance; 
    int bestMatch = 0; 
    int sz = list.size() - 1; 

    for (int i = 0; i <= sz; ++i) 
    { 
     int Rdiff = 255 - qAbs(c.red() - list.at(i).red()); 
     int Gdiff = 255 - qAbs(c.green() - list.at(i).green()); 
     int Bdiff = 255 - qAbs(c.blue() - list.at(i).blue()); 
     distance = Rdiff + Gdiff + Bdiff; 

     if (distance > bestMatch) 
     { 
      bestMatch = distance; 
      bestIndex = i; 
     } 
    } 

    // if(bestMatch < 600 ? or something ?) return -1; 

    return bestIndex; 
} 

Проблема заключается в том, потому что этот матч должен строго соблюдаться (для некоторых стандартов), я должен вернуться оттенки определенного цвета c и неудачу, если я не могу.
Я не на 100% уверен, что совпадение цвета хорошее - хотя это выглядит довольно хорошо.

Но кроме поиска наилучшего совпадения цвета - какое разумное значение расстояния, за которое я должен отклонить матч? (ожидая distance между 0 и 765, с идеальным соответствием 765).
Есть ли определенные диапазоны, которые я могу проверить?

Будет ли диапазон отличаться для каждого цвета?

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

+1

Да, диапазон будет отличаться для каждого цвета, если вы сначала не преобразовать в перцептивно равномерного цветового пространства, такие как [CIE Lab] (https://en.wikipedia.org/wiki/Lab_color_space) , –

ответ

6

В принципе невозможно сказать, какие допуски приемлемы для вашего прецедента, но я настоятельно рекомендую преобразовать его в HSV, прежде чем пытаться сопоставить цвета. H-компонент является критическим и, вероятно, должен иметь допуск не более 20 или 30 градусов. S и V гораздо менее критичны; вы можете либо игнорировать их, либо отфильтровывать только крайние случаи, когда оттенок полностью исчезает.

Преобразование описано здесь: Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both

+0

Используя методы QColor от qt, я могу получить значения HSL - и я пытаюсь сравнить оттенок, если он положительный. Для белого, черного, оттенков серого оттенок задается как -1, поэтому я сравниваю значение. Кажется легким ... Но сравнивая некоторые цвета, такие как коричневый - «# 8b4513» (hue = 25), лучше всего подходит оранжевый - «# e98300» (оттенок = 33) (разность = 8) (из случайного списка цветов) - это (как это сделал метод евклидовой разницы), но кажется, что оттенок недостаточно проницателен, чтобы отклонить это совпадение, а 8 - действительно маленькая разница. – Thalia

+0

Хорошо, извините, что слышу это. Я сам использовал этот метод много лет назад, когда мне все еще приходилось поддерживать цветной вывод 8-бит (палитры) и нашел, что он дает хорошие результаты для моей цели. Это похоже на хорошее совпадение с вашей проблемой. –

4

Самый стандартный способ измерения цветовых различий является то, что называется дельта Е. Дельта Е вычисляется из 2-х значений Lab, где лаборатория является стандартным способом цвета описаны.

DeltaE=sqrt(pow(L1-L2,2)+pow(a1-a2,2)+pow(b1-b2,2))

Есть три значения Lab, L, а, б. L - мера блеска. a и b определяют оттенок и насыщенность. Подумайте, a и b как вектор. Длина - насыщенность цвета, а угол - оттенок.

Выберите цвет, который производит самую маленькую Delta E. Существует немного улучшенная версия под названием DeltaE2000, которая улучшает соответствие небольших цветовых различий, но математика сложнее, и DeltaE достаточно хороша для большинства целей.

См. Здесь для преобразования значений sRGB в Lab.

RGB to CIE LAB

+0

Я постараюсь понять это, я вернусь :-) – Thalia

Смежные вопросы