2010-11-13 165 views
5

我被告知使用距离公式找到,如果颜色匹配,另一个让我有,查找最近的RGB颜色

struct RGB_SPACE 
{ 
    float R, G, B; 
}; 

RGB_SPACE p = (255, 164, 32); //pre-defined 
RGB_SPACE u = (192, 35, 111); //user defined 

long distance = static_cast<long>(pow(u.R - p.R, 2) + pow(u.G - p.G, 2) + pow(u.B - p.B, 2)); 

此只给出一个距离,但我怎么知道,如果颜色匹配用户定义至少25%?

我不是很确定,但我有一个想法,检查每个颜色值,看看差异是否是25%。例如。

float R = u.R/p.R * 100; 
float G = u.G/p.G * 100; 
float B = u.B/p.B * 100; 

if (R <= 25 && G <= 25 && B <= 25) 
{ 
    //color matches with pre-defined color. 
} 

回答

7

我会建议不要检查RGB空间。如果你有(0,0,0)和(100,0,0),它们根据cababungas公式(以及根据认为太多颜色相似的卡萨布兰卡公式)是相似的。但是,他们看起来很不一样。

HSL and HSV颜色模型基于人类对颜色的解释,然后您可以轻松地指定相互独立的色调,饱和度和亮度距离(取决于您的情况中“相似”的含义)。

+0

实际上是[lab](http://en.wikipedia。org/wiki/Lab_color_space)基于人类解释的空间 – zenpoy 2012-03-05 15:18:21

2

注意,最大可能距离是(255,255,255)之间以及(0,0,0),这是在3 * 255^2的距离。很显然,这两种颜色最少匹配(0%匹配),它们的距离是100%。那么至少25%的匹配意味着小于75%的距离,即3/4 * 3 * 255^2 = 9/4 * 255 * 255。所以你可以检查是否:

distance <= 9/4 * 255 * 255 
+0

最大距离当然是sqrt(3 * 255^2)。我认为,25%的比赛意味着差距不应超过整个范围的1/4。所以最终的公式应该是:距离<= sqrt(3)/ 4 * 255. – cababunga 2010-11-13 07:56:16

+0

@cababunga:对于'sqrt',我忽略了,因为OP没有在他的等式中包含它。然而,“至少25%的匹配”仍然意味着任何小于75%的距离,因为更多的距离意味着更少的匹配。 – casablanca 2010-11-13 16:07:20

4

“匹配至少25%”不是一个明确定义的问题。根据什么度量匹配至少25%的内容?有很多可能的选择。如果比较RGB颜色,那么显而易见的就是从矢量规范导出的距离度量。三个最重要的有:

  • 1范数或 “曼哈顿距离”:距离= ABS(R1-R2)+ ABS(G1-G2)+ ABS(B1-B2)
  • 2-范数或欧几里德距离:距离= sqrt(pow(r1-r2,2)+ pow(g1-g2,2)+ pow(b1-b2,2))(你计算这个的平方,这很好 - 你可以避免如果你只是通过检查阈值来检查sqrt,则通过将阈值平方)
  • 无穷范数:距离=最大(abs(r1-r2),abs(g1-g2),abs(b1-b2))

当然,还有很多其他的可能性。您可以检查它们是否在彼此的一定距离内:如果您希望在一个颜色通道中允许高达25%的差异(在可能的RGB值范围内),则用于3种方法的阈值为3/4 * 255,sqrt(3)/ 4 * 255和255/4。尽管这是一个非常粗糙的指标。

测量颜色之间距离的更好方法是将您的颜色转换为感知均匀的颜色空间,如CIELAB并在那里进行比较;关于这个问题,还有一个相当不错的Wikipedia article。这可能是矫枉过正,取决于您的预期应用,但那些色彩空间的测量距离与人类视觉系统感知的距离具有最佳相关性。

+0

+1。你回答自己的一个好问题! – augustin 2010-11-13 09:25:50

+0

我的意思是用户定义的颜色至少与预定义的颜色相匹配25%。 – user963241 2010-11-13 10:08:34