【问题标题】:Algorithm to check similarity of colors检查颜色相似性的算法
【发布时间】:2011-07-20 12:11:59
【问题描述】:

我正在寻找一种算法,它可以比较两种 RGB 颜色并生成它们的相似度值(其中相似度的意思是“相对于人类平均感知而言相似”)。

有什么想法吗?

编辑

由于我无法再回答,我决定将我的“解决方案”作为问题的编辑。

我决定在我的应用程序中使用(非常)小的真彩色子集,以便我可以自己处理颜色比较。我使用大约 30 种颜色并使用它们之间的硬编码距离。

因为它是一个 iPhone 应用程序,所以我使用了 Objective-C,其实现或多或少是一个代表下表的矩阵,它显示了颜色之间的距离。

【问题讨论】:

  • @Kai:我正在尝试实现同样的事情。你是使用 YUV 方法还是选择了另一种颜色空间和空间距离?
  • @Thariama 我决定在我的应用程序中使用(非常)小的真彩色子集,这样我就可以自己处理颜色比较。我使用大约 50 种颜色,并使用它们之间的硬编码距离。然而,从我阅读并尝试和测试的所有内容来看,使用 2^24 色 YUV 做得最好。
  • @Kai:非常感谢您让我知道您的决定及其原因。这意味着您正在使用 RGB 并使用 50 种颜色创建直方图并使用预定义的距离加速您的算法,对吗?你用什么语言来实现你的算法?
  • @Thariama 将其作为原始问题的编辑。
  • @Kai:非常感谢,可惜没有第二个“+1”按钮!

标签: algorithm colors comparison rgb


【解决方案1】:

RGB 立方体中的颜色相似度由欧几里德距离测量(使用毕达哥拉斯公式)。

编辑:再想一想,大多数其他色彩空间也应该如此。

【讨论】:

  • 不,RGB 空间中的欧几里得距离与人眼感知颜色差异的方式不对应。这就是创建像 Lab 这样的色彩空间的全部原因。
  • 没有。欧几里得距离是在任何笛卡尔空间中测量距离的一种方法。它测量距离,而不是相似度!现在您可以选择欧几里得距离和相似性排序重合的不同向量空间(如 cie 或 yuv),或者使用不同的度量。但是 rgb+euclidean 并没有给出令人满意的结果。
  • 我也是这么想的,但随后打开一个颜色数量有限的绘图程序(例如 adobe flash,具有 216 个预设默认调色板),然后将该公式进行测试,您会感到失望非常非常快,当你明显需要棕色时会变黄,等等。
【解决方案2】:

euclidean space 中的RGB distance 与“人类平均感知”不太相似。

你可以使用YUV色彩空间,它考虑到了这个因素:

 |  Y' |     |  0.299     0.587    0.114   | | R |
 |  U  |  =  | -0.14713  -0.28886  0.436   | | G |
 |  V  |     |  0.615    -0.51499 -0.10001 | | B |

您也可以为此使用CIE 色彩空间。

编辑:

我要提到YUV 颜色空间是一种廉价的近似值,可以通过简单的公式计算。但它在感知上并不统一。感知一致意味着颜色值的相同量的变化应该产生大约相同的视觉重要性的变化。 如果您需要更精确和严格的指标,您一定要考虑CIELAB 色彩空间或另一个感知统一的空间(即使没有简单的转换公式)。

【讨论】:

  • 谢谢!然后我可以使用 Y'UV 值的欧几里得空间距离吗?
  • 当然,但您也可以使用其他距离。
  • 很可能您只想计算 UV 分量之间的欧几里德距离,因为 Y' 是亮度分量。
  • 任何人都可以引用 YUV 中的欧几里得距离反映人类对差异的感知这一说法的来源吗?
  • @Bill 它没有。请参阅此处的“结果”部分:compuphase.com/cmetric.htm
【解决方案3】:

人类感知的色度比强度弱。

例如,在商业视频中,YCbCr/YPbPr 颜色空间(也称为 Y'UV)会降低色度信息的分辨率,但会保留亮度 (Y)。在 4:2:0 和 4:2:2 等数字视频压缩中,由于感知相对较弱,会降低色度比特率。

我相信您可以计算出一个距离函数,它的优先级高于亮度 (Y),而优先级低于色度。

此外,在低强度下,人类的视觉实际上是黑白的。因此,优先级函数是非线性的,因为对于低亮度 (Y),您对色度的权重越来越少。

更多科学公式:http://en.wikipedia.org/wiki/Color_difference

【讨论】:

    【解决方案4】:

    颜色感知不是欧几里得。任何距离公式都会同时足够好和可怕。任何基于欧几里得距离(RGB、HSV、Luv、Lab 等)的度量对于相似的颜色来说都足够好,表明浅绿色接近蓝绿色。但是对于非关闭值,它变得任意。例如,红色更接近绿色还是更接近蓝色?

    来自 Charles Poynton 的Color FAQ

    XYZ 和 RGB 系统远非 表现出感知上的一致性。 寻找 XYZ 到 a 的变换 合理感知均匀的空间 在 CIE 消费了十年或更长时间 最终没有一个系统可以 同意。

    【讨论】:

    • 谢谢。这是一个很棒的、有趣的链接。对我来说,判断红色更接近绿色还是蓝色并不重要,但浅灰色更接近白色然后是浅红色,我希望(但还不确定)YUV 能做到。
    【解决方案5】:

    我建议使用CIE94 (DeltaE-1994),据说它可以很好地代表人类的颜色感知。我在我的计算机视觉相关应用程序中使用了它很多次,我对结果很满意。

    然而,执行这种比较的计算成本相当高:

    1. RGB to XYZ 两种颜色
    2. XYZ to LAB 两种颜色
    3. Diff = DeltaE94(LABColor1,LABColor2)

    公式(伪代码):

    【讨论】:

    • 由于使用了 CIELAB 色彩空间,我更喜欢这种方法,谢谢。
    • XYZ 到实验室,如“Hunter-Lab”?
    • 没关系...我可以看到 Delta E 1994 使用 CIE-L*ab 值
    【解决方案6】:

    这里有一篇关于颜色距离主题的精彩文章: http://www.compuphase.com/cmetric.htm

    如果资源消失,作者的结论是,使用此公式(在 C 代码中)可以实现两种 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));
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 2017-11-09
      • 2014-11-14
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      相关资源
      最近更新 更多