如何计算RGBA色彩空间中两种颜色之间的相似度? (当然背景颜色不清楚)
我需要通过为图像*中的每个像素找到最佳的调色板条目,将RGBA图像重新映射到RGBA颜色的调色板。
在RGB颜色空间中,最相似的颜色可以被认为是具有最小欧几里德距离的颜色。然而,这种方法在RGBA中不起作用,例如,从rgba(0,0)到rgba(0,50%)的欧氏距离小于rgba(100%,100%, 100%,1%),但后者看起来好多了。
我正在使用预乘的RGBA色彩空间:
r = r×a g = g×a b = b×a
我试过这个公式(编辑:See the answer below for better formula):
Δr² + Δg² + Δb² + 3 × Δa²
但它看起来不是最佳的 – 在具有半透明渐变的图像中,它发现导致不连续/尖锐边缘的错误颜色。不透明颜色和alpha之间的线性比例似乎很腥。
什么是最佳配方?
*)为了简化这个问题,我忽略错误扩散,伽玛和心理视觉色彩空间。
稍微相关:如果你想在这个非欧几里得RGBA空间中找到最近的颜色,那么vp-trees是最好的。
解决方法
最后我找到了!经过彻底的测试和实验,我的结论是:
>正确的方法是计算两种颜色之间的最大可能差异。
具有任何种类的估计平均/典型差异的公式具有非线性的空间。
>我无法找到正确的公式,计算距离,而不会混合RGBA颜色与背景。
>没有必要考虑到所有可能的背景颜色。可以简化为每个R / G / B通道单独混合最大值和最小值,即红色通道:
>将红色= 0的两种颜色混合为背景,测量平方差
>混合两种颜色与红色=最大背景,测量平方差
>采取更高的两个。
幸运的是,当使用预乘α(r = r×a)时,与“白”和“黑”混合是微不足道的。
完整的公式是:
max((r₁-r₂)²,(r₁-r₂ - a₁+a₂)²) + max((g₁-g₂)²,(g₁-g₂ - a₁+a₂)²) + max((b₁-b₂)²,(b₁-b₂ - a₁+a₂)²)