python 连通域,opencv求连通域
本文主要介绍OpenCV学习记录python实现连通域处理函数cv2 . connectedcomponentswithstats()和cv2.connectedComponents()的使用实例。
00-1010 1.两个函数介绍1.1什么是连通域1.2cv2 .连通组件()1.3 cv2 . ConnectedComponentswithstats()2 .代码练习3。摘要
目录
一般来说,connectedComponents()只创建一个标记图(图中不同的连通域使用不同的标记,与原图的宽度和高度相同)。connectedComponentsWithStats()可以完成上述任务,此外,它还可以返回每个连通区域的重要信息——包围盒、面积和中心线。
1、两个函数介绍
连通区域一般指图像中像素值相同、位置相邻的前景像素组成的图像区域。连通区域分析是指找出并标记图像中的每个连通区域。
连通区域分析是CVPR和图像分析与处理的许多应用领域中常用的基本方法。
例如:OCR识别(车牌识别、文本识别、字幕识别等)中的字符分割和提取。)、视觉跟踪中的运动前景目标分割与提取(行人入侵检测、遗留物体检测、基于视觉的车辆检测与跟踪等。)、医学图像处理(感兴趣对象提取)等。也就是说,连通区域分析法可以用在所有需要提取前景物体进行后续处理的应用场景中。通常,连通区域分析的对象是二值化图像。
1.1什么是连通域
函数各参数的含义:
num_objects,labels=cv2 . connected components(image)
参数介绍如下:
图像:即输入图像必须是二值图像,即8位单通道图像。(因此,输入图像必须经过二值化处理,才能被该函数接受)
返回值:
Num_labels:所有连接的域的数量
标签:图像中每个像素的标签,用数字1,2,3…表示(不同的数字表示不同的连通域)。
1.2 cv2.connectedComponents()
该函数用于从图像中提取连通域,并返回找到的连通域的信息:retval、labels、stats、centroids。
num_labels,labels,stats,centroids=cv2 . connectedcomponentswithstats(image,connectivity=8,ltype=None)
参数介绍如下:
图像:即输入图像必须是二值图像,即8位单通道图像。(因此,必须对输入图像进行二值化处理,然后才能被该功能接受。)连通性:可选值为4或8,即使用4-连通还是8-连通。Ltype:输出图像标记的类型,目前支持CV_32S和CV_16U。返回值:
Num_labels:所有连通域的数目标签:图像中每个像素的标签,用数字1、2、3……表示(不同的数字表示不同的连通域)stats:每个标签的统计信息是一个5列的矩阵,每行对应每个连通域的外接矩形的x、y、宽度、高度和面积。示例如下:0 0 720 720
1.3 cv2.connectedComponentsWithStats()
这两个代码的用法很常见,cv2 . connectedcomponentswithstats函数返回更多信息,所以下面是应用程序。
进口
cv2
import numpy as np
# 读入图片
img = cv2.imread("001.jpg")
# 中值滤波,去噪
img = cv2.medianBlur(img, 3)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.namedWindow(original, cv2.WINDOW_AUTOSIZE)
cv2.imshow(original, 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)
# 连通域分析
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(bin_clo, connectivity=8)
# 查看各个返回值
# 连通域数量
print(num_labels = ,num_labels)
# 连通域的信息:对应各个轮廓的x、y、width、height和面积
print(stats = ,stats)
# 连通域的中心点
print(centroids = ,centroids)
# 每一个像素的标签1、2、3.。。,同一个连通域的标签是一致的
print(labels = ,labels)
# 不同的连通域赋予不同的颜色
output = np.zeros((img.shape[0], img.shape[1], 3), np.uint8)
for i in range(1, num_labels):
mask = labels == 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()
打印出的连通域的信息如下:
重点是理解stats和 labels 参数的意义,其他的参数都容易理解:
labels :对原始图中的每一个像素都打上标签,背景为0,连通域打上1,2,3。。。的标签,同一个连通域的像素打上同样的标签。相当与对每一个像素进行了分类(分割)
stats:每一连通域的信息,表示每个连通区域的外接矩形(起始点的x、y、宽和高)和面积
连通域检测的效果图:
3、总结
(1)连通域分析可以实现将前景目标提取出来以便后续进行处理(类似于轮廓处理)
(2)重点是cv2.connectedComponentsWithStats函数中stats和 labels 参数的意义
labels :对原始图中的每一个像素都打上标签,背景为0,连通域打上1,2,3。。。的标签,同一个连通域的像素打上同样的标签。相当与对每一个像素进行了分类(分割)
stats:每一连通域的信息,表示每个连通区域的外接矩形(起始点的x、y、宽和高)和面积
(3)从上面的例子可以看出,因物体有重叠会把不同物体的多个连通域 计为一个连通域,所以在连通域分析前可以先进行效果更好的分割和预处理操作。
以上就是OpenCV学习记录python实现连通域处理函数的详细内容,更多关于python opencv连通域处理函数的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。