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

问题描述:

如何计算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 

,我已经试过这个公式(编辑See the answer below for better formula):

Δr² + Δg² + Δb² + 3 × Δa² 

但它并不最佳 - 在具有半透明渐变的图像中,它找到导致不连续/尖锐边缘的错误颜色。不透明颜色和阿尔法之间的线性比例看起来很腥。

什么是最佳公式?


*)为了简化这个问题我忽略了误差扩散,gamma和心理视觉色彩空间。


轻微相关:如果你想找到这个非欧空间RGBA颜色最接近,vp-trees是最好的。

+1

超酷的问题!但是,我担心背景颜色不是一个变量。我认为你应该把它当作一个整体。 – anon 2011-01-21 02:01:48

+0

当然,我可以把它作为一个变量,但那将是**未知的变量** :) RGBA的整点是允许任何背景。 – Kornel 2011-01-21 08:58:34

+0

您是否正在寻找一种公式,可以为您提供所有可能的背景颜色的“距离”?或只是为了一个未知的背景颜色? – 2011-01-21 11:41:23

最后,我找到了它!彻底的测试和实验后,我的结论是:

  • 正确的方法是计算两个颜色之间最大可能差。
    任何种类的估计平均值/典型值差异的公式都有非线性的空间。

  • 我无法找到正确的公式,该公式可以计算出没有将RGBA颜色与背景混合在一起的距离。

  • 没有必要考虑每种可能的背景颜色。它可以简化向下为每个R/G/B信道的分别混合的最大和最小:

    1. 共混物中两种颜色通道与通道 = 0作为背景,测量平方差
    2. 共混物以通道 =最大为背景,测量平方差
    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₂)²) 

C Source including SSE2 implementation

我从来没有做过,但理论和实践说,图像转换RGB值和调色板luminance–chrominance将帮助您找到最好的比赛。我会离开Alpha通道,因为透明度应该与“看起来更好”的部分毫无关系。

这XMASS我做了一些photomosaics使用相匹配的原始图像的碎片图像的集合开源软件的礼物。这似乎是一个比你想要解决的问题更难的问题。其中一个项目是metapixel

最后,最好的选择应该是使用现有的库将图像转换为一种格式,如PNG,您可以在其中控制面板。

我的想法是在所有可能的背景颜色一次整合和平均误差平方。

即,对于每个组件计算(使用红色信道作为例子在这里)

从0积分为1((R1 * A1 + rB中*(1-A1)) - (R 2 * A2 + rB中*(1 -a2)))^ 2 * DRB

其中,如果我计算正确的计算结果为:

dA=a1-a2 
dRA=r1*a1-r2*a2 
errorR=dRA^2+dA*dRA+dA^2/3 

再总结这些在R,G和B.

首先,一个非常有趣的问题:)
我没有一个完整的解决方案(至少目前还没有),但也有2明显的极端情况下,我们应该考虑:
Δa==0问题类同到RGB空间
Δa==1问题是仅在α1-抗暗淡空间
所以式(这是非常类似于你陈述的一个),将满足是:
(Δr² + Δg² + Δb²) × (1-(1-Δa)²) + Δa²(Δr² + Δg² + Δb²) × (1-Δa²) + Δa²

无论如何,它可能会像(Δr² + Δg² + Δb²) × f(Δa) + Δa²

如果我是你,我会尝试模拟它与各种RGBA对和各种背景颜色,以找到最好的f(Δa)函数。不是很数学,但会给你足够接近的答案

几个原则:

  1. 当两个颜色具有相同的α,rgbaDistance = rgbDistance *(阿尔法/ 255)。当两个alpha都是255时,与RGB色距算法兼容。
  2. 所有具有非常低α值的颜色都是相似的。
  3. 具有相同RGB的两种颜色之间的rgbaDistance线性依赖于增量Alpha。
double DistanceSquared(Color a, Color b) 
{ 
    int deltaR = a.R - b.R; 
    int deltaG = a.G - b.G; 
    int deltaB = a.B - b.B; 
    int deltaAlpha = a.A - B.A; 
    double rgbDistanceSquared = (deltaR * deltaR + deltaG * deltaG + deltaB * deltaB)/3; 
    return deltaAlpha * deltaAlpha/2.0 + rgbDistanceSquared * a.A * b.A/(255 * 255); 
}