图像比较方法和噪声抑制

时间:2016-09-10 04:33:20

标签: c++ opencv edge-detection canny-operator anomaly-detection

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

BAD

Bad

GOOD

Good

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

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

非常感谢!!!

1 个答案:

答案 0 :(得分:0)

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

enter image description here

enter image description here

如果您想了解有关此主题的更多信息,我建议您P.Soille:Morphological Image Analysis。 知道你的边缘较厚并且连接在一起。在findContours之后,你选择了最大的轮廓(你应该做一些更复杂的测试)。以下是我得到的结果:

扩张后的边缘 enter image description here

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 );

找到轮廓: enter image description here

最大轮廓的边界矩形: enter image description here