Рассчитайте, как люди воспринимают сходство между разными цветами

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

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

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

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

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

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

Method 1

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

Method 2

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

Method 3

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

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

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

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

DeltaE2000

Ответ 1

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

Ответ 3

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