RGBA颜色空间中的颜色相似性/距离

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通道分别混合最大值和最小值:

    1. 将两种颜色的通道与channel = 0混合作为背景,测量平方差
    2. 将两种颜色的通道混合,使用channel = max作为背景,测量平方差
    3. 取两者中的较高者.

幸运的是,当你使用预乘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)

C源包括SSE2实现.