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

如何使用CIE94公式将单个RGB值与集合进行比较,以找到最接近的匹配项-在Ruby中,,ruby,math,rgb,Ruby,Math,Rgb,我有一个RGB值,我想从120种颜色的集合中找到与该RGB值最接近的匹配 据我所知,实施此类检查的最准确方法之一是使用。 然而,我在使用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)

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

据我所知,实施此类检查的最准确方法之一是使用。 然而,我在使用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实现上述目标的方法吗?

这比您预期的要复杂一些。您需要转换为从RGB转换→ XYZ→ 实验室→ LCH,然后才能应用CIE94公式。查看Chroma.js中的实现,并将您需要的部分移植到Ruby:

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

主要问题是RGB空间是设备相关的空间-在一个设备上看起来相似的RGB值在另一个设备上不必看起来相似。(如果您认为这听起来不太可能-由于操作系统对monitor gamma的不同假设,在mac/win/SGI之间获得良好的颜色对应关系有着巨大的历史问题。)

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

考虑到这些限制条件,Delta CIE 94是颜色相似性的一个合理度量

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

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


因为这都是相对痛苦的,所以您可能会更幸运地调用适当的颜色管理工具,如

,作为显示所编写代码的第一步。对我们来说,更正代码要比从头开始编写代码容易得多。没问题,我通过帖子更新了我的代码。你完成了这个剪贴了吗,因为如果你完成了,我可以使用它!这是一个极好的答案,正是我想要的。谢谢你花时间把它整理好。+1回答得很好。多年来,我一直对你的一些观点大喊大叫,因为业余摄影师不了解色彩空间、环境和参考点的问题。作为一个快速的跟进,我得到了很好的转换,它似乎匹配得很好。再次感谢。