Алгоритм проверки схожести цветов

84

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

Есть идеи?

ИЗМЕНИТЬ :

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

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

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

введите описание изображения здесь

Кай Хуппманн
источник
Сравнивать значения R, G и B недостаточно?
BlackBear
@Kai: я пытаюсь реализовать то же самое. Вы выбрали подход YUV или выбрали другой тип цветового пространства и пространственного расстояния?
Thariama
3
@Thariama Я решил использовать (очень) небольшое подмножество истинных цветов в моем приложении, чтобы я мог самостоятельно обрабатывать сравнение цветов. Я работаю примерно с 50 цветами и использую жестко запрограммированные расстояния между ними. Однако из всего, что я читал и пробовал, и тестировал при использовании 2 ^ 24 цветов, YUV справился лучше всего.
Кай Хуппманн,
@Kai: большое спасибо за то, что сообщили мне о своем решении и его причинах. это означает, что вы используете RGB и создаете гистограмму, используя 50 цветов, и ускоряете свой алогифм, используя заранее определенные расстояния, верно? на каком языке вы реализовали свой алгоритм?
Thariama
@Thariama Поместите это как правку в исходный вопрос.
Кай Хуппманн,

Ответы:

57

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

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

|  Y' |      |  0.299    0.587    0.114   | | R |
|  U  |  =   | -0.14713 -0.28886  0.436   | | G |
|  V  |      |  0.615   -0.51499 -0.10001 | | B |

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

РЕДАКТИРОВАТЬ:

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

Гассен Хамруни
источник
3
Спасибо! Могу ли я тогда пойти с евклидовым пространственным расстоянием значений Y'UV?
Кай Хуппманн,
Конечно, но вы также можете использовать другие расстояния.
Ghassen Hamrouni
2
Скорее всего, вы захотите рассчитать евклидово расстояние между УФ-компонентами только потому, что Y '- это компонент яркости.
Росс
17
Может ли кто-нибудь процитировать источник утверждения, что евклидово расстояние в YUV отражает человеческое восприятие различий?
Билл
4
@ Билл, это не так. см. раздел «результаты» здесь: compuphase.com/cmetric.htm
kritzikratzi
23

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

Однако выполнение такого сравнения требует больших вычислительных затрат:

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

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

JHolta
источник
Я предпочел этот метод из-за использования цветового пространства CIELAB, спасибо.
Сергей Воронежский
XYZ в LAB как в «Hunter-Lab»?
Zuks
1
Неважно ... Я вижу, что Delta E 1994 использует значения CIE-L * ab
Зукс,
15

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

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

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));
}
strttn
источник
14

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

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

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

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

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

Стивен Чанг
источник
3

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

Из FAQ по цвету Чарльза Пойнтона :

Системы XYZ и RGB далеки от единообразия восприятия. Обнаружение преобразования XYZ в разумно однородное для восприятия пространство заняло у CIE десятилетие или более, и в итоге ни одна система не была согласована.

xan
источник
Спасибо. И это отличная, интересная ссылка. Для меня не так важно сказать, что красный ближе к зеленому или синему, но что светло-серый ближе к белому, чем светло-красный, и я надеюсь (но еще не уверен), что YUV сделает это.
Кай Хуппманн
-5

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

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

Дэймон
источник
6
Нет, евклидово расстояние в пространстве RGB не соответствует тому, как человеческий глаз воспринимает различия между цветами. Это вся причина создания цветовых пространств, таких как Lab.
Билл
нет. Евклидово расстояние - это один из способов измерения расстояния в любом декартовом пространстве. он измеряет расстояние, а не сходство! теперь вы можете выбрать другое векторное пространство (например, cie или yuv), в котором евклидово расстояние и sortof сходства совпадают, либо использовать другую меру. но rgb + euclidean не дают удовлетворительных результатов.
kritzikratzi
Я тоже так думал, но затем открываю программу рисования с ограниченным количеством цветов (например, Adobe Flash с 216 предустановленной палитрой по умолчанию) и проверяю эту формулу, и вы очень очень быстро разочаровываетесь, получая желтую окраску, когда вы явно нужен коричневый и т. д.
Дмитрий