【发布时间】:2011-04-25 00:28:41
【问题描述】:
我正在开发一个网站,用户可以在该网站上使用 rgb 0-255 范围内的任何颜色(以及许多其他内容)来描述物理对象。我们提供了一些简化的调色板以便于点击,但需要一个完整的色轮。
在幕后,其中一个过程比较对象的两个用户描述并对它们的相似性进行评分。
我想要做的是获得 2 种颜色在人类感知方面的相似程度 的分数。基本上,该算法需要确定 2 个人选择 2 种不同颜色是否可以描述同一个对象。因此浅红色->红色应该是 100%,大多数灰色阴影将是 100%,等等,但是红色->绿色绝对不匹配。
为了更好地了解算法的工作原理,我绘制了灰度和每种色调的 3 种强度与集合中所有其他颜色的对比图,并指出黑色不匹配 (0%),视觉上与白色相同 (100%)和灰度表示中间值。
我的第一个(非常简单的方法)是将 RGB 值简单地视为颜色立方体中的坐标,并计算出它们之间的距离(矢量的大小)。
这抛出了一些关于黑色->50% 灰色比(例如)黑色->50% 蓝色的距离更大的问题。经过数百次比较并征求反馈,这似乎与人类感知不符(如下所示)
方法 2 将 RGB 值转换为HSV。然后,我生成了一个基于色调的 80% 的分数,另外 20% 的 Sat/Lum。这似乎是迄今为止最好的方法,但仍然会引发一些奇怪的匹配
方法 3 是一种混合尝试 - 计算了 HSL 值,但最终得分基于 HSL 颜色圆柱空间中两种颜色之间的距离(如 3D 极坐标)。
我觉得我必须重新发明轮子——这肯定以前做过吗?我在谷歌上找不到任何像样的例子,你可以看到我的方法还有一些不足之处。
所以,我的问题是:
有没有标准的方法来做到这一点?如果是这样,怎么做?如果没有,任何人都可以提出一种改进我的方法的方法吗?如果需要,我可以提供代码 sn-ps,但请注意,由于 3 天的调整,它目前非常混乱。
解决方案(Delta E 2000):
使用下面提供的建议,我实现了一个Delta E 2000 比较器。我不得不将权重值调整得相当大——我不是在寻找难以察觉但差别不大的颜色。如果有人感兴趣,结果图如下...
【问题讨论】:
-
您正在比较的颜色 - 它们来自图像,还是用户查看图像并选择具有代表性的颜色?我不清楚您是在比较数千/数百万像素值,还是少数用户选择的颜色......
-
我正在比较 2 位用户选择的颜色来表示他们都见过的物理对象(其中一个人面前有这个对象,其中一个人以前见过它)。上面的图表是为了让我对算法输出有一点了解,所以我选取了一系列颜色,并将每种颜色与该范围内的所有其他值进行比较并绘制结果。
-
澄清一下:实际上,系统允许每个用户在需要时选择多种颜色,但是使用相同的算法来比较所有颜色组合,并在计算时采用最佳的唯一匹配集最终分数 - 我认为这是一个超出理解问题所需的复杂程度,但可能很有趣:)
-
是的,那个有点复杂! en.wikipedia.org/wiki/…
-
非常有用的帖子!感谢您的解决方案 - 是否有代码的 github 存储库?
标签: algorithm .net-4.0 colors comparison