给定RGB值,在数据库中找到最接近匹配的最佳方法是什么?

Mik*_*ike 25 sql algorithm colors

我有一个rgb值,如果它在我的数据库的颜色表中不存在,我需要找到最接近的颜色.我正在考虑比较所有值并找出差异(红色,绿色和蓝色)然后取平均值.最低的平均偏差应该是最接近的颜色.在我看来应该有一个更好的方法.有任何想法吗?

ang*_*son 69

将颜色视为三维空间中的矢量,然后可以使用3d毕达哥拉斯轻松计算差异:

d = sqrt((r2-r1)^2 + (g2-g1)^2 + (b2-b1)^2)
Run Code Online (Sandbox Code Playgroud)

但请注意,由于颜色会被不太完美的眼睛解释,您可能需要调整颜色以避免它们具有相同的重要性.

例如,使用典型的加权方法:

d = sqrt(((r2-r1)*0.3)^2 + ((g2-g1)*0.59)^2 + ((b2-b1)*0.11)^2)
Run Code Online (Sandbox Code Playgroud)

由于眼睛对绿色最敏感,而对蓝色最不敏感,因此只有蓝色成分不同的两种颜色必须具有更大的数值差异才能被认为与绿色成分中相同数值差异的数字差异"更不同".

还有各种方法可以优化此计算.例如,由于您对实际d值并不感兴趣,因此您可以省去平方根:

d =   ((r2-r1)*0.30)^2
    + ((g2-g1)*0.59)^2
    + ((b2-b1)*0.11)^2
Run Code Online (Sandbox Code Playgroud)

请注意,在许多基于C语法的编程语言(如C#)中,^并不意味着"提高功率",而是"二进制独占或".

因此,如果这是C#,您将用于Math.Pow计算该部分,或者只是展开并进行乘法运算.

补充:根据维基百科上的色差页面判断,有各种标准试图处理感知差异.例如,名为CIE94的那个使用不同的公式,在L*C*h颜色模型中看起来值得研究,但这取决于您希望它的准确程度.

  • 像这样的答案总是让人高兴的阅读. (5认同)

Wil*_*ill 5

欧几里得距离 difference = sqrt(sqr(red1 - red2) + sqr(green1 - green2) + sqr(blue1 - blue2))是确定两种颜色相似度的标准方法。

但是,如果您的颜色位于一个简单的列表中,那么要找到最接近的颜色,需要计算列表中每种颜色与新颜色的距离。这是一个 O(n) 操作。

sqrt()是一项昂贵的操作,如果您只是比较两个距离,那么您可以简单地省略sqrt().

如果您有一个非常大的调色板,将颜色组织到kd 树(或替代方案之一)中可能会更快,从而减少需要计算的差异数量。