Opencv (Python) 寻找最大联通域

假设我们的待处理二值图像为:mask_sel

则作如下处理即可:

contours,hierarchy = cv2.findContours(mask_sel,cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

#找到最大区域并填充

area = []

for j in range(len(contours)):

    area.append(cv2.contourArea(contours[j]))

max_idx = np.argmax(area)

max_area = cv2.contourArea(contours[max_idx])

for k in range(len(contours)):

    if k != max_idx:
    cv2.fillPoly(mask_sel, [contours[k]], 0)

处理前后效果具体如下:

******************************************************************************  2020.10.20

opencv版本可能会导致一些bug,添加以下完整函数:

def find_max_region(mask_sel):
    __, contours,hierarchy = cv2.findContours(mask_sel,cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
 
    #找到最大区域并填充 
    area = []
 
    for j in range(len(contours)):
        area.append(cv2.contourArea(contours[j]))
 
    max_idx = np.argmax(area)
 
    max_area = cv2.contourArea(contours[max_idx])
 
    for k in range(len(contours)):
    
        if k != max_idx:
            cv2.fillPoly(mask_sel, [contours[k]], 0)
    return mask_sel

下面是CT数据的一个例子:

原图像:

二值化处理:

最大联通域结果:

  • 13
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
获取图像的连通域可以使用`cv2.connectedComponentsWithStats()`方法,该方法返回每个连通域的标签、面积、宽度、高度和左上角坐标等信息。然后可以根据面积大小筛选出需要保留的连通域,并使用`cv2.rectangle()`方法框出这些连通域。 下面是一个示例代码: ```python import cv2 # 读取图像 img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE) # 二值化处理 _, thresh = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY) # 获取连通域信息 num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh) # 筛选出需要保留的连通域 min_area = 100 # 最小面积阈值 keep_labels = [] for i in range(1, num_labels): area = stats[i, cv2.CC_STAT_AREA] if area >= min_area: keep_labels.append(i) # 框出保留的连通域 for label in keep_labels: x, y, w, h = stats[label, cv2.CC_STAT_LEFT], stats[label, cv2.CC_STAT_TOP], stats[label, cv2.CC_STAT_WIDTH], stats[label, cv2.CC_STAT_HEIGHT] cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) # 显示图像 cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们首先读取图像并进行二值化处理,然后使用`cv2.connectedComponentsWithStats()`方法获取连通域信息。接着,我们根据面积大小筛选出需要保留的连通域,并使用`cv2.rectangle()`方法框出这些连通域。最后,我们显示处理后的图像。 注意,上面的代码中我们设定了一个最小面积阈值`min_area`,面积小于该阈值的连通域将被删除。您可以根据自己的需求调整该阈值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值