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

RMc*_*irn 2 ruby math rgb

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

根据我的收集,实施此类检查的最准确方法之一是使用CIE94公式.但是,我在使用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))** )
Run Code Online (Sandbox Code Playgroud)

根据其中一个建议使用LCMS的建议,我刚刚意识到RMagick(Imagemagick)我正在使用的ruby库,实际上是在拉入LCMS.这意味着我可以访问某些功能 - "预先烘焙".有人知道使用RMagick实现上述方法吗?

Mic*_*son 6

这实际上是一个很多更棘手比你想象.因为许多的原因.

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

第二个问题是两种颜色之间差异的感知在很大程度上取决于周围的颜色/观看环境.即,在黑暗环境中的黑暗环境中观看时,两种颜色可能看起来不同,但在光环境中的白色环境中类似.

考虑到这些附带条件,Delta CIE 94是一种很好的颜色相似度量.

您可以通过将每种颜色从RGB转换为XYZ然后转换为Lab来计算它.RGB到XYZ的转换取决于设备 - 有一些简单的标准转换,例如sRGB,但它们对真实设备的适用性值得怀疑.从XYZ到Lab的转换很复杂,可以在这里找到- 为了您的参考白点,您可以使用设备的白点(如果您使用标准,则使用sRGB).

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

由于这一切都相当痛苦,你可能会更好地呼唤一个像LCMS这样的合适的色彩管理工具