Algorithm 匹配颜色的最佳算法。

Algorithm 匹配颜色的最佳算法。,algorithm,language-agnostic,graphics,Algorithm,Language Agnostic,Graphics,我有一个大约200个RGB格式的颜色阵列。我想写一个程序,采取任何RGB颜色,并试图匹配的颜色从阵列是最“相似” 我需要一个“相似”的好定义,它尽可能接近人类的感知 我还想展示一些关于匹配精度的信息。例如,黑白:100%,对于色调稍有不同的类似颜色:-4% 我需要使用神经网络吗?有更简单的选择吗 将所有颜色转换为颜色,并计算该空间中的距离 deltaE = sqrt(deltaL^2 + deltaA^2 + deltaB^2) 三角形最小的颜色在感知上最相似。不,这里不需要神经网络!简单地考

我有一个大约200个RGB格式的颜色阵列。我想写一个程序,采取任何RGB颜色,并试图匹配的颜色从阵列是最“相似”

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

我还想展示一些关于匹配精度的信息。例如,黑白:100%,对于色调稍有不同的类似颜色:-4%


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

将所有颜色转换为颜色,并计算该空间中的距离

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

三角形最小的颜色在感知上最相似。

不,这里不需要神经网络!简单地考虑HSL颜色值A向量,并定义向量的加权模函数,例如:

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%)

我还要指出方法,就像稍微简单一点的方法一样。也就是说,取一个数的差,求平方,然后求所有这些平方差的和。

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


我实现这一点的最快方法是将颜色添加到八叉树,然后,就像量化一样,使用每一位来引导您到最深的子节点。一旦你不能再深入了,要么你在最深的层次(最低的位),在这种情况下,你已经找到了确切的颜色,要么你需要的下一个子节点不存在——此时你只需要子节点的位与你正在搜索的位最接近,这就是你最接近的颜色。这比将所有内容转换为HSL和HSL或计算每一个欧几里德距离要快得多


下面是我在CodeProject上的代码:

问题是关于什么可能是好的相似性函数的建议,还是关于快速查找数组中与给定颜色最相似的颜色的算法?两者都有。如果首先我需要一些相似性的定义,然后才能尝试装箱算法。我认为“感知相似”是我想要的。谢谢,这正是我需要的。请记住,你不需要做sqrt-sqrt是一个递增函数,因此这一步是多余的。你是对的,如果你只做排序,距离的平方和距离本身一样好。如果你想比较“多么不同”,然后将其留在。CIE实验室正是以这种方式在所有主要的颜色管理系统中进行最接近的颜色计算,例如苹果、微软和Adobe的颜色管理系统。这是一个非常有趣的话题。根据你的经验,deltaE的低价值是什么?i、 当三角形小于14时,颜色在感知上是相似的。这是一个很好的简单选择。从RGB到HSL的转换比从RGB到实验室的转换简单得多:)Crimson,你能检查一下你的模数的数学吗?我认为这是不对的。你想要的东西更像
a*(H1-H2)**2+
…,是吗?@hobbs-最好计算两个模,然后比较它们,而不仅仅是计算差分向量的模,但你不想乘以两种不同颜色的色调等,是吗?嗨,我想知道你的意思是什么“找出你的模数所占的范围”?我们只是用abs(mod1-mod2)或其他方法比较两种颜色的模数,还是“找出范围?”“有什么不同的意思吗?在发布促进您自己工作的答案时,请非常小心。确保你在这里回答了问题,并且只使用你的博客/源作为备份和参考。目前,这可能被标记为垃圾邮件。