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

但事实并非如此 最佳 - 在具有半透明梯度的图像中,它发现错误的颜色会导致不连续/尖锐的边缘。不透明的颜色和α之间的线性比例似乎是腥的。

什么是最佳公式?


*)为简单起见,我忽略了错误扩散,伽玛和心理色彩空间。


略有相关:如果您想在这个非欧盟rgba空间中找到最近的颜色, VP-Trees 最好的。

有帮助吗?

解决方案

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

  • 正确的方法是计算 最大 两种颜色之间的可能区别。
    任何类型的平均/典型差异的公式都有不连续性的空间。

  • 我找不到一个工作公式,该公式可以计算距离,而无需将RGBA颜色与某些背景混合。

  • 无需考虑所有可能的背景颜色。可以将其简化为R/g/b通道中的每一个分别混合最大值和最小值:

    1. 将两种颜色的频道与 渠道= 0作为背景,测量平方差
    2. 将两种颜色的频道与 渠道=最大作为背景,测量平方差
    3. 在两者中提高。

幸运的是,当您使用parmultipled 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实施.

其他提示

几个原则:

  1. 当两种颜色具有相同的alpha时,rgbadistance = rgbDistance *(alpha / 255)。当两个alpha均为255时,与RGB颜色距离算法兼容。
  2. 所有具有非常低α的颜色都相似。
  3. 具有相同RGB的两种颜色之间的RGBADISTANCE与Delta 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);
}

我的想法是一次整合所有可能的背景颜色,并平均正方形误差。

IE对于每个组件计算(以红色通道为例,在此使用)

从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上。

首先,一个非常有趣的问题:)
我没有完整的解决方案(至少尚未),但是我们应该考虑有2个明显的极端情况:
什么时候 Δ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等格式,您可以在其中控制调色板。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top