我正在为一个网站工作,用户可以使用rgb 0-255范围内的任何颜色来描述物理对象。我们提供了一些简化的调色板以方便点击,但完整的颜色轮是必需的。
在幕后,其中一个过程比较了物体的两个用户描述,并对它们进行相似性评分。
我尝试的是得到一个指标来衡量两种颜色在“人类感知”的角度下有多相似。基本上,算法需要确定如果两个人选择两个不同的颜色是否可能在描述同一个物体。因此,浅红->红应该是100%,大多数灰色调之间也会是100%,等等,但是红色->绿色绝对不匹配。
为了更好地了解算法的工作原理,我将灰度和每种色调的3个强度与集合中的每个其他颜色相比,并用黑色表示不匹配(0%),用白色表示视觉上相同(100%),用灰度表示中间值。
我的第一种(非常简单的)方法是将RGB值视为颜色立方体中的坐标,并计算它们之间的距离(向量的大小)。
这引出了许多问题,例如黑色->50%灰色的距离比(例如)黑色->50%蓝色的距离更大。经过数百次比较并要求反馈,这似乎与人类感知不符(如下所示)
方法2将RGB值转换为HSV。然后我基于80%的色调和其他20%的Sat / Lum生成得分。到目前为止,这似乎是最好的方法,但仍然会出现一些奇怪的匹配。
方法3是一个混合尝试-计算了HSL值,但最终得分基于两种颜色在HSL颜色圆柱空间中(即3D极坐标)之间的距离。
我感觉自己必须重新发明轮子,肯定有人做过这个事情吧?我在Google上找不到任何好的例子,正如你所看到的,我的方法还需要改善。
因此,我的问题是:
有没有标准的方法来做到这一点?如果有,怎么做?如果没有,有人能提出一个改进我的方法的方式吗?如果需要,我可以提供代码片段,但要注意,由于调整了3天,它目前非常混乱。
解决方案(Delta E 2000):根据下面提供的建议,我已经实现了一个 Delta E 2000
比较器。我不得不调整权重值相当大 - 我不是在寻找颜色在视觉上几乎没有区别的东西,而是那些不太相似的颜色。如果有人感兴趣,下面是结果图...