【Python】找到最大连通区域,并画出bounding box

一、找出图片的最大连通区域

【Python】找到最大连通区域,并画出bounding box_第1张图片

              原始图像

mask = get_mask()
# 进行图像的二值化处理
max_value = np.max(mask)
#print(max_value)
ret, ee = cv2.threshold(mask, 0.15*max_value, max_value, cv2.THRESH_BINARY)

【Python】找到最大连通区域,并画出bounding box_第2张图片

        二值化处理后的图像

使用skimage中的label函数,标出二值化后的图像的所有连通区域。

def largestConnectComponent(bw_img):
    labeled_img, num = label(bw_img, neighbors=4, background=0, return_num=True)
    max_label = 0
    max_num = 0
    for i in range(0, num):
        if np.sum(labeled_img == 1) > max_num:
            max_num = np.sum(labeled_img == 1)
            max_label = i
    mcr = (labeled_img == max_label)
    return mcr

 label函数的返回值有很多的属性,包括求连通区域的面积、中心坐标、画边界框等等,这里使用的是画bounding box。

    fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))
    ax.imshow(mcr)
    for region in regionprops(labeled_img):
        # skip small images
        if region.area < 50:
            continue
        #print(regionprops(labeled_img)[max_label])
        minr, minc, maxr, maxc = region.bbox

        rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr,
                              fill=False, edgecolor='red', linewidth=2)
        ax.add_patch(rect)

【Python】找到最大连通区域,并画出bounding box_第3张图片

上面的代码是框出了所有的区域,如果只框最大的连通区域的话,代码如下:

    fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))
    ax.imshow(mcr)

    minr, minc, maxr, maxc = regionprops(labeled_img)[max_label].bbox
    rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr,
                              fill=False, edgecolor='red', linewidth=2)
    ax.add_patch(rect)

 

 【Python】找到最大连通区域,并画出bounding box_第4张图片

你可能感兴趣的:(python基础)