Kor*_*nel 29 similarity remap color-space argb rgba
如何计算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
Run Code Online (Sandbox Code Playgroud)
我尝试过这个公式(编辑: 请参阅下面的答案以获得更好的公式):
?r² + ?g² + ?b² + 3 × ?a²
Run Code Online (Sandbox Code Playgroud)
但它看起来不是最佳的 - 在具有半透明渐变的图像中,它会找到错误的颜色,导致不连续/锐边.不透明颜色和alpha之间的线性比例看似腥.
什么是最佳配方?
*)为了简化这个问题,我忽略了误差扩散,伽玛和心理视觉色彩空间.
略有关联:如果你想在这个非Euclidean RGBA空间中找到最接近的颜色,vp-tree是最好的.
Kor*_*nel 13
最后,我找到了!经过彻底的测试和实验,我的结论是:
正确的方法是计算两种颜色之间的最大可能差异.
具有任何估计的平均/典型差异的公式具有不连续性的空间.
我无法找到一个计算距离的工作公式,而不会将RGBA颜色与某些背景混合.
不需要考虑所有可能的背景颜色.它可以简化为每个R/G/B通道分别混合最大值和最小值:
幸运的是,当你使用预乘alpha(r = r×a
)时,与"白色"和"黑色"混合是微不足道的.
完整的公式是:
max((r?-r?)², (r?-r? - a?+a?)²) +
max((g?-g?)², (g?-g? - a?+a?)²) +
max((b?-b?)², (b?-b? - a?+a?)²)
Run Code Online (Sandbox Code Playgroud)