在二值图像上寻找厚物体
Finding thick objects on binary image
在分析图像以查找运动区域的上下文中,这是我得到的中间结果,使用 opencv 和 python(假设这些是 100% 二进制):
所以我的问题是:有没有办法找到具有特定 "thickness" 阈值的白色斑点?
大致如下所示:
我一直在寻找转换和操作,例如连接组件和形态转换,但这些都行不通,除此之外我不知道从哪里开始。
形态学开运算非常适合这个问题。它会去除所有比给定直径更细的白色部分。
在 OpenCV 中,它是在 cv2.morphologyEx
中使用 op=cv2.MORPH_OPEN
:
实现的
kernel = cv2.getStructuringElement(cv2.cv.MORPH_ELLIPSE, diameter)
output = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
但请注意,这会删除较薄的对象部分,如果对象的一部分足够宽,则不会保留完整的对象。这可以通过重建开口、侵蚀和形态重建(也称为测地线膨胀)来完成。
OpenCV 没有该算法。 This Q&A 给出了如何在 OpenCV 中实现它的粗略概述,但这是一个非常昂贵的算法,还有更高效的算法。
Scikit-image中可能有实现,我没找。
DIPlib(具有 Python 称为 PyDIP 的绑定)(另外,我是作者)有一个 dip.OpeningByReconstruction。使用 pip install diplib
.
安装 Python 模块
在分析图像以查找运动区域的上下文中,这是我得到的中间结果,使用 opencv 和 python(假设这些是 100% 二进制):
所以我的问题是:有没有办法找到具有特定 "thickness" 阈值的白色斑点?
大致如下所示:
我一直在寻找转换和操作,例如连接组件和形态转换,但这些都行不通,除此之外我不知道从哪里开始。
形态学开运算非常适合这个问题。它会去除所有比给定直径更细的白色部分。
在 OpenCV 中,它是在 cv2.morphologyEx
中使用 op=cv2.MORPH_OPEN
:
kernel = cv2.getStructuringElement(cv2.cv.MORPH_ELLIPSE, diameter)
output = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
但请注意,这会删除较薄的对象部分,如果对象的一部分足够宽,则不会保留完整的对象。这可以通过重建开口、侵蚀和形态重建(也称为测地线膨胀)来完成。
OpenCV 没有该算法。 This Q&A 给出了如何在 OpenCV 中实现它的粗略概述,但这是一个非常昂贵的算法,还有更高效的算法。
Scikit-image中可能有实现,我没找。
DIPlib(具有 Python 称为 PyDIP 的绑定)(另外,我是作者)有一个 dip.OpeningByReconstruction。使用 pip install diplib
.