0

我目前正在做一个从一系列产品线中发现破损或坏产品的项目。我正在尝试使用 Opencv 通过Canny提取边缘。以下是分别从不良产品和样品产品获得的边缘。

坏的

坏的

好的

好的

边缘非常清晰,但有许多无意义的斑点(噪音)小区域,因此似乎无法直接逐像素比较这两张照片。我在想我是否可以继续旋转和移动不良产品并找到最佳比较分数,例如像素之间的平方差。然而,有了这些噪音,这种方法似乎是不可能的。

因此,我在想是否有办法提取最大的连接区域或将这些连接区域分成几张图片?或者,即使在这种情况下,是否存在更好的比较方法?

非常感谢!!!

4

1 回答 1

0

所以我尝试在这里解释一种可能的解决方案。模糊图像并获得边缘图像后,您可以通过膨胀来加厚找到的边缘。如果你有一个集合 X 和一个结构化元素 B,膨胀可以理解为当 B 的中心在 X 内部时,B 所覆盖的点 x 的集合:

在此处输入图像描述

在此处输入图像描述

如果你想了解更多关于这个主题的信息,我推荐你阅读 P.Soille:Morphological Image Analysis。知道你的边缘更厚更连接。在 findContours 之后,您选择最大的轮廓(您应该进行一些更复杂的测试)。这是我得到的结果:

膨胀后的边: 在此处输入图像描述

int dilation_type = MORPH_RECT;//MORPH_CROSS,MORPH_ELLISPE
int dilation_size = 2;
Mat element = getStructuringElement( dilation_type,Size( 2*dilation_size + 1,2*dilation_size+1 ),Point( dilation_size, dilation_size ));
dilate( src, erosion_dst, element );

找到轮廓: 在此处输入图像描述

最大轮廓的边界矩形: 在此处输入图像描述

于 2016-09-11T09:16:06.513 回答