寻找最近的 RGB 颜色

Posted

技术标签:

【中文标题】寻找最近的 RGB 颜色【英文标题】:Finding nearest RGB colour 【发布时间】:2011-05-09 10:55:33 【问题描述】:

有人告诉我使用距离公式来查找颜色是否与另一种颜色匹配,所以我有,

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.

【问题讨论】:

【参考方案1】:

请注意,最大可能距离在 (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

【讨论】:

最大距离当然是 sqrt(3 * 255^2)。我认为 25% 的匹配应该意味着差异不超过整个范围的 1/4。所以最终的公式应该是:距离 @cababunga:sqrt 是对的,我忽略了这一点,因为 OP 没有将它包含在他的等式中。但是,“至少 25% 匹配”仍然意味着任何小于 75% 的距离,因为更多的距离意味着更少的匹配。【参考方案2】:

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

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

【讨论】:

其实是lab空间是基于人类的解释【参考方案3】:

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

1-范数或“曼哈顿距离”:距离 = abs(r1-r2) + abs(g1-g2) + abs(b1-b2) 2-范数或欧几里得距离: distance = sqrt(pow(r1-r2, 2) + pow(g1-g2, 2) + pow(b1-b2, 2)) (计算它的平方,即很好 - 如果您只是检查阈值,也可以通过平方阈值来避免 sqrt) 无穷范数:距离 = max(abs(r1-r2), abs(g1-g2), abs(b1-b2))

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

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

【讨论】:

我的意思是用户定义的颜色与预定义的颜色至少匹配 25%。

以上是关于寻找最近的 RGB 颜色的主要内容,如果未能解决你的问题,请参考以下文章

寻找具有不透明度的“等效”颜色

在 C 中从 HEX 颜色转换为 RGB 结构

如何将 RGB 或 HEX 颜色代码分组为更大的颜色组?

将像素转换为颜色

在 XCode 4.2 中找不到使用 RGB 或十六进制设置视图颜色的选项

PHP中颜色之间的“距离”