Matlab Bwareaopen在OpenCV中的等效功能

时间:2010-02-27 17:58:00

标签: count opencv sum pixels

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

在MatLab中 Bwareaopen(图像,P)从二进制图像中删除所有少于P像素的连通分量(对象)。

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

3 个答案:

答案 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