检查颜色相似性的algorithm
我正在寻找一种algorithm来比较两种RGB颜色并生成它们相似性的值(其中相似性意味着“与人类平均感觉相似”)。
有任何想法吗?
编辑 :
由于我不能回答,我决定把我的“解决scheme”作为编辑的问题。
我决定在我的应用程序中使用一个非常小的真彩色子集,以便我可以自己处理颜色的比较。 我使用约30种颜色,并使用硬编码的距离。
由于这是一个iPhone应用程序,我用Objective-C工作,实现或多或less是一个matrix代表下面的表格,它显示了颜色之间的距离。
欧几里德空间中的RGB距离不是非常“类似于人类的感知”
你可以使用YUV色彩空间,它考虑到这个因素:
您也可以为此使用CIE色彩空间。
编辑:
我会提到YUV色彩空间是一个便宜的近似值,可以通过简单的公式计算出来。 但是它不是统一的。 感知均匀意味着颜色值相同量的变化应该产生大约相同视觉重要性的变化。 如果您需要更精确和更严格的衡量指标,则必须考虑CIELAB色彩空间或另一个感知上均匀的空间(即使没有简单的转换公式)。
人类感知色度比强度弱。
例如,在商业video中,YCbCr / YPbPr色彩空间(也称为Y'UV)降低了色度信息的分辨率,但保留了亮度(Y)。 在诸如4:2:0和4:2:2的数字video压缩中,由于相对较弱的感知,降低了色度比特率。
我相信你可以计算一个比亮度(Y)更高优先级的距离函数,而不是色度优先级。
而且,在低强度下,人类的视觉几乎是黑白的。 因此,优先级函数是非线性的,因为对于低亮度(Y),色度的权重越来越小。
更科学的公式: http : //en.wikipedia.org/wiki/Color_difference
我build议使用CIE94 (DeltaE-1994),据说它是人类色彩感知的体面代表。 我在计算机视觉相关的应用程序中使用过它,我对结果感到非常满意。
然而执行这样的比较在计算上是相当昂贵的:
-
RGB to XYZ
两种颜色 -
XYZ to LAB
两种颜色 -
Diff = DeltaE94(LABColor1,LABColor2)
公式(伪代码):
- 颜色转换公式: http : //www.easyrgb.com/? X= MATH
- Delta-E公式: http : //www.easyrgb.com/index.php? X= DELT
颜色感知不是欧几里得。 任何距离公式在同一时间将是既好又可怕。 基于欧几里得距离(RGB,HSV,Luv,Lab,…)的任何测量对于相似的颜色都是足够好的,显示水色接近青色。 但是对于非接近的值来说,它是任意的。 例如,红色接近绿色还是蓝色?
来自Charles Poynton的彩色常见问题解答 :
XYZ和RGB系统远没有performance出感知的一致性。 发现XYZ向合理的感知均匀空间的转变在CIE上消耗了十年甚至更长的时间,最终没有一个单一的系统可以达成共识。
这里有一个很好的关于色距问题的文章: 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)); }
RGB立方体中的颜色相似性通过欧几里得距离(使用毕达哥拉斯公式)来测量。
编辑:第二个想法,这也应该是大多数其他的色彩空间也是如此。