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