我有很多不同色调的纸卡图像。像所有布鲁斯或所有红色等一样。在图像中,它们被固定在具有该颜色的不同物体上。
我想编写一个程序,将颜色与卡片上的阴影进行比较,并选择最接近物体的阴影。
然而,我意识到,对于未来的图像,我的相机将受到许多不同的照明。我想我应该转换成HSV空间。我也不确定应该使用什么类型的距离测量。考虑到卡片中的某种斑点,我可以对HSV进行平均,并简单地看出哪个斑点的平均值最接近。
但我欢迎任何和所有建议,我想了解更多关于我可以用OpenCV做些什么。
编辑:样本
这里我想比较第6个点的红色填充,看它实际上是第3个纸矩形的阴影。
答案 0 :(得分:6)
我认为有一种可能性是:
来自色相和饱和度通道的颜色直方图
检查此opencv链接以获取有关computing histograms
的详细信息检查此opencv链接以获取有关histogram comparisons
的详细信息请注意,在计算颜色直方图时,请根据您的建议将图像转换为HSV颜色空间。然后,这里有两件事需要注意。
您可能还希望考虑执行某种形式的预处理来“拉伸”图像中的颜色,例如使用直方图均衡或“S曲线”映射,以便更好地分离不同颜色的阴影。然后计算此处理图像上的颜色直方图。保留映射信息并在计算颜色直方图之前在新测试样本上执行。
使用ML进行分类
除了简单地计算距离并获取最近的距离(即1个最近的邻居分类器)之外,您可能还需要考虑训练分类器为您进行分类。这样做的一个原因是分类器的训练将有希望学习一些区分不同色调的色调,因为它在训练阶段可以访问它们并且需要区分它们。请注意,简单地计算距离(即建议的方法)可能没有此属性。希望这会给出更好的分类。
训练中使用的功能仍然可以是我上面提到的颜色直方图。也就是说,您如上所述为您的训练样本计算颜色直方图,并将其与其类别(即它们的阴影)一起传递给分类器。然后,当您希望对测试样本进行分类时,您同样会计算颜色直方图并将其传递给分类器,它将返回测试样本所属颜色的类(颜色为阴影)。
培训分类器时的潜在问题,而不是如您所建议的那样使用简单的基于距离比较的方法,部分是程序的复杂性增加,以及当训练数据不好时可能会得到不好的结果。还需要进行大量的参数调整才能使其正常工作。
有关详细信息,请参阅opencv机器学习教程here。请注意,在链接的示例中,分类器仅区分2个类,而您有2个以上的颜色。这不是问题,因为分类器通常可以使用2个以上的类。
希望这有帮助。