2

我有一个 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))** )

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

4

2 回答 2

6

这实际上比你想象的复杂得多。因为许多的原因。

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

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

考虑到这些附带条件,Delta CIE 94 是衡量颜色相似度的一个不错的指标。

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

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

由于这一切都相对痛苦,因此您可能会更好地调用适当的色彩管理工具,例如LCMS

于 2012-09-26T08:13:04.750 回答
0

这比你想象的要复杂一些。您需要从 RGB → XYZ → LAB → LCH 进行转换,然后才能应用 CIE94 公式。看看 Chroma.js 中的实现并将你需要的部分移植到 Ruby:

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

于 2012-09-25T22:39:47.217 回答