一尘不染

如何在不同的照明条件下检测颜色

algorithm

我有一堆许多颜色的衣服的图像,我想检测每个图像的颜色。假设我在日光条件下有蓝色的裙子图像,并且可以通过RGB分布获得正确的颜色。但是,在晚上很难分辨出颜色,“蓝色”被识别为“黑色”。很难制定统一的标准来通过RGB分布指定颜色。

因此,我想知道是否有一种方法或算法可以检测不同光照下的颜色?

顺便说一句:我也尝试了HSV色彩空间,但效果不佳。


阅读 326

收藏
2020-07-28

共1个答案

一尘不染

这是一个非常棘手的问题,并且今天仍在努力解决。其要旨是使用具有代表性的图像基本颜色集来找到颜色量化,该基本颜色可以抵抗不同的外部刺激,例如照明,阴影,不良照明等。

不幸的是,我无法建议任何一种算法在所有情况下都能为您完成工作。但是,过去对我有用的一种算法是在进行图像检索时。具体来说,柯达研究实验室的罗洁波和戴维·克兰德尔的作品:http
:
//vision.soic.indiana.edu/papers/compoundcolor2004cvpr.pdf

基本算法是查看ISCC-
NBS调色板集
。另外,此链接更加有用:https
:
//www.w3schools.com/colors/colors_nbs.asp。它是一组267种颜色的代表,代表了当今我们在现代社会中看到的颜色。通常,当我们描述颜色时,我们会有一组一个或多个形容词,然后是主要色相。例如,衬衫是暗淡的浅蓝色或浅亮的黄色等。此算法的优点在于,当所讨论的颜色受到不同的外部刺激时,我们拥有所有这些赋予颜色含义的形容词,但最终,颜色是我们所追求的。

这些颜色均具有关联的RGB值。这些颜色将转换为CIE
Lab
颜色空间,形成267 CIE Lab查找表。

要对特定的输入颜色进行分类,您可以将该输入的RGB值转换为CIE Lab颜色空间,然后确定与该查找表最接近的颜色。已经显示,CIE
Lab颜色空间中两种颜色之间的欧几里得距离最能代表人类对颜色的感知差异。确定颜色最接近查找表中的位置后,我们便会去除所有形容词并查看主要色相,从而对颜色进行相应分类。

例如,如果我们有一个RGB像素并将其转换为Lab,然后发现最接近的颜色是亮黄色,则将删除“亮”,代表该RGB像素的最终颜色将是黄色。


因此,最终的算法是这样的:

  1. 查找ISCC-NBS颜色集的RGB值,并将其转换为CIE Lab并创建一个查找表,我将其称为LUT1。例如,在Python中,您可以简单地使它成为2D列表或2D NumPy数组。
  2. 创建另一个查找来存储ISCC-NBS颜色集中每种颜色的主色调-查找所有形容词,然后保留主色调,我称其为LUT2。例如,在Python中,您可以创建一个字典,其中的键是LUT1的对应行,而值将是实际的基本颜色本身。无论是字符串表示形式还是代表基本颜色的RGB三元组,都由您决定。
  3. 对于有问题的像素,找到与LUT1相匹配的最接近的ISCC-NBS颜色,即该像素的CIE Lab组件与LUT1中的组件之间的欧式距离。
  4. 一旦我们在LUT1中找到此位置,就可以使用相同的索引来索引LUT2,并获得最终的颜色来对输入像素的颜色进行分类。

希望这可以帮助!

2020-07-28