我正在寻找一种算法,该算法可以比较两种RGB颜色并生成它们的相似度值(其中相似度意味着“相对于一般人的感知而言相似”)。
有任何想法吗?
编辑:
由于我已经无法回答了,因此决定将我的“解决方案”作为对该问题的修改。
我决定在我的应用程序中使用一个(很小的)真彩色子集,以便我可以自己比较颜色。我使用大约30种颜色,并在它们之间使用硬编码的距离。
由于它是一个iPhone应用程序,因此我使用了Objective-C,实现的过程或多或少是表示下表的矩阵,该表显示了颜色之间的距离。
我正在寻找一种算法,该算法可以比较两种RGB颜色并生成它们的相似度值(其中相似度意味着“相对于一般人的感知而言相似”)。
有任何想法吗?
编辑:
由于我已经无法回答了,因此决定将我的“解决方案”作为对该问题的修改。
我决定在我的应用程序中使用一个(很小的)真彩色子集,以便我可以自己比较颜色。我使用大约30种颜色,并在它们之间使用硬编码的距离。
由于它是一个iPhone应用程序,因此我使用了Objective-C,实现的过程或多或少是表示下表的矩阵,该表显示了颜色之间的距离。
Answers:
欧氏空间中的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颜色空间或另一个在感知上统一的空间(即使没有简单的转换公式)。
我建议使用CIE94(DeltaE-1994),据说它可以很好地代表人类的色彩感知。我已经在与计算机视觉相关的应用程序中使用了很多时间,对此结果我感到非常满意。
然而,执行这样的比较在计算上相当昂贵:
RGB to XYZ
对于两种颜色XYZ to LAB
对于两种颜色Diff = DeltaE94(LABColor1,LABColor2)
公式(伪代码):
人类感知的色度比强度弱。
例如,在商业视频中,YCbCr / YPbPr颜色空间(也称为Y'UV)降低了色度信息的分辨率,但保留了亮度(Y)。在数字视频压缩中(例如4:2:0和4:2:2),由于感知能力相对较弱,因此降低了色度比特率。
我相信您可以计算出距离函数,该函数的亮度优先级高于亮度(Y),而优先级低于色度。
同样,在低强度下,人的视觉几乎是黑白的。因此,优先级函数是非线性的,因为对于低亮度(Y),您对色度的重视程度越来越小。
这里有一个很好的关于色彩距离的文章: 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));
}
颜色感知不是欧几里得。任何距离公式都将既足够好又很糟糕。任何基于欧几里德距离的度量(RGB,HSV,Luv,Lab等)对于类似的颜色都足够好,表明水色接近蓝绿色。但是对于非接近值,它可以是任意的。例如,红色接近绿色还是蓝色?
查尔斯·波因顿的《色彩常见问题解答》:
XYZ和RGB系统远未表现出感知均匀性。在IE上找到XYZ转换为合理的感知均匀空间所需的时间长达十年或更长时间,最终无法达成单一系统的协议。
RGB立方体中的颜色相似性是通过欧式距离(使用毕达哥拉斯公式)来衡量的。
编辑:再三考虑,这对于大多数其他颜色空间也应适用。