Как вычислить сходство между двумя цветами в цветовом пространстве RGBA? (где цвет фона, конечно, неизвестен)
Мне нужно переназначить изображение RGBA в палитру цветов RGBA, найдя запись палитры best для каждого пикселя в изображении *.
В цветовом пространстве RGB можно предположить, что наиболее сходным цветом является цвет с наименьшим евклидовым расстоянием. Однако этот подход не работает в RGBA, например, евклидово расстояние от rgba(0,0,0,0)
до rgba(0,0,0,50%)
меньше, чем до rgba(100%,100%,100%,1%)
, но последнее выглядит намного лучше.
Я использую предварительно умноженное цветовое пространство RGBA:
r = r×a
g = g×a
b = b×a
и я попробовал эту формулу ( edit: См. Ответ ниже для лучшей формулы ):
Δr² + Δg² + Δb² + 3 × Δa²
но он не выглядит оптимальным - на изображениях с полупрозрачными градиентами он находит неправильные цвета, которые вызывают разрывы / острые края. Линейные пропорции между непрозрачными цветами и альфа кажутся подозрительными.
Какая оптимальная формула?
*) для простоты этого вопроса я игнорирую диффузию ошибок, гамму и психовизуальные цветовые пространства.
Немного связано: если вы хотите найти ближайший цвет в этом неевклидовом пространстве RGBA, лучше всего vp-деревья .