检测OpenCV中的颜色深浅

lol*_*ter 4 opencv image-processing hsv

我有很多不同色调的纸卡图像.像所有布鲁斯或所有红色等一样.在图像中,它们被保持为具有该颜色的不同对象.

我想编写一个程序来比较颜色和卡片上的阴影,并选择最接近物体的阴影.

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

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

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

编辑:一个样本

在此输入图像描述

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

lig*_*ist 6

我认为一种可能性是做以下事情:

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

  1. 计算实心圆的颜色直方图.
  2. 计算纸条的颜色直方图.
  3. 使用直方图距离测量来计算距离.这里的可能性包括:卡方,推土机距离,Bhattacharya距离,直方图交叉点等.

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

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

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

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

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

使用ML进行分类

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

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

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

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

希望这可以帮助.