5

我试图在 OpenCV 中找到 Matlabs“ Bwareaopen ”函数的类似或等效函数?

在 MatLab Bwareaopen(image,P)中,从二进制图像中删除所有小于 P 像素的连接组件(对象)。

在我的 1 通道图像中,我想简单地删除不属于较大区域的小区域?有什么简单的方法可以解决这个问题吗?

4

3 回答 3

4

看看cvBlobsLib,它有做你想做的事情的功能。事实上,我认为该链接首页上的代码示例正是您想要的。本质上,您可以使用CBlobResult对二进制图像执行连接组件标记,然后Filter根据您的标准调用以排除 blob。

于 2010-02-27T18:15:03.673 回答
3

没有这样的功能,但您可以 1) 查找轮廓 2) 查找轮廓区域 3) 过滤面积小于阈值的所有外部轮廓 4) 创建新的黑色图像 5) 在其上绘制左侧轮廓 6) 用原始图像遮盖图片

于 2016-05-10T11:40:33.493 回答
0

我遇到了同样的问题,并想出了一个使用 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

于 2021-07-05T08:55:47.327 回答