Алгоритм проверки подобия цветов

Я ищу алгоритм, который сравнивает два цвета RGB и генерирует значение их сходства (где сходство означает "похожее на среднее восприятие человека" ).

Любые идеи?

ИЗМЕНИТЬ

Поскольку я больше не могу отвечать, я решил поместить свое "решение" в качестве редактирования вопроса.

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

Поскольку это приложение для iPhone, я работал с objective-C, а реализация - это более или менее матрица, представляющая таблицу ниже, которая показывает расстояния между цветами.

enter image description here

Ответ 1

Расстояние RGB в евклидовом пространстве не очень "похоже на обычное человеческое восприятие"

Вы можете использовать YUV цветовое пространство, оно учитывает этот фактор:

enter image description here

Вы также можете использовать цветовое пространство CIE.

EDIT:

Я упомянул, что цветовое пространство YUV является недорогим приближением, которое можно вычислить с помощью простых формул. Но это не воспринимается единообразно. Единообразно воспринимаемая форма означает, что изменение той же величины в цветовом значении должно приводить к изменению примерно той же визуальной важности. Если вам нужна более точная и строгая метрика, вы обязательно должны рассмотреть цветовое пространство CIELAB или другое перцепционно однородное пространство (даже если для преобразования нет простых формул).

Ответ 2

Я бы рекомендовал использовать CIE94 (DeltaE-1994), он сказал, что это достойное представление о восприятии человеческого восприятия. Я использовал его совсем немного в приложениях, связанных с компьютерным видением, и я очень доволен результатом.

Однако, однако, довольно дорогостоящее вычисление для такого сравнения:

  • RGB to XYZ для обоих цветов
  • XYZ to LAB для обоих цветов
  • Diff = DeltaE94(LABColor1,LABColor2)

Формулы (псевдокод):

Ответ 3

Человеческое восприятие слабее по цвету, чем интенсивность.

Например, в коммерческом видео цветовые пространства YCbCr/YPbPr (также называемые Y'UV) уменьшают разрешение информации о цвете, но сохраняют яркость (Y). В цифровом сжатии видео, таком как 4: 2: 0 и 4: 2: 2, уменьшается битрейт цвета из-за относительно слабого восприятия.

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

Кроме того, при низкой интенсивности человеческое зрение практически черно-белое. Следовательно, функция приоритета нелинейна в том, что для низкой яркости (Y) вы помещаете меньше и меньше веса на цветность.

Более научные формулы: http://en.wikipedia.org/wiki/Color_difference

Ответ 4

Здесь отличная запись на тему цветовых расстояний: http://www.compuphase.com/cmetric.htm

В случае исчезновения ресурса автор приходит к выводу, что наилучшее недорогое приближение к расстоянию между двумя цветами RGB может быть достигнуто с использованием этой формулы (в коде).

typedef struct {
   unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
  long rmean = ( (long)e1.r + (long)e2.r ) / 2;
  long r = (long)e1.r - (long)e2.r;
  long g = (long)e1.g - (long)e2.g;
  long b = (long)e1.b - (long)e2.b;
  return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}

Ответ 5

Восприятие цвета не является евклидовым. Любая формула расстояния будет одновременно достаточно хорошей и ужасной. Любая мера, основанная на евклидовом расстоянии (RGB, HSV, Luv, Lab,...), будет достаточно хороша для подобных цветов, показывая, что аква близка к тику. Но для не-близких значений оно становится произвольным. Например, красный ближе к зеленому или синему?

От Чарльза Пойнтона Цветные часто задаваемые вопросы:

Системы XYZ и RGB далеки от демонстрируя единообразие восприятия. Поиск преобразования XYZ в разумно перцептивно-однородное пространство потреблял 10 лет или более на CIE и, в конце концов, ни одна система не могла быть согласованным.

Ответ 6

Поглощение цвета в кубе RGB измеряется эвклидовым расстоянием (используйте формулу pythagoras).

РЕДАКТИРОВАТЬ: Во второй раз это должно быть верно и для большинства других цветовых пространств.