Подсчитайте, как люди воспринимают сходство между разными цветами - PullRequest
10 голосов
/ 25 апреля 2011

Я работаю над сайтом, где пользователи могут описывать физический объект, используя (среди прочего) любой цвет в диапазоне rgb 0-255. Мы предлагаем несколько упрощенных палитр для удобного нажатия, но требуется полноцветное колесо.

За кадром один из процессов сравнивает два пользовательских описания объекта и оценивает их на сходство.

То, что я пытаюсь сделать, это получить оценку того, насколько похожи эти два цвета с точки зрения человеческого восприятия . По сути, алгоритм должен определить, могут ли два человека, выбирающие два разных цвета, описывать один и тот же объект. Таким образом, Light Red-> Red должен быть на 100%, большинство оттенков серого будут на 100% друг к другу и т. Д., Но red-> green определенно не совпадает.

Чтобы получить приличное представление о том, как работают алгоритмы, я нарисовал градации серого и 3 интенсивности каждого оттенка против всех остальных цветов в наборе и указал, что нет совпадения (0%) с черным, визуально идентично (100%) с белым и оттенки серого для обозначения промежуточных значений.

Моим первым (очень упрощенным подходом) было просто рассматривать значения RGB как координаты в цветном кубе и определять расстояние (величину вектора) между ними.

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

Method 1

Метод 2 преобразовал значения RGB в HSV . Затем я сгенерировал оценку, основанную на 80% на оттенке, а остальные 20% на Sat / Lum. Пока что это лучший метод, но все равно выбрасывает некоторые странные совпадения

Method 2

Метод 3 был попыткой гибридной схемы - значения HSL были рассчитаны, но окончательная оценка была основана на расстоянии между двумя цветами в пространстве цветового цилиндра HSL (как в 3D-полярных координатах).

Method 3

Я чувствую, что должен заново изобрести колесо - конечно, это было сделано раньше? Я не могу найти достойных примеров в Google, и, как вы видите, мой подход оставляет желать лучшего.

Итак, мой вопрос:

Есть ли стандартный способ сделать это? Если так, то как? Если нет, может кто-нибудь предложить способ улучшить мой подход? Я могу предоставить фрагменты кода, если это необходимо, но имейте в виду, что в настоящее время он чертовски грязен из-за 3-х дней подстройки.

Решение (Delta E 2000): Используя приведенные ниже предложения, я реализовал Delta E 2000 компаратор. Мне пришлось изменить весовые значения, чтобы они были достаточно большими - я не ищу цвета, которые незаметно отличаются, но не сильно отличаются. Если кому-то интересно, результирующий сюжет ниже ...

DeltaE2000

Ответы [ 3 ]

4 голосов
/ 25 апреля 2011

Есть полдюжины или около того возможностей. EasyRGB имеет страницу, посвященную им. Из перечисленных DeltaE 2000, вероятно, лучше всего соотносится с человеческим восприятием, а также чрезвычайно сложен для вычисления. Delta CMC почти хороша для чего-то вроде половины кода (хотя вычисления все еще не совсем тривиальны).

1 голос
/ 25 апреля 2011

Это звучит как основной пример подхода, основанного на нейронных сетях (если вы находитесь в режиме эксперимента :), потому что речь идет о создании правила принятия решений, которое имитирует восприятие человеком. Нейронная сеть, которая имеет шесть входов (r, r ', g, g', b, b ') и один выход (is_s Similar), может быть легко обучена с помощью, например, Ваше собственное восприятие сходства как источника обучения!

1 голос
/ 25 апреля 2011

Я не на 100% уверен в том, как устроена ваша проблема, но вы можете прочитать о: Нормализованной взаимной корреляции , и Lab и CIEXYZ цветовые пространства.

...