4

我有很多不同颜色的纸卡图像。就像所有的蓝色,或所有的红色等一样。在图像中,它们被支撑在具有该颜色的不同物体上。

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

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

我也不确定我应该使用哪种距离测量方法。给定卡片中的某种斑点,我可以对 HSV 进行平均,然后简单地查看哪个斑点的平均值最接近。

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

编辑:一个样本

在此处输入图像描述

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

4

1 回答 1

6

我认为一种可能性是执行以下操作:

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

  1. 计算实心圆的颜色直方图。
  2. 计算纸条的颜色直方图。
  3. 使用直方图距离度量计算距离。这里的可能性包括:卡方、推土机距离、巴塔查里亚距离、直方图交叉点等。

检查此 opencv 链接以获取有关计算直方图的详细信息

检查此 opencv 链接以获取有关直方图比较的详细信息

请注意,在计算颜色直方图时,请按照您自己的建议将图像转换为 HSV 颜色空间。然后,这里有两点需要注意。

  1. [编辑将此作为建议而不是必须做的,因为我相信 V 通道可能是区分阴影所必需的。无论如何,尝试两者并使用效果更好的那个。抱歉,如果这让您偏离轨道。] 一种可能性是仅使用色调和饱和度通道,即您构建一个 2D 直方图,而不是由色调和饱和度通道的值组成的 3D 直方图。这样做的原因是在 V 通道中最能感受到照明的变化。这与直方图的使用一起,有望使您的比较对照明变化更加稳健。这里有一些关于在构建颜色直方图时忽略 V 通道的讨论。您可能会发现其中的参考资料很有用。
  2. 使用 opencv 函数对直方图进行归一化。这是为了解释不同大小的材料块(你的小圆圈与巨大的彩条有不同的像素数)。

您可能还希望考虑执行某种形式的预处理来“拉伸”图像中的颜色,例如使用直方图均衡或“S 曲线”映射,以便更好地分离不同的颜色阴影。然后计算此处理后图像的颜色直方图。在计算颜色直方图之前,保留映射信息并在新测试样本上执行。

使用 ML 进行分类

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

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

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

有关更多详细信息,请参阅此处的 opencv 机器学习教程。请注意,在链接中的示例中,分类器仅区分 2 个类别,而您有超过 2 种颜色。这不是问题,因为分类器通常可以处理超过 2 个类。

希望这可以帮助。

于 2013-04-11T07:23:44.580 回答