【问题标题】:Detecting shades of color in OpenCV在 OpenCV 中检测颜色的深浅
【发布时间】:2013-04-09 22:47:57
【问题描述】:

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

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

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

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

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

编辑:示例

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

【问题讨论】:

  • 请张贴您可能使用的图片样本。
  • @FrancoCallari 完成!如果您想了解更多详情,请告诉我。

标签: opencv image-processing hsv


【解决方案1】:

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

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

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

查看此 opencv 链接以了解有关 computing histograms 的详细信息

查看此 opencv 链接以获取有关 histogram comparisons 的详细信息

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

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

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

使用 ML 进行分类

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

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

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

查看opencv机器学习教程here了解更多详情。请注意,在链接中的示例中,分类器仅区分 2 个类别,而您有超过 2 种颜色。这不是问题,因为分类器通常可以处理超过 2 个类。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 2014-05-01
    • 2014-08-07
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2014-07-06
    相关资源
    最近更新 更多