使用OpenCV检测颜色阴影

4
我有许多不同色调的纸卡图片,例如所有蓝色或所有红色等。在这些图像中,它们被举起到与其颜色相同的不同物体旁边。
我想编写一个程序来比较颜色和卡上的阴影,并选择最接近对象的阴影。
然而,我意识到对于未来的图像,我的相机将受到许多不同的光线照射。我认为我应该转换成HSV空间。
我也不确定应该使用什么类型的距离度量。鉴于一些卡片的斑点,我可以平均HSV并简单地查看哪个斑点的平均值最接近。
但是我欢迎任何建议,我想学习更多关于OpenCV的知识。
编辑:示例
在这里,我想比较填充的红色圆点,以查看它是否实际上是第三个纸矩形的阴影。

1
请发布您可能要处理的图像样本。 - Francesco Callari
@FrancoCallari 完成了!如果您需要更多细节,请告诉我。 - lollercoaster
1个回答

6
我认为有一种可能性是执行以下操作: 从色调和饱和度通道计算颜色直方图
  1. 计算填充圆的颜色直方图。
  2. 计算纸条的颜色直方图。
  3. 使用直方图距离度量计算距离。 可能的选择包括: 卡方距离, 地球移动距离, 巴氏距离, 直方图交集等。

有关计算直方图的详细信息,请查看此opencv链接。

有关直方图比较的详细信息,请查看此opencv链接。

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

  1. 一种可能性是只使用色调和饱和度通道,即构建一个二维直方图而不是由色调、饱和度和亮度通道组成的三维直方图。这样做的原因是光照变化最明显的是亮度通道。这与直方图的使用结合起来,应该可以使您的比较更加稳健地应对光照变化。在此处的帖子中有关于在构建颜色直方图时忽略亮度通道的讨论。您可能会发现其中的参考资料有用。
  2. 使用OpenCV函数对直方图进行归一化。这是为了考虑材料补丁的不同大小(您的小圆圈与巨大的彩色条之间具有不同数量的像素)。
你可能还需要考虑对图像进行一些预处理,例如使用直方图均衡化或“S曲线”映射来“拉伸”图像中的颜色,以便更好地分离不同的颜色阴影。然后在这个经过处理的图像上计算颜色直方图。保留映射信息,并在计算新测试样本的颜色直方图之前执行它。
使用机器学习进行分类
除了简单地计算距离并选择最近的一个(即1最近邻分类器),您可能希望考虑训练分类器为您进行分类。这样做的一个原因是,分类器的训练将有望学习一些区分不同色调的方式,因为它在训练阶段可以访问它们并需要区分它们。请注意,仅计算距离,即您建议的方法,可能没有这个属性。希望这将给出更好的分类结果。
训练中使用的特征仍然可以是我上面提到的颜色直方图。也就是说,您为训练样本计算颜色直方图并按其类别(即它们属于哪种色调)将其传递给分类器。然后,当您希望对测试样本进行分类时,同样计算颜色直方图并将其传递给分类器,它将返回测试样本所属的类(在您的情况下是颜色的色调)。
与您建议的简单距离比较方法相比,训练分类器可能存在一些问题,部分原因是程序的复杂性增加,以及在训练数据不好的情况下可能会得到糟糕的结果。还需要进行大量参数调整才能使其正常工作。
有关更多详细信息,请参见opencv机器学习教程此处。请注意,在链接中的示例中,分类器仅区分两个类,而您有多于两个颜色的色调。这不是问题,因为通常分类器可以处理多于两个类。
希望这可以帮助您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接