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

How to detect colors under different illumination conditions

我有一堆很多颜色的衣服图片,我想检测每张图片的颜色。假设我在日光条件下有一条蓝色裙子图像,我可以通过 RGB 分布获得正确的颜色。然而,在晚上很难分辨颜色,"blue" 被识别为 "black"。通过RGB分布来指定颜色很难制定一个统一的标准。

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

顺便说一句:我也尝试了 HSV 颜色 space,但结果并不好。

这是一个非常困难的问题,今天仍在努力解决。它的要点是找到 colour quantization 使用图像的一组具有代表性的基本颜色,该颜色对不同的外部刺激具有鲁棒性......照明,阴影,光线不足等。

遗憾的是,我无法推荐任何一种算法来解决所有情况。但是,过去对我有用的一种算法是在我从事图像检索工作时使用的。具体来说,来自柯达研究实验室的 Jiebo Luo 和 David Crandall 的工作:http://vision.soic.indiana.edu/papers/compoundcolor2004cvpr.pdf

基本算法是看一看ISCC-NBS colour palette set. Also, this link is much more fruitful: https://www.w3schools.com/colors/colors_nbs.asp。它是一组 267 种颜色,代表了我们今天在现代社会看到的颜色。通常当我们描述颜色时,我们有一组一个或多个形容词,然后是主色调。例如,那件衬衫是深蓝色,或浅黄色等。这个算法的美妙之处在于,当所讨论的颜色受到不同的外部刺激时,我们拥有所有这些赋予颜色意义的形容词,但归根结底,颜色的最后一部分 - 主色调 - 就是我们所追求的。

这些颜色中的每一种都有一个关联的 RGB 值。这些颜色被转换为 CIE Lab 颜色 space,形成 267 CIE Lab 查找 table.

要对特定输入颜色进行分类,您可以将此输入的 RGB 值转换为 CIE Lab 颜色 space,然后确定最接近此查找的颜色 table。已经表明,CIE Lab 颜色 space 中两种颜色之间的欧氏距离最能代表人类对颜色的感知差异。一旦我们确定查找中的哪个位置 table 颜色最接近,我们就会去掉所有形容词并查看主要色调是什么,然后我们相应地对该颜色进行分类。

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


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

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

希望对您有所帮助!