RGBA色彩空间中的色彩相似度/距离

前端之家收集整理的这篇文章主要介绍了RGBA色彩空间中的色彩相似度/距离前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何计算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₂)²)

C Source including SSE2 implementation

猜你在找的CSS相关文章