找到阵列中最接近颜色的最佳算法是什么?

Eri*_*ric 19 algorithm colors

我从传感器读取颜色(RGB).我还有一个"已知"颜色列表,每个颜色都与一个字符串名称配对.

什么是最好的方式(即表现得像人类选择颜色)从这个列表中拉出最近颜色的名称?

我用RGB测试了最短的笛卡尔距离,但这使得灰色更接近绿色而不是黑色或白色.

Jon*_*eet 21

而不是使用RGB,尝试使用HSL(色调,饱和度,亮度)或HSV(色调,饱和度和值)颜色模型.然后尝试不同的偏差元素,例如,当计算距离时,色调比亮度更重要.

  • 此外,如果它可以帮助其他人...我在我的应用程序中找到了最好的结果,给予HUE 47.5%的重要性,SATURATION的重要性为28.75%,BRIGHTNESS的重要性为23.75%. (5认同)
  • HSV和HSL可能比RGB更好,但最好的方法是转换到LAB颜色空间,然后使用现有的标准颜色比较之一(CIE1976,CIE94,CIEDE2000)计算"delta-e".我最近在.NET上找到了[ColorMine](http://colormine.org/)库,这使得一切都变得轻而易举. (3认同)

Sou*_*ity 7

Jon Skeet是对的.如果您担心匹配的颜色分量差异太大,则需要使用具有Hue作为组件而不是RGB的系统.HSL或HSV都可以正常工作.

然后你需要调整距离公式来增加色调,直到你对结果感到满意为止.请注意,除非您有大量颜色要匹配,否则您会发现问题实际上是不可解决的,或者您的输入颜色仅限于一小部分可能的值.这是因为虽然看起来你可以将你想要的任何颜色(8,红色,橙黄色,绿色,蓝色,紫色,黑色和白色)或16个中的一个固定,实际上你会发现你的算法总能找到什么似乎是明显不正确的匹配因为3轴运动(色调,饱和度,值或红色,绿色,蓝色),有比你乍看之下更多的"基本"颜色.

  • 取决于"最接近"的含义.原始代码中的RGB RMS错误最接近灰色.这是错的吗?鉴于你说是,你显然是基于颜色感知强加一些其他最接近的想法.而且我告诉你会发现你对结果并不满意,直到你有64种精心挑选的颜色可以匹配.至少对人眼来说.您提供的代码应该用于比较4个预定的斑点,假设斑点看起来不像彼此太多. (2认同)