我认为一种可能性是执行以下操作:
色相和饱和度通道的颜色直方图
- 计算实心圆的颜色直方图。
- 计算纸条的颜色直方图。
- 使用直方图距离度量计算距离。这里的可能性包括:卡方、推土机距离、巴塔查里亚距离、直方图交叉点等。
检查此 opencv 链接以获取有关计算直方图的详细信息
检查此 opencv 链接以获取有关直方图比较的详细信息
请注意,在计算颜色直方图时,请按照您自己的建议将图像转换为 HSV 颜色空间。然后,这里有两点需要注意。
- [编辑将此作为建议而不是必须做的,因为我相信 V 通道可能是区分阴影所必需的。无论如何,尝试两者并使用效果更好的那个。抱歉,如果这让您偏离轨道。] 一种可能性是仅使用色调和饱和度通道,即您构建一个 2D 直方图,而不是由色调和饱和度通道的值组成的 3D 直方图。这样做的原因是在 V 通道中最能感受到照明的变化。这与直方图的使用一起,有望使您的比较对照明变化更加稳健。这里有一些关于在构建颜色直方图时忽略 V 通道的讨论。您可能会发现其中的参考资料很有用。
- 使用 opencv 函数对直方图进行归一化。这是为了解释不同大小的材料块(你的小圆圈与巨大的彩条有不同的像素数)。
您可能还希望考虑执行某种形式的预处理来“拉伸”图像中的颜色,例如使用直方图均衡或“S 曲线”映射,以便更好地分离不同的颜色阴影。然后计算此处理后图像的颜色直方图。在计算颜色直方图之前,保留映射信息并在新测试样本上执行。
使用 ML 进行分类
除了简单地计算距离并取最近的距离(即 1 个最近邻分类器)之外,您可能还需要考虑训练一个分类器来为您进行分类。这样做的一个原因是分类器的训练有望学习一些方法来区分不同的色调,因为它在训练阶段可以访问它们并且需要区分它们。请注意,简单地计算距离,即您建议的方法,可能没有此属性。希望这将提供更好的分类。
训练中使用的特征仍然可以是我上面提到的颜色直方图。也就是说,您为训练样本计算如上所述的颜色直方图,并将其与它们的类(即它们是哪个阴影)一起传递给分类器。然后,当您希望对测试样本进行分类时,您同样计算颜色直方图并将其传递给分类器,它将返回测试样本颜色所属的类(在您的情况下为颜色阴影)。
训练分类器时的潜在问题,而不是像您建议的那样使用基于距离比较的简单方法,部分原因是程序的复杂性增加,并且在训练数据不好时可能会得到不好的结果。还需要进行大量参数调整才能使其正常工作。
有关更多详细信息,请参阅此处的 opencv 机器学习教程。请注意,在链接中的示例中,分类器仅区分 2 个类别,而您有超过 2 种颜色。这不是问题,因为分类器通常可以处理超过 2 个类。
希望这可以帮助。