Algorithm 颜色相似性检查算法

Algorithm 颜色相似性检查算法,algorithm,colors,comparison,rgb,Algorithm,Colors,Comparison,Rgb,我正在寻找一种算法,它可以比较两种RGB颜色,并生成它们的相似性值(其中相似性表示“与人类的平均感知相似”) 有什么想法吗 编辑: 因为我不能再回答了,我决定把我的“解决方案”作为问题的编辑 我决定在我的应用程序中使用一个(非常)小的真彩色子集,这样我就可以自己处理颜色的比较了。我使用大约30种颜色,并使用它们之间的硬编码距离 因为它是一款iPhone应用程序,所以我使用objective-C,它的实现或多或少是一个表示下表的矩阵,显示了颜色之间的距离 RGB立方体中的颜色相似性通过欧几里德距离

我正在寻找一种算法,它可以比较两种RGB颜色,并生成它们的相似性值(其中相似性表示“与人类的平均感知相似”)

有什么想法吗

编辑

因为我不能再回答了,我决定把我的“解决方案”作为问题的编辑

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

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


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

编辑:再想一想,大多数其他颜色空间也是如此。

中的颜色空间与“人类的平均感知”不太相似

您可以使用颜色空间,它考虑了以下因素:

 |  Y' |     |  0.299     0.587    0.114   | | R |
 |  U  |  =  | -0.14713  -0.28886  0.436   | | G |
 |  V  |     |  0.615    -0.51499 -0.10001 | | B |
您也可以将颜色空间用于此目的

编辑:

我要提到的是,颜色空间是一种廉价的近似值,可以通过简单的公式来计算。但它在感知上并不一致。感知一致意味着颜色值中相同数量的变化应产生视觉重要性大致相同的变化。
如果你需要一个更精确和严格的度量,你必须明确地考虑颜色空间或另一个感知均匀的空间(即使没有简单的转换公式)。 例如,在商业视频中,YCbCr/YPbPr颜色空间(也称为Y'UV)降低了色度信息的分辨率,但保留了亮度(Y)。在数字视频压缩中,如4:2:0和4:2:2,由于感知能力相对较弱,降低了色度比特率

我相信你可以计算出一个距离函数,它比亮度(Y)优先级高,比色度优先级低

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


更科学的公式:

颜色感知不是欧几里得的。任何一个距离公式都将同时是好的和糟糕的。任何基于欧几里德距离的测量(RGB、HSV、Luv、Lab等)都足以用于相似的颜色,显示水接近蓝绿色。但对于非闭合值,它是任意的。例如,红色更接近绿色还是蓝色

摘自查尔斯·波因顿的:

XYZ和RGB系统远远不是 表现出知觉上的一致性。 求XYZ到a的变换 合理感知一致空间 在CIE消费了十年或更长时间 最终,没有一个单一的系统能够做到这一点 同意

我建议使用(DeltaE-1994),据说这是人类颜色感知的一个不错的表现。我已经在我的计算机视觉相关应用程序中使用了很多,我对结果相当满意

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

  • 两种颜色的RGB到XYZ
  • XYZ到实验室
    两种颜色
  • Diff=DeltaE94(LABColor1、LABColor2)
  • 公式(伪代码):

    • 颜色转换公式:
    • Delta-E公式:

      • 这里有一篇关于颜色距离的精彩文章:

        如果资源消失,作者的结论是,使用此公式(在C代码中)可以获得两种RGB颜色之间距离的最佳低成本近似值


        非常感谢。我可以用Y'UV值的欧几里得空间距离吗?当然可以,但你也可以使用其他距离。你很可能只想计算UV分量之间的欧几里德距离,因为Y'是luma分量。有人能举出一个来源来证明YUV中的欧几里德距离反映了人类对差异的感知吗?@Bill it没有。请参阅此处的“结果”部分:谢谢。这是一个非常有趣的链接。就我而言,判断红色是接近绿色还是蓝色并不重要,但浅灰色比浅红色更接近白色,我希望(但目前还不确定)YUV能做到。不,RGB空间中的欧几里德距离与人眼感知颜色差异的方式不符。这就是创建像Lab这样的颜色空间的全部原因。不。欧几里德距离是在任何笛卡尔空间中测量距离的一种方法。它衡量的是距离,而不是相似性!现在,您可以选择一个不同的向量空间(如cie或yuv),其中欧几里德距离和相似性排序重合,或者使用不同的度量。但rgb+欧几里得并没有给出令人满意的结果。我也这么想,但随后打开了一个有限颜色的绘图程序(例如adobe flash,带有216个预设默认调色板),并对该公式进行测试,你很快就会失望,当你明显需要棕色时,会得到黄色,等等。@Kai:我也在努力实现同样的事情。你是使用YUV方法还是选择了另一种颜色空间和空间距离?@Thariama我决定在我的应用程序中使用(非常)小的真彩色子集,这样我就可以自己处理颜色比较。我使用大约50种颜色,并使用它们之间的硬编码距离。然而,从我阅读、尝试和测试的所有内容来看,YUV在使用2^24颜色时做得最好。@Kai:非常感谢您让我知道您的决定及其原因。这意味着你正在使用RGB,使用50种颜色创建直方图,并使用预定义的距离加速你的算术运算,对吗?你用什么语言来实现你的算法?@Thariama将其作为o中的一个编辑
        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));
        }