检查颜色相似性的算法

Kai*_*ann 77 algorithm rgb comparison colors

我正在寻找一种比较两种RGB颜色并生成其相似性值的算法(其中相似性意味着"与人类平均感知相似").

有任何想法吗?

编辑:

由于我不能回答,我决定将我的"解决方案"作为问题的编辑.

我决定在我的应用程序中使用(非常)小的真彩色子集,以便我可以自己处理颜色的比较.我使用大约30种颜色,并使用它们之间的硬编码距离.

由于它是一个iPhone应用程序,我使用Objective-C,实现或多或少是一个表示下表的矩阵,它显示了颜色之间的距离.

在此输入图像描述

Gha*_*uni 55

欧几里德空间中的RGB距离不是"非常类似于人类的感知"

你可以使用YUV颜色空间,它考虑到这个因素:

在此输入图像描述

您也可以使用CIE颜色空间来实现此目的.

编辑:

我要提到YUV颜色空间是一种廉价的近似值,可以通过简单的公式计算出来.但它在感性上并不统一.感知统一意味着颜色值中相同量的变化应产生大约相同视觉重要性的变化.如果您需要更精确和更严格的指标,您必须考虑CIELAB颜色空间或另一个感知均匀空间(即使没有简单的转换公式).

  • 任何人都可以引用一个声称来源,即YUV中的欧几里德距离反映了人类对差异的看法吗? (15认同)
  • @Bill它没有.请参阅此处的"结果"部分:http://www.compuphase.com/cmetric.htm (4认同)
  • 谢谢!那么我可以使用Y'UV值的欧几里德空间距离吗? (2认同)
  • 很可能您只想计算 UV 分量之间的欧几里得距离,因为 Y' 是亮度分量。 (2认同)

JHo*_*lta 17

我建议使用CIE94(DeltaE-1994),它被认为是人类色彩感知的体面代表.我在计算机视觉相关的应用程序中使用了很多,我对结果非常满意.

然而,执行这样的比较计算起来相当昂贵:

  1. RGB to XYZ 两种颜色
  2. XYZ to LAB 两种颜色
  3. Diff = DeltaE94(LABColor1,LABColor2)

公式(伪代码):


Ste*_*ung 13

人类感知的色度弱于强度.

例如,在商业视频中,YCbCr/YPbPr颜色空间(也称为Y'UV)降低了色度信息的分辨率,但保留了亮度(Y).在诸如4:2:0和4:2:2的数字视频压缩中,由于相对较弱的感知而降低了色度比特率.

我相信你可以计算一个距离函数,它比亮度(Y)具有更高的优先级,而不是优先于色度的优先级.

此外,在低强度下,人类视觉实际上是黑白的.因此,优先级函数是非线性的,因为对于低亮度(Y),您对色度的权重越来越小.

更科学的公式:http://en.wikipedia.org/wiki/Color_difference


str*_*ttn 9

这里有关于色距的很好的写作:http: //www.compuphase.com/cmetric.htm

如果资源消失,作者的结论是使用该公式(代码中)可以实现两种RGB颜色之间距离的最佳低成本近似.

typedef struct {
   unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
  long rmean = ( (long)e1.r + (long)e2.r ) / 2;
  long r = (long)e1.r - (long)e2.r;
  long g = (long)e1.g - (long)e2.g;
  long b = (long)e1.b - (long)e2.b;
  return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}
Run Code Online (Sandbox Code Playgroud)


xan*_*xan 6

颜色感知不是欧几里得的。任何距离公式都既足够好,同时又很糟糕。任何基于欧几里得距离(RGB、HSV、Luv、Lab...)的测量对于相似的颜色都足够好,显示水绿色接近青色。但对于非接近值来说,它是任意的。例如,红色更接近绿色还是更接近蓝色?

来自 Charles Poynton 的颜色常见问题解答

XYZ 和 RGB 系统远未表现出感知一致性。在 CIE 上花了十年或更长时间才找到将 XYZ 转换为感知上相当均匀的空间的方法,最终没有一个系统能够达成一致。