在二进制图像上查找厚物体

时间:2019-05-16 20:05:27

标签: python image-processing cv2

在分析图像以查找具有运动的区域的情况下,这是我作为中间结果使用opencv和python(假定它们是100%二进制的)的结果:

Binary image

所以我的问题是:有没有办法找到具有特定“厚度”阈值的白色斑点?

大致如下:

Resulting image

我一直在寻找转换和操作,例如连接的组件和形态转换,但是这些都行不通,我不知道该从哪里开始。

1 个答案:

答案 0 :(得分:3)

形态学上的开口是解决此问题的理想选择。它会去除所有比给定直径薄的白色部分。

在OpenCV中,它是使用op=cv2.MORPH_OPENcv2.morphologyEx中实现的:

kernel = cv2.getStructuringElement(cv2.cv.MORPH_ELLIPSE, diameter)
output = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)

但是请注意,这会删除较薄的对象的一部分,如果一部分足够宽,则不会留下完整的对象。可以使用通过重建的开孔,先进行侵蚀再进行形态重建(也称为测地膨胀)来实现。

OpenCV没有该算法。 This Q&A概述了如何在OpenCV中实现它,但这是一种非常昂贵的算法,效率更高。

Scikit图像中可能有一个实现,我没有找到它。

DIPlib(带有称为PyDIP的Python绑定)(也是我的作者)有一个dip.OpeningByReconstruction,但是您必须从源代码构建库,因为我们还没有一个简单的预打包的Python版本。