检查颜色相似度的算法


82

我正在寻找一种算法,该算法可以比较两种RGB颜色并生成它们的相似度值(其中相似度意味着“相对于一般人的感知而言相似”)。

有任何想法吗?

编辑

由于我已经无法回答了,因此决定将我的“解决方案”作为对该问题的修改。

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

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

在此处输入图片说明


比较R,G和B值还不够吗?
BlackBear

@凯:我试图实现同样的事情。您选择YUV方法还是选择了另一种颜色空间和空间距离?
塔里亚玛

3
@Thariama我决定在我的应用程序中使用一个(非常小的)本色子集,以便我可以自己进行颜色比较。我使用大约50种颜色,并且在它们之间使用硬编码的距离。但是从所有我阅读,尝试和测试的角度来看,使用2 ^ 24色YUV表现最好。
Kai Huppmann 2012年

@凯:非常感谢让我知道您的决定及其原因。这意味着您正在使用RGB并使用50种颜色创建直方图,并使用预定义的距离来加快算法,对吗?您使用哪种语言实现算法?
塔里亚玛

@Thariama将其作为原始问题的编辑。
Kai Huppmann 2012年

Answers:


57

欧氏空间中的RGB距离不是很“类似于人类的平均感知”

您可以使用YUV颜色空间,它考虑了以下因素:

|  Y' |      |  0.299    0.587    0.114   | | R |
|  U  |  =   | -0.14713 -0.28886  0.436   | | G |
|  V  |      |  0.615   -0.51499 -0.10001 | | B |

您也可以为此使用CIE颜色空间。

编辑:

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


3
谢谢!然后可以使用Y'UV值的欧氏空间距离吗?
Kai Huppmann

可以,但是您也可以使用其他距离。
Ghassen Hamrouni 2011年

2
很可能仅因为Y'是亮度分量,才想计算UV分量之间的欧式距离。
罗斯,

17
谁能说出YUV中的欧几里得距离反映了人类对差异的理解的说法,有人可以引用吗?
条例草案

4
@比尔没有。请在此处查看“结果”部分:compuphase.com/cmetric.htm
kritzikratzi 2013年

23

我建议使用CIE94(DeltaE-1994),据说它可以很好地代表人类的色彩感知。我已经在与计算机视觉相关的应用程序中使用了很多时间,对此结果我感到非常满意。

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

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

公式(伪代码):


由于使用了CIELAB颜色空间,因此我推荐使用此方法。
谢尔盖·沃罗涅

像“猎人实验室”中的XYZ到LAB?
Zuks

1
没关系...我可以看到Delta E 1994使用CIE-L * ab值
Zuks

14

人类感知的色度比强度弱。

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

我相信您可以计算出距离函数,该函数的亮度优先级高于亮度(Y),而优先级低于色度。

同样,在低强度下,人的视觉几乎是黑白的。因此,优先级函数是非线性的,因为对于低亮度(Y),您对色度的重视程度越来越小。

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


14

这里有一个很好的关于色彩距离的文章: http //www.compuphase.com/cmetric.htm

如果资源消失了,那么作者的结论是,可以使用此公式(用C代码)实现对两种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));
}

3

颜色感知不是欧几里得。任何距离公式都将既足够好又很糟糕。任何基于欧几里德距离的度量(RGB,HSV,Luv,Lab等)对于类似的颜色都足够好,表明水色接近蓝绿色。但是对于非接近值,它可以是任意的。例如,红色接近绿色还是蓝色?

查尔斯·波因顿的《色彩常见问题解答》

XYZ和RGB系统远未表现出感知均匀性。在IE上找到XYZ转换为合理的感知均匀空间所需的时间长达十年或更长时间,最终无法达成单一系统的协议。


谢谢。这是一个非常有趣的链接。出于我的目的,判断红色是接近绿色还是蓝色并不是很重要,而是浅灰色比白色更接近白色,然后是浅红色,我希望(但尚不确定)YUV会做到这一点。
Kai Huppmann

-5

RGB立方体中的颜色相似性是通过欧式距离(使用毕达哥拉斯公式)来衡量的。

编辑:再三考虑,这对于大多数其他颜色空间也应适用。


6
不,RGB空间中的欧几里得距离与人眼感知颜色差异的方式不符。这就是创建Lab之类的色彩空间的全部原因。
比尔

没有。欧氏距离是在任何笛卡尔空间中测量距离的一种方法。它测量距离,而不是相似度!现在,您可以选择欧几里德距离和相似性sortof重合的其他向量空间(例如cie或yuv),或使用其他度量。但是rgb + euclidean的结果不能令人满意。
kritzikratzi 2013年

我也这么认为,但随后打开了一种颜色数量有限的绘图程序(例如,使用Adobe Flash,具有216个预设默认调色板),并对该公式进行了测试,您很快就会失望,当您出现黄色时显然需要褐色,等等
。– Dmitry
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.