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
我尝试过这个公式(编辑:请参阅下面的答案以获得更好的公式):
Δr² + Δg² + Δb² + 3 × Δa²
但它看起来不是最佳的 - 在具有半透明渐变的图像中,它会找到错误的颜色,导致不连续/锐边。不透明颜色和alpha之间的线性比例看似腥。 什么是最佳配方? *)为了简化这个问题,我忽略了误差扩散,伽玛和心理视觉色彩空间。 略有关联:如果你想在这个非欧几里德RGBA空间中找到最接近的颜色,vp-tree是最好的。     
已邀请:
最后,我找到了!经过彻底的测试和实验,我的结论是: 正确的方法是计算两种颜色之间的最大可能差异。 具有任何估计的平均/典型差异的公式具有不连续性的空间。 我无法找到一个计算距离的工作公式,而不会将RGBA颜色与某些背景混合。 不需要考虑所有可能的背景颜色。它可以简化为每个R / G / B通道分别混合最大值和最小值: 将两种颜色的通道与channel = 0混合作为背景,测量平方差 将两种颜色的通道混合,使用channel = max作为背景,测量平方差 取两者中的较高者。 幸运的是,当你使用预乘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源包括SSE2实现。     
几个原则: 当两种颜色具有相同的alpha时,rgbaDistance = rgbDistance *(alpha / 255)。当alpha均为255时,与RGB颜色距离算法兼容。 所有具有非常低alpha的颜色都是相似的。 具有相同RGB的两种颜色之间的rgbaDistance线性地取决于Δα。
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);
}
    
我的想法是在所有可能的背景颜色上集成一次并平均平方误差。 即每个组件计算(这里以红色通道为例) 积分从0到1((r1 * a1 + rB *(1-a1)) - (r2 * 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上总结这些。     
首先,一个非常有趣的问题:) 我没有完整的解决方案(至少现在还没有),但我们应该考虑两个明显的极端情况: 当
Δa==0
时,问题与RGB空间类似 当
Δa==1
时,问题只出在alpha 1-dim空间 因此,满足该公式的公式(与您所述的公式非常相似)是:
(Δr² + Δg² + Δb²) × (1-(1-Δa)²) + Δa²
(Δr² + Δg² + Δb²) × (1-Δa²) + Δa²
在任何情况下,它可能会像
(Δr² + Δg² + Δb²) × f(Δa) + Δa²
如果我是你,我会尝试用各种RGBA对和各种背景颜色来模拟它,以找到最好的
f(Δa)
功能。不是很数学,但会给你一个足够接近的答案     
我从来没有这样做,但理论和实践表明,将图像中的RGB值和调色板转换为亮度 - 色度将帮助您找到最佳匹配。我将单独留下alpha通道,因为透明度与“看起来更好”的部分几乎没有任何关系。 这个xmass我使用开源软件制作了一些用于礼物的照片,这些软件将原始图像的片段与图像集合相匹配。这似乎比你想要解决的问题更难。其中一个程序是metapixel。 最后,最好的选择应该是使用现有的库将图像转换为格式,如PNG,您可以在其中控制调色板。     

要回复问题请先登录注册