代码之家  ›  专栏  ›  技术社区  ›  RMcNairn

我如何使用CIE94公式将单个RGB值与集合进行比较,以找到最接近的匹配——在Ruby中,

  •  2
  • RMcNairn  · 技术社区  · 12 年前

    我有一个RGB值,我想从120种颜色的集合中找到最接近该RGB值的匹配。

    据我所知,实现这种检查的最准确方法之一是使用 CIE94 formula 。 然而,我在使用Ruby实现这一点时遇到了问题。

    你建议我怎么做?

              R1, G1, B1 = pixel.red, pixel.green, pixel.blue
              c = Colour.first
                  R2, G2, B2 = (c.red * 256), (c.green * 256), (c.blue * 256)
    
                  C1 = Math.sqrt((G1**)+(G2**))
                  C2 = Math.sqrt((B1**)+(B2**))
                  CAB = C1 - C2
    
                  DA = G1 - G2
                  DB = B1 - B2
    
                  DH = Math.sqrt((DA** + DB** - CAB**))
    
                  divergence = Math.sqrt( ((R1-R2)/2)** + (CAB/ (1+(0.048*C1)))** + ( DH / ( 1 + ( 0.014 * C1))** )
    

    按照其中一个答案建议使用LCMS,我刚刚意识到我正在使用的ruby库RMagick(Imagemagick)实际上引入了LCMS。这意味着我可能可以访问其中的一些功能——“预烘焙”。有人知道使用RMagick实现上述目标的方法吗?

    2 回复  |  直到 12 年前
        1
  •  6
  •   the Tin Man    12 年前

    这实际上是一个 大量 比你想象的更棘手。原因有很多。

    主要问题是RGB空间是一个依赖于设备的空间——在一个设备上看起来相似的RGB值在另一个设备中不必看起来相似。(如果你认为这听起来不太可能——由于操作系统对监视器gamma的不同假设,在mac/win/SGI之间获得良好的颜色对应关系之间存在大量问题。)

    第二个问题是,对两种颜色之间差异的感知在很大程度上取决于周围的颜色/观看环境。也就是说,两种颜色在黑暗环境中的黑暗环境中看起来可能不同,但在明亮环境中的白色环境中看起来相似。

    考虑到这些前提条件,ΔCIE 94是颜色相似性的适当度量。

    您将通过将每种颜色从RGB转换为XYZ,然后再转换为Lab来计算它。 RGB到XYZ的转换取决于设备——有一些简单的标准转换,例如 sRGB ,但它们对实际设备的适用性值得怀疑。从XYZ到Lab的转换是复杂的,可以找到 here -对于你的参考白点,你会使用你的设备的白点(或者sRGB,如果你使用的是标准)。

    最后,您可以使用上面列出的公式来进行最后的转换。

    由于这一切都是相对痛苦的,你可能会更幸运地求助于一个合适的颜色管理工具,比如 LCMS

        2
  •  0
  •   methodofaction    12 年前

    这比你想象的要复杂一些。您需要转换以从RGB XYZ LAB LCH和 只有 则可以应用CIE94公式。看看Chroma.js中的实现,并将您需要的部分移植到Ruby:

    https://github.com/gka/chroma.js