Как вычислить сходство между двумя цветами в цветовом пространстве RGBA? (где цвет фона, конечно, неизвестен)
Мне нужно переназначить изображение RGBA в палитру цветов RGBA, найдя лучшую запись палитры для каждого пикселя изображения *.
В цветовом пространстве 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
и I ' мы пробовали эту формулу ( править: См. ответ ниже, чтобы получить более точную формулу ):
Δr² + Δg² + Δb² + 3 × Δa²
, но она не выглядит оптимальной - на изображениях с полупрозрачными градиентами она находит неправильные цвета, вызывающие неоднородность / резкие края. Линейные пропорции между непрозрачными цветами и альфа-каналом кажутся подозрительными.
Какая оптимальная формула?
*) для простоты ответа на этот вопрос I ' m игнорируя диффузию ошибок, гамму и психовизуальные цветовые пространства.
Слегка связано: если вы хотите найти ближайший цвет в этом неевклидовом пространстве RGBA, vp-деревья являются лучшими.