1、求解连通域
Opencv 连通域函数connectedComponentsWithStats
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(image)
输入:
image:必须是二值化图像,检测的连通域为白色部分。
输出:
num_labels:所有连通域的数目
labels:图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域)
stats:每一个标记的统计信息,是一个5列的矩阵,每一行对应每个连通区域的外接矩形的 x(左上角)、y(左上角)、width(宽度)、height(高度)和面积(点的数量),示例如下: 0 0 720 720 291805。
centroids:连通域的中心。
2、示例代码
import cv2
import numpy as np
if __name__ == '__main__':
image = np.zeros((640, 640)).astype(np.uint8)
#绘制圆形
image = cv2.circle(image, (100, 100), 50, 255, -1)
#绘制多边形
points = [[200, 200], [300, 100], [400, 400], [250, 300]]
cv2.fillPoly(image, np.array([points]), 255, cv2.LINE_AA)
#绘制矩形
cv2.rectangle(image, (200,500), (500, 600), 255, -1)
cv2.imshow('image', image)
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(image)
print('num_labels: ', num_labels)
labels[labels>0] = 255
labels = labels.astype(np.uint8)
#将一维灰度图像扩展到三维
labels= np.expand_dims(labels,axis=2).repeat(3,axis=2).astype(np.uint8)
for st in stats[1:]:
cv2.rectangle(labels, (st[0], st[1]), (st[0]+st[2], st[1]+st[3]), (0, 255, 0), 3)
cv2.imshow('labels', labels)
cv2.waitKey(0)
3、测试结果
更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。