我正在寻找一种比较两种RGB颜色并生成其相似度值的算法(其中相似性意味着“与人类平均感知相似”)。
有什么想法吗?
修改:
由于我不能回答,我决定将我的“解决方案”作为问题的编辑。
我决定在我的应用程序中使用(非常)小的真彩色子集,以便我可以自己处理颜色的比较。我使用大约30种颜色并使用它们之间的硬编码距离。
由于它是一个iPhone应用程序,我使用Objective-C并且实现或多或少是表示下表的矩阵,它显示了颜色之间的距离。
答案 0 :(得分:53)
欧几里德空间中的RGB距离不是“非常类似于人类感知”
您可以使用YUV色彩空间,它会考虑这个因素:
您还可以使用CIE颜色空间来实现此目的。
修改强>
我要提到YUV色彩空间是一种廉价的近似值,可以通过简单的公式计算出来。但它在感性上并不统一。感知统一意味着颜色值中相同量的变化应产生大约相同视觉重要性的变化。 如果您需要更精确和更严格的指标,您必须考虑CIELAB颜色空间或另一个感知均匀空间(即使没有简单的转换公式)。
答案 1 :(得分:15)
我建议使用CIE94(DeltaE-1994),它被认为是人类色彩感知的一个不错的代表。我在计算机视觉相关的应用程序中使用了很多,我对结果非常满意。
然而,执行这样的比较计算起来相当昂贵:RGB to XYZ
XYZ to LAB
Diff = DeltaE94(LABColor1,LABColor2)
公式(伪代码):
答案 2 :(得分:11)
人类感知的色度弱于强度。
例如,在商业视频中,YCbCr / YPbPr色彩空间(也称为Y'UV)降低了色度信息的分辨率,但保留了亮度(Y)。在数字视频压缩中,例如4:2:0和4:2:2会因感知相对较弱而降低色度比特率。
我相信你可以计算一个距离函数,它比亮度(Y)具有更高的优先级,而不是优先于色度的优先级。
此外,在低强度下,人类视觉实际上是黑白的。因此,优先级函数是非线性的,因为对于低亮度(Y),你对色度的权重越来越小。
答案 3 :(得分:7)
这里有关于色彩距离主题的精彩文章: 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));
}
答案 4 :(得分:3)
色彩感知不是欧几里德。任何距离公式都将同时足够好和可怕。任何基于欧几里德距离(RGB,HSV,Luv,Lab ......)的测量对于相似的颜色都是足够好的,显示aqua接近青色。但对于非近似值,它可以是任意的。例如,红色更接近绿色还是蓝色?
来自Charles Poynton的Color FAQ:
XYZ和RGB系统远非如此 表现出感性均匀性。 找到XYZ转换为 合理的感知统一空间 在CIE消费了十年或更长时间 最终没有一个系统可以 同意。
答案 5 :(得分:-4)
RGB立方体中的颜色相似性由欧氏距离测量(使用毕达哥拉斯公式)。
编辑:再想一想,大多数其他颜色空间也应如此。