Я работаю над сайтом, где пользователи могут описывать физический объект, используя (среди прочего) любой цвет в диапазоне rgb 0-255. Мы предлагаем несколько упрощенных палитр для удобного нажатия, но требуется полноцветное колесо.
За кадром один из процессов сравнивает два пользовательских описания объекта и оценивает их на сходство.
То, что я пытаюсь сделать, это получить оценку того, насколько похожи эти два цвета с точки зрения человеческого восприятия . По сути, алгоритм должен определить, могут ли два человека, выбирающие два разных цвета, описывать один и тот же объект. Таким образом, Light Red-> Red должен быть на 100%, большинство оттенков серого будут на 100% друг к другу и т. Д., Но red-> green определенно не совпадает.
Чтобы получить приличное представление о том, как работают алгоритмы, я нарисовал градации серого и 3 интенсивности каждого оттенка против всех остальных цветов в наборе и указал, что нет совпадения (0%) с черным, визуально идентично (100%) с белым и оттенки серого для обозначения промежуточных значений.
Моим первым (очень упрощенным подходом) было просто рассматривать значения RGB как координаты в цветном кубе и определять расстояние (величину вектора) между ними.
Это отбросило ряд проблем, связанных с тем, что черный цвет -> 50% серого, который находится на большем расстоянии, чем, скажем, черный цвет -> 50% синего. после сотен сравнений и запроса обратной связи, это не соответствует человеческому восприятию (показано ниже)
Метод 2 преобразовал значения RGB в HSV . Затем я сгенерировал оценку, основанную на 80% на оттенке, а остальные 20% на Sat / Lum. Пока что это лучший метод, но все равно выбрасывает некоторые странные совпадения
Метод 3 был попыткой гибридной схемы - значения HSL были рассчитаны, но окончательная оценка была основана на расстоянии между двумя цветами в пространстве цветового цилиндра HSL (как в 3D-полярных координатах).
Я чувствую, что должен заново изобрести колесо - конечно, это было сделано раньше? Я не могу найти достойных примеров в Google, и, как вы видите, мой подход оставляет желать лучшего.
Итак, мой вопрос:
Есть ли стандартный способ сделать это? Если так, то как? Если нет, может кто-нибудь предложить способ улучшить мой подход? Я могу предоставить фрагменты кода, если это необходимо, но имейте в виду, что в настоящее время он чертовски грязен из-за 3-х дней подстройки.
Решение (Delta E 2000):
Используя приведенные ниже предложения, я реализовал Delta E 2000
компаратор. Мне пришлось изменить весовые значения, чтобы они были достаточно большими - я не ищу цвета, которые незаметно отличаются, но не сильно отличаются. Если кому-то интересно, результирующий сюжет ниже ...