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是最好的。
最后,我找到了它!彻底的测试和实验后,我的结论是:
正确的方法是计算两个颜色之间最大可能差。
任何种类的估计平均值/典型值差异的公式都有非线性的空间。我无法找到正确的公式,该公式可以计算出没有将RGBA颜色与背景混合在一起的距离。
-
没有必要考虑每种可能的背景颜色。它可以简化向下为每个R/G/B信道的分别混合的最大和最小:
- 共混物中两种颜色通道与通道 = 0作为背景,测量平方差
- 共混物以通道 =最大为背景,测量平方差
- 取两者中较高者。
与 “白”, “黑” 幸运勾兑当您使用预乘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₂)²)
我从来没有做过,但理论和实践说,图像转换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)
函数。不是很数学,但会给你足够接近的答案
几个原则:
- 当两个颜色具有相同的α,rgbaDistance = rgbDistance *(阿尔法/ 255)。当两个alpha都是255时,与RGB色距算法兼容。
- 所有具有非常低α值的颜色都是相似的。
- 具有相同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);
}
超酷的问题!但是,我担心背景颜色不是一个变量。我认为你应该把它当作一个整体。 – anon 2011-01-21 02:01:48
当然,我可以把它作为一个变量,但那将是**未知的变量** :) RGBA的整点是允许任何背景。 – Kornel 2011-01-21 08:58:34
您是否正在寻找一种公式,可以为您提供所有可能的背景颜色的“距离”?或只是为了一个未知的背景颜色? – 2011-01-21 11:41:23