Поиск цвета, который соответствует одному из заданной палитры
У меня есть палитра цветов: 32 или 256. Затем у меня есть поток входящих цветов (в RGB). Я хочу выяснить, какому цвету в палитре наиболее точно соответствует входящий цвет. Я считаю, что такой алгоритм используется во многих программах для редактирования изображений.
Пока что я придумал следующее:
- Для каждого входящего цвета найдите в палитре цвет с наименьшим
distance
, узнавая расстояние от каждого цвета в палитре. - Для определения расстояния можно использовать один из следующих подходов:
- Сумма квадратов разностей значений R, G и B (
(R1-R2)² + (G1-G2)² + (B1-B2)²
) - Преобразуйте цвет в HSV, используйте средневзвешенное значение H, S и V в качестве индикатора расстояния. Что-то типа
3 ✕ (H1-H2)² + 2 ✕ (S1-S2)² + (V1-V2)²
- Расстояние в YCbCr
- Сумма квадратов разностей значений R, G и B (
В частности, я ищу две вещи.
- Есть ли лучший способ, чем проверять расстояние для каждого цвета в палитре? Я ищу какой-то алгоритм биннинга, чтобы найти правильный цвет из палитры.
- Если вы продолжаете проверять расстояние для каждого элемента в палитре, есть ли стандартные формулы, которые считаются стандартными?
1 ответ
Как часто бывает, ответ зависит от того, почему именно вы хотите это сделать.
Если цель состоит в том, чтобы минимизировать ошибку численного приближения, можно использовать суммы квадратов разности (или максимум абсолютных разностей).
Я бы воздержался от произвольной формулы такой взвешенной суммы различий в каком-то колориметрическом пространстве, которая не имеет точного обоснования и трудно интерпретируема.
Если вы хотите, чтобы изображение было максимально похожим на оригинал для человеческого глаза, вы можете использовать "перцепционно однородный" показатель, такой как CIELAB ΔE*. В любом случае, по моему личному мнению, такие метрики излишне сложны и приносят мало пользы. Вы увидите различия только для цветов, которые далеки от цветов в вашей палитре, если вообще увидите.