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

原始图像
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)

二值化处理后的图像
使用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)

上面的代码是框出了所有的区域,如果只框最大的连通区域的话,代码如下:
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的skimage库找出图片的最大连通区域,并展示如何画出该区域的bounding box。首先对原始图像进行二值化处理,然后应用label函数标识所有连通区域,最后修改代码仅显示最大的连通区域。

6479

被折叠的 条评论
为什么被折叠?



