RGB颜色空间到原始颜色名称的映射

2022-07-18 00:00:00 opencv colors rgb java color-space
给定不同的RGB三联体(例如,[255,255,255]或[1,2,3]),我想将其映射到一组固定的颜色(红色、蓝色、绿色、黑色、白色、黄色、粉色、紫色、米色、棕色、橙色、灰色)。

举个例子,当我给出"0,0,0"时,黑色应该是映射的输出。同样,灰色代表"190,190,190"。地图的值将采用上面定义的枚举颜色(共12种)。

使用固定的颜色集维护反向映射,并使用地图的所有元素计算每个新的RGB三元组的平方差是一种方法,但这种方法的结果并不是很好。结果不佳的原因可能是我们选择的12种颜色在颜色空间中分布不均匀(但不确定:)。

此数据将进一步用于群集。

有没有库(最好是Java/C++或OpenCV)或网站可以执行类似的任务,我可以利用它?

提前谢谢!


解决方案

首先使用

Map1: colourname->Colourvalue
example: "black" -> (255,255,255), "blue" -> (0,0,255)

Map2: Colourvalue->colourname
example: (255,255,255) -> "black", (0,0,255) -> "blue"

如果您获得一个值的颜色(0,10,240),您希望检查map2中的哪些已知条目也是最接近的。

因此,如果颜色的距离大致相等(否则请参见底部),则计算欧几里得距离,得到类似

的结果
dist((0,10,240), (0,0,255)) ~ 20 (number guessed)
dist((0,10,240), (255,255,255)) ~ 20000 (number guessed)

并且您知道您的颜色值(0,10,240)应映射到"蓝色"。

要记住的几件事:

  1. 您可能需要查看不同的颜色空间。我建议使用实验室的色彩空间,它的设计是为了使距离与人类体验世界的方式相似。

  2. 签出XKCD Colour Survey。如果您只使用RGB,您甚至可以存储所有颜色到其正确名称的静态映射。如果奥尤有足够的空间,你会有一个即时查找。(为了节省空间,使用来自[r,g,b]->char的三维数组,并根据您的char查找颜色名称)

编辑:您必须检查颜色之间的距离是否大致相等。否则,有些颜色可能会曝光量过大。(例如,在xkcd颜色图表中,一些颜色,如深棕色,只有微小的区域,而其他颜色则非常大。

相关文章