Я ищу алгоритм, который сравнивает два цвета RGB и генерирует значение их сходства (где сходство означает «сходство в отношении среднего человеческого восприятия»).
Есть идеи?
ИЗМЕНИТЬ :
Поскольку я больше не могу отвечать, я решил внести свое «решение» в качестве редактирования вопроса.
Я решил использовать (очень) небольшое подмножество истинных цветов в своем приложении, чтобы я мог самостоятельно обрабатывать сравнение цветов. Я работаю примерно с 30 цветами и использую жестко запрограммированные расстояния между ними.
Поскольку это было приложение для iPhone, я работал с objective-C, и реализация представляет собой более или менее матрицу, представляющую таблицу ниже, которая показывает расстояния между цветами.
algorithm
colors
comparison
rgb
Кай Хуппманн
источник
источник
Ответы:
Расстояние RGB в евклидовом пространстве не очень "похоже на среднее человеческое восприятие"
Вы можете использовать цветовое пространство YUV , оно учитывает этот фактор:
Вы также можете использовать для этой цели цветовое пространство CIE .
РЕДАКТИРОВАТЬ:
Я отмечу, что цветовое пространство YUV - это недорогое приближение, которое можно вычислить с помощью простых формул. Но это не единообразно по восприятию. Перцептивно однородный означает, что изменение одного и того же значения цвета должно приводить к изменению примерно такой же визуальной важности. Если вам нужна более точная и строгая метрика, вы обязательно должны рассмотреть цветовое пространство CIELAB или другое перцептивно однородное пространство (даже если нет простых формул для преобразования).
источник
Я бы рекомендовал использовать CIE94 (DeltaE-1994), который, как говорят, является достойным представлением человеческого восприятия цвета. Я довольно часто использовал его в своих приложениях, связанных с компьютерным зрением, и очень доволен результатом.
Однако выполнение такого сравнения требует больших вычислительных затрат:
RGB to XYZ
для обоих цветовXYZ to LAB
для обоих цветовDiff = DeltaE94(LABColor1,LABColor2)
Формулы (псевдокод):
источник
Здесь есть отличная статья о цветовых расстояниях: http://www.compuphase.com/cmetric.htm
В случае, если этот ресурс исчезнет, автор приходит к выводу, что наилучшее недорогое приближение к расстоянию между двумя цветами RGB может быть достигнуто с помощью этой формулы (в коде C ).
источник
Человеческое восприятие слабее по цветности, чем по интенсивности.
Например, в коммерческом видео цветовые пространства YCbCr / YPbPr (также называемые Y'UV) уменьшают разрешение информации цветности, но сохраняют яркость (Y). При сжатии цифрового видео, таком как 4: 2: 0 и 4: 2: 2, уменьшается битрейт цветности из-за относительно более слабого восприятия.
Я считаю, что вы можете вычислить функцию расстояния, дающую более высокий приоритет над яркостью (Y) и меньший приоритет над цветностью.
Кроме того, при низкой интенсивности человеческое зрение практически черно-белое. Следовательно, функция приоритета нелинейна в том смысле, что для низкой яркости (Y) вы придаете все меньше и меньше веса цветности.
Более научные формулы: http://en.wikipedia.org/wiki/Color_difference
источник
Восприятие цвета не евклидово. Любая формула расстояния будет одновременно и хороша, и ужасна. Любая мера, основанная на евклидовом расстоянии (RGB, HSV, Luv, Lab, ...), будет достаточно хороша для аналогичных цветов, показывая, что вода близка к бирюзовому. Но для не близких значений это может быть произвольно. Например, красный ближе к зеленому или синему?
Из FAQ по цвету Чарльза Пойнтона :
источник
Сходство цвета в кубе RGB измеряется евклидовым расстоянием (используйте формулу Пифагора).
РЕДАКТИРОВАТЬ: Во-вторых, это должно быть верно и для большинства других цветовых пространств.
источник