我试图在 OpenCV 中找到 Matlabs“ Bwareaopen ”函数的类似或等效函数?
在 MatLab Bwareaopen(image,P)中,从二进制图像中删除所有小于 P 像素的连接组件(对象)。
在我的 1 通道图像中,我想简单地删除不属于较大区域的小区域?有什么简单的方法可以解决这个问题吗?
看看cvBlobsLib,它有做你想做的事情的功能。事实上,我认为该链接首页上的代码示例正是您想要的。本质上,您可以使用CBlobResult
对二进制图像执行连接组件标记,然后Filter
根据您的标准调用以排除 blob。
没有这样的功能,但您可以 1) 查找轮廓 2) 查找轮廓区域 3) 过滤面积小于阈值的所有外部轮廓 4) 创建新的黑色图像 5) 在其上绘制左侧轮廓 6) 用原始图像遮盖图片
我遇到了同样的问题,并想出了一个使用 connectedComponentsWithStats() 的函数:
def bwareaopen(img, min_size, connectivity=8):
"""Remove small objects from binary image (approximation of
bwareaopen in Matlab for 2D images).
Args:
img: a binary image (dtype=uint8) to remove small objects from
min_size: minimum size (in pixels) for an object to remain in the image
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() 的说明,请参阅:
如何使用 OpenCV 删除小的连接对象
https://www.programcreek.com/python/example/89340/cv2.connectedComponentsWithStats
https://python.hotexamples.com/de/examples/cv2/-/connectedComponentsWithStats/python-connectedcomponentswithstats -function-examples.html