我试图在OpenCV中找到类似或等效的Matlabs“ Bwareaopen ”功能?
在MatLab中 Bwareaopen(图像,P)从二进制图像中删除所有少于P像素的连通分量(对象)。
在我的1频道图片中,我想简单地删除不属于较大区域的小区域?有什么简单的方法可以解决这个问题吗?
答案 0 :(得分:3)
看一下cvBlobsLib,它具有你想要的功能。事实上,我认为该链接首页上的代码示例完全符合您的要求。
实际上,您可以使用CBlobResult
在二进制映像上执行连接组件标记,然后根据您的条件调用Filter
以排除blob。
答案 1 :(得分:1)
没有这样的功能,但你可以 1)找到轮廓 2)找到轮廓区域 3)过滤所有外部轮廓,其面积小于阈值 4)创建新的黑色图像 5)在其上绘制左轮廓 6)用原始图像掩饰它
答案 2 :(得分:0)
我遇到了同样的问题,想出了一个使用 connectedComponentsWithStats() 的函数:
def bwareaopen(img, min_size, connectivity=8):
"""Remove small objects from binary image (partial approximation of
bwareaopen in Matlab for 2D images).
Args:
img: a binary image (dtype=uint8) to remove small objects from
min_size: the maximum size of small objects to be removed
connectivity: Pixel connectivity; either 4 (connected via edges) or 8 (connected via edges and corners).
Returns:
the binary image with small objects removed
"""
# Find all connected components (called here "labels")
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(
img, connectivity=connectivity)
# check size of all connected components (area in pixels)
for i in range(num_labels):
label_size = stats[i, cv2.CC_STAT_AREA]
# remove connected components smaller than min_size
if label_size < min_size:
img[labels == i] = 0
return img
有关 connectedComponentsWithStats() 的说明,请参阅:
How to remove small connected objects using OpenCV
https://www.programcreek.com/python/example/89340/cv2.connectedComponentsWithStats
https://python.hotexamples.com/de/examples/cv2/-/connectedComponentsWithStats/python-connectedcomponentswithstats-function-examples.html