Поиск цвета, который соответствует одному из заданной палитры

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

Пока что я придумал следующее:

  1. Для каждого входящего цвета найдите в палитре цвет с наименьшим distance, узнавая расстояние от каждого цвета в палитре.
  2. Для определения расстояния можно использовать один из следующих подходов:
    1. Сумма квадратов разностей значений R, G и B ((R1-R2)² + (G1-G2)² + (B1-B2)²)
    2. Преобразуйте цвет в HSV, используйте средневзвешенное значение H, S и V в качестве индикатора расстояния. Что-то типа3 ✕ (H1-H2)² + 2 ✕ (S1-S2)² + (V1-V2)²
    3. Расстояние в YCbCr

В частности, я ищу две вещи.

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

1 ответ

Как часто бывает, ответ зависит от того, почему именно вы хотите это сделать.

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

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

Если вы хотите, чтобы изображение было максимально похожим на оригинал для человеческого глаза, вы можете использовать "перцепционно однородный" показатель, такой как CIELAB ΔE*. В любом случае, по моему личному мнению, такие метрики излишне сложны и приносят мало пользы. Вы увидите различия только для цветов, которые далеки от цветов в вашей палитре, если вообще увидите.

Другие вопросы по тегам