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


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

какие идеи?

EDIT:

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

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

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

6 71

6 ответов:

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

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

enter image description here

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

EDIT:

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

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

однако довольно вычислительно дорого выполнить такое сравнение:

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

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

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

например, в коммерческом видео цветовые пространства 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 в разумно перцептивно-однородное пространство потребляется десятилетие или более в ЦВЕ и в конце концов ни одна система может будьте согласны.

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

EDIT: с другой стороны, это должно быть верно и для большинства других цветовых пространств.