检测OpenCV中的颜色深浅

时间:2013-04-09 22:47:57

标签: opencv image-processing hsv

我有很多不同色调的纸卡图像。像所有布鲁斯或所有红色等一样。在图像中,它们被固定在具有该颜色的不同物体上。

我想编写一个程序,将颜色与卡片上的阴影进行比较,并选择最接近物体的阴影。

然而,我意识到,对于未来的图像,我的相机将受到许多不同的照明。我想我应该转换成HSV空间。

我也不确定应该使用什么类型的距离测量。考虑到卡片中的某种斑点,我可以对HSV进行平均,并简单地看出哪个斑点的平均值最接近。

但我欢迎任何和所有建议,我想了解更多关于我可以用OpenCV做些什么。

编辑:样本

enter image description here

这里我想比较第6个点的红色填充,看它实际上是第3个纸矩形的阴影。

1 个答案:

答案 0 :(得分:6)

我认为有一种可能性是:

来自色相和饱和度通道的颜色直方图

  1. 计算实心圆的颜色直方图。
  2. 计算纸条的颜色直方图。
  3. 使用直方图距离度量计算距离。 这里的可能性包括: 卡方, 推土机距离, Bhattacharya距离, 直方图交集等。
  4. 检查此opencv链接以获取有关computing histograms

    的详细信息

    检查此opencv链接以获取有关histogram comparisons

    的详细信息

    请注意,在计算颜色直方图时,请根据您的建议将图像转换为HSV颜色空间。然后,这里有两件事需要注意。

    1. [已编辑这是一个建议,而不是必须这样做,因为我相信V频道可能是必要的,以区分阴影。无论如何,尝试两者并与提供更好结果的那一起去。抱歉,如果这让你偏离了轨道。]一种可能性是只使用Hue和Saturation通道,即你建立一个2D 直方图,而不是由色调和值组成的3D 饱和通道。这样做的原因是变化 在V通道中最能感受到照明。这个,再加上 使用直方图,应该有希望使您的比较更多 坚固的照明变化。有一些关于无视的讨论 在此帖here中构建颜色直方图时的V通道。您 可能会发现其中的参考资料很有用。
    2. 使用opencv函数规范化直方图。这是为了 考虑到不同大小的材料补丁(你的 小圆圈与巨大的颜色条有不同的像素数。)
    3. 您可能还希望考虑执行某种形式的预处理来“拉伸”图像中的颜色,例如使用直方图均衡或“S曲线”映射,以便更好地分离不同颜色的阴影。然后计算此处理图像上的颜色直方图。保留映射信息并在计算颜色直方图之前在新测试样本上执行。

      使用ML进行分类

      除了简单地计算距离并获取最近的距离(即1个最近的邻居分类器)之外,您可能还需要考虑训练分类器为您进行分类。这样做的一个原因是分类器的训练将有希望学习一些区分不同色调的色调,因为它在训练阶段可以访问它们并且需要区分它们。请注意,简单地计算距离(即建议的方法)可能没有此属性。希望这会给出更好的分类。

      训练中使用的功能仍然可以是我上面提到的颜色直方图。也就是说,您如上所述为您的训练样本计算颜色直方图,并将其与其类别(即它们的阴影)一起传递给分类器。然后,当您希望对测试样本进行分类时,您同样会计算颜色直方图并将其传递给分类器,它将返回测试样本所属颜色的类(颜色为阴影)。

      培训分类器时的潜在问题,而不是如您所建议的那样使用简单的基于距离比较的方法,部分是程序的复杂性增加,以及当训练数据不好时可能会得到不好的结果。还需要进行大量的参数调整才能使其正常工作。

      有关详细信息,请参阅opencv机器学习教程here。请注意,在链接的示例中,分类器仅区分2个类,而您有2个以上的颜色。这不是问题,因为分类器通常可以使用2个以上的类。

      希望这有帮助。