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