Алгоритм проверки сходства цветов
Я ищу алгоритм, который сравнивает два цвета RGB и генерирует значение их сходства (где сходство означает "похожий по отношению к среднему человеческому восприятию").
какие идеи?
EDIT:
поскольку я больше не могу ответить, я решил поместить свое "решение" в качестве редактирования вопроса.
Я решил пойти с (очень) небольшим подмножеством истинного цвета в моем приложении, так что я могу обрабатывать сравнение цветов по моему собственный. Я работаю примерно с 30 цветами и использую жестко закодированные расстояния между ними.
поскольку это было приложение для iPhone, я работал с objective-C, и реализация представляет собой более или менее матрицу, представляющую таблицу ниже, которая показывает расстояния между цветами.
6 ответов:
расстояние RGB в евклидовом пространстве не очень "похоже на усредненное человеческое восприятие"
можно использовать ЮВ цветовое пространство, оно учитывает этот фактор:
вы также можете использовать CIE цветовое пространство для этой цели.
EDIT:
я упомяну, что цветовое пространство YUV является недорогим приближением, которое можно вычислить с помощью простых формул. Но это не перцептивно форме. Перцептивно однородный означает, что изменение одинаковой величины в значении цвета должно привести к изменению примерно одинаковой визуальной важности. Если вам нужна более точная и строгая метрика, вы обязательно должны рассмотреть цветовое пространство CIELAB или другое перцептивно однородное пространство (даже если нет простых формул для преобразования).
Я бы рекомендовал использовать CIE94 (DeltaE-1994), говорят, что это достойное представление человеческого восприятия цвета. Я использовал его довольно много в своих приложениях, связанных с компьютерным зрением, и я довольно доволен результатом.
однако довольно вычислительно дорого выполнить такое сравнение:
RGB to XYZ
для обоих цветовXYZ to LAB
для цветаDiff = DeltaE94(LABColor1,LABColor2)
Формулы (псевдокод):
- формулы преобразования цвета:http://www.easyrgb.com/?X=MATH
- Дельта-е формулы:http://www.easyrgb.com/index.php?X=DELT
человеческое восприятие слабее по цветности, чем по интенсивности.
например, в коммерческом видео цветовые пространства YCbCr/YPbPr (также называемые Y'UV) уменьшают разрешение информации о цветности, но сохраняют яркость (Y). В цифровом видео сжатие, такое как 4:2:0 и 4:2:2 уменьшает битрейт цветности из-за относительно слабого восприятия.
Я считаю, что вы можете рассчитать функцию расстояния, дающую более высокий приоритет над luma (Y) и менее приоритет над цветность.
кроме того, при низкой интенсивности, человеческое зрение практически черно-белый. Поэтому функция приоритета нелинейна в том, что для низкой яркости (Y) вы ставите все меньше и меньше веса на цветность.
более научные формулы:http://en.wikipedia.org/wiki/Color_difference
здесь есть отличная запись на тему цветовых расстояний: 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)); }
восприятие цвета не является Евклидовой. Любая формула расстояния будет достаточно хороша и ужасна одновременно. Любая мера, основанная на евклидовом расстоянии (RGB, HSV, Luv, Lab ...) будет достаточно хорошо для подобных цветов, показывая Аква быть близко к чирок. Но для не близких значений он становится произвольным. Например, красный цвет ближе к зеленому или к синему?
от Чарльза Пойнтона цвета часто задаваемые вопросы:
системы XYZ и RGB далеки от показывать равномерность восприятия. Найти преобразование координат XYZ в разумно перцептивно-однородное пространство потребляется десятилетие или более в ЦВЕ и в конце концов ни одна система может будьте согласны.