num_labels,labels,stats,cetroids=cv2.connectedComponentStats(img,connectivity=8)
このうち、num_labels: 接続されているドメインの総数。
ラベル: 接続されている各ドメインのラベル番号。
stats: 接続された各ドメインは、左上隅の座標情報、幅、高さ、面積に対応します。
centroids: 接続された各ドメインの中心点の座標情報。
# 经过灰度变换、二值化处理后的图片命名为test2
# 连通域
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(test2, connectivity=8)
areas = list() # 计算平均面积
for i in range(1, num_labels):
areas.append(stats[i][-1])
print("轮廓%d的面积:%d" % (i, stats[i][-1]))
area_avg = np.average(areas[1:-1])
print("平均值:", area_avg)
image_filtered = np.zeros_like(test2) # 输出与test2形状相同的列表,且元素全为0
for (i, label) in enumerate(np.unique(labels)): # np.unique()去除其中重复的元素,并返回一个从小到大排列的元组或列表
if label == 0: # 如果是背景,忽略
continue
if stats[i][-1] > area_avg: # 获取第i个连通域的面积并判断是否大于均值
image_filtered[labels == i] = 255
x1 = stats[i][0] # 获取第i个连通域的左上角x坐标
y1 = stats[i][1] # 获取第i个连通域的左上角y坐标
x2 = stats[i][0] + stats[i][2] # 获取第i个连通域的右下角x坐标:x1+w
y2 = stats[i][1] + stats[i][3] # 获取第i个连通域的右下角y坐标: y1+h
print(centroids[i]) # 输出第i个连通域中心点坐标值
cv2.rectangle(image, (x1,y1), (x2, y2), (0, 255, 0), 2) # 通过面积筛选出想要的区域后,画出
# 下一步显示有目标框的图像