匹配颜色的最佳算法。

时间:2009-11-05 05:08:00

标签: algorithm language-agnostic graphics

我有一个大约200种RGB格式的数组。我想编写一个采用任何RGB颜色的程序,并尝试匹配最“相似”的数组中的颜色。

我需要一个很好的“相似”定义,它尽可能接近人类的感知。

我还想展示一些有关匹配准确性的信息。例如,黑白:100%,并且对于具有略微不同色调的类似颜色:-4%。

我需要使用神经网络吗?有更简单的选择吗?

5 个答案:

答案 0 :(得分:36)

将所有颜色转换为CIE Lab color space并计算该空间中的距离

deltaE = sqrt(deltaL^2 + deltaA^2 + deltaB^2)

具有最低deltaE的颜色在感知上彼此最相似。

答案 1 :(得分:4)

不,你这里不需要神经网络!只需将HSL颜色值视为矢量,并为矢量定义加权模数函数,如下所示:

modulus = sqrt(a*H1*H1 + b*S1*S1 + c*L1*L1);

where a,b,c are weights you should decide based on your visual definition of what
creates a bigger difference in perceived color - a 1% change in Hue or a 1%
change in Saturation

我建议你使用a = b = 0.5和c = 1

最后,找出你的模数所需的范围,并定义相似的颜色,使它们的模量彼此非常接近(比如说5%)

答案 2 :(得分:1)

我还会指出least squares方法,就像稍微简单一些。也就是说,你取一个数字的差值,将其平方,然后将所有这些平方差异相加。

答案 3 :(得分:0)

我一直在寻找这个东西但是没有找到很多答案我决定创建这个小库。

https://github.com/sebastienjouhans/c-sharp-colour-utilities

答案 4 :(得分:0)

我实现这一目标的最快方法是将颜色添加到八叉树,然后,就像量化一样,您使用每个位来引导您进入最深的子节点。一旦你不能更深入,你要么处于最深层次(最低位),在这种情况下你已经达到了确切的颜色,或者你需要的下一个子节点不存在 - - 这一点你只需要孩子的位置最接近你正在寻找的位,这是你最接近的颜色。比将所有内容转换为HSL并返回或计算每个欧几里德距离要快得多。

这是我在CodeProject上的代码:https://www.codeproject.com/tips/1046574/octtree-based-nearest-color-search