利用OPCV 找到图像中的连通区域(connectedComponentsWithStats)

连通域

连通区域一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域连通区域分析是指将图像中的各个连通区域找出并标记
例如: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()

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值