连通域
连通区域一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域。连通区域分析是指将图像中的各个连通区域找出并标记。
例如:OCR识别中字符分割提取(车牌识别、文本识别、字幕识别等)、视觉跟踪中的运动前景目标分割与提取、医学图像处理(感兴趣目标区域提取)。也就是说,在需要将前景目标提取出来以便后续进行处理的应用场景中都能够用到连通区域分析方法,通常连通区域分析处理的对象是一张二值化后的图像。
cv2.connectedComponentsWithStats( gray_image, connectivity=8, ltype=cv2.CV_32S)
参数:
connectivity : 可选用值为4或8, 使用4连通还是8连通
ltype:输出图像标记的类型,目前支持CV_32S 和 CV_16U。
输入输出:
输入为一个二值化图像,
输出为一个长为4的tuple,
1.连通区域的个数
2.图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域)
3.每一个标记的统计信息,是一个5列的矩阵,每一行对应每个连通区域的外接矩形的x、y、width、height和面积
4.每个连通区域的中心点。
import cv2
import numpy as np
# 读图片
image = cv2.imread(r"C:\Users\bcl\Desktop\image.jpg")
# 中值滤波,去噪
image = cv2.medianBlur(image, 3)
#转化为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#显示
cv2.namedWindow('orig', cv2.WINDOW_AUTOSIZE)
cv2.imshow('orig', gray)
# 阈值分割得到二值化图片
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 得到卷积核
kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# 膨胀
bin_clo = cv2.dilate(binary, kernel2, iterations=2)
# 连通域分析
results= cv2.connectedComponentsWithStats(bin_clo, connectivity=8,ltype=cv2.CV_32S)
# 连通域数量
print('num_labels = ', results[0])
# 每一个像素的标签1、2、3.。。,同一个连通域的标签是一致的
print('labels = ', results[1])
# 连通域的信息:对应各个轮廓的x、y、width、height和面积
print('stats = ', results[2])
# 连通域的中心点
print('centroids = ', results[3])
# 对不同的连通域赋予不同的颜色
# 创建和原图一样大小的三维矩阵
output = np.zeros((image.shape[0], image.shape[1], 3), np.uint8)
for i in range(1, results[0]):
mask = results[1] == i
output[:, :, 0][mask] = np.random.randint(0, 255)
output[:, :, 1][mask] = np.random.randint(0, 255)
output[:, :, 2][mask] = np.random.randint(0, 255)
cv2.imshow('oginal', output)
cv2.waitKey()
cv2.destroyAllWindows()