【OpenCV】连通域处理函数cv2.connectedComponentsWithStats和cv2.connectedComponents

2023-05-16

1 两个函数介绍

        总得来说,connectedComponents()仅仅创建了一个标记图(图中不同连通域使用不同的标记,和原图宽高一致),connectedComponentsWithStats()可以完成上面任务,除此之外,还可以返回每个连通区域的重要信息–bounding box, area, andcentroid。

1.1 什么是连通域

        连通区域一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域。连通区域分析是指将图像中的各个连通区域找出并标记。
        连通区域分析是一种在图像分析处理的众多应用领域中较为常用和基本的方法。例如:OCR识别中字符分割提取(车牌识别、文本识别、字幕识别等)、视觉跟踪中的运动前景目标分割与提取(行人入侵检测、遗留物体检测、基于视觉的车辆检测与跟踪等)、医学图像处理(感兴趣目标区域提取)、等等。也就是说,在需要将前景目标提取出来以便后续进行处理的应用场景中都能够用到连通区域分析方法,通常连通区域分析处理的对象是一张二值化后的图像。

1.2 cv2.connectedComponents

函数各参数意义:

num_objects, labels = cv2.connectedComponents(image)

参数介绍如下:

image:也就是输入图像,必须是二值图,即8位单通道图像。(因此输入图像必须先进行二值化处理才能被这个函数接受)
返回值:
num_labels:所有连通域的数目
labels:图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域)

1.3 cv2.connectedComponentsWithStats

这个函数的作用是对一幅图像进行连通域提取,并返回找到的连通域的信息:retval、labels、stats、centroids

num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(image, connectivity=8, ltype=None)

参数介绍如下:

image:也就是输入图像,必须是二值图,即8位单通道图像。(因此输入图像必须先进行二值化处理才能被这个函数接受)
connectivity:可选值为4或8,也就是使用4连通还是8连通。
ltype:输出图像标记的类型,目前支持CV_32S 和 CV_16U。 返回值:
返回值:
num_labels:所有连通域的数目
labels:图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域)
stats:每一个标记的统计信息,是一个5列的矩阵,每一行对应每个连通区域的外接矩形的x、y、width、height和面积,示例如下: 0 0 720 720 291805
centroids:连通域的中心点

2、代码实践

        两个代码的用处是共通的,cv2.connectedComponentsWithStats函数返回的信息量更大,所以这里展示它的应用。

import 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)从上面的例子可以看出,因物体有重叠会把不同物体的多个连通域 计为一个连通域,所以在连通域分析前可以先进行效果更好的分割和预处理操作。
————————————————
来源:https://blog.csdn.net/qq_40784418/article/details/106023288

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【OpenCV】连通域处理函数cv2.connectedComponentsWithStats和cv2.connectedComponents 的相关文章

  • 将 OpenCV 的 findHomography 透视矩阵转换为 iOS 的 CATransform3D

    我想获取从 OpenCV 返回的透视变换矩阵findHomography http docs opencv org modules calib3d doc camera calibration and 3d reconstruction h
  • 如何在运行 Tensorflow 推理会话之前批处理多个视频帧

    我做了一个项目 基本上使用谷歌对象检测 API 和张量流 我所做的就是使用预先训练的模型进行推理 这意味着实时对象检测 其中输入是网络摄像头的视频流或使用 OpenCV 的类似内容 现在我得到了相当不错的性能结果 但我想进一步提高 FPS
  • OpenCV SURF功能未实现

    当我尝试运行示例时find obj cpp或任何 OpenCV SURF 程序 在执行代码时 我在命令提示符中收到以下错误 该项目构建时没有错误和警告 我使用的是 VS2011 beta OpenCV 2 4 和 windows7 错误信息
  • 在 JavaCameraView 中设置帧速率

    我想使用 JavaCameraView 将帧速率设置为 1 fps 当我打开相机时 帧速率约为 20 fps 我的目的是改变这个值 单击按钮后 1 fps 有人可以帮助我吗 我在互联网上搜索了很多 但我找不到任何有趣的东西 在文档中也htt
  • 使用额外模块构建 opencv 错误 ocv_download

    我尝试使用 Extramodules 构建 openCV 如果我尝试使用 cmake 配置项目文件 Windows 10 上的 vc14 x32 则会出现错误 opencv contrib master modules xfeatures2
  • 如何使用浮点数组中的数据初始化 cv::Mat

    我需要创建一个cv Mat用我的数据初始化的变量float 大批 这应该是基本的 但我很难弄清楚 我有代码 float matrixAB lt 120 floating point array created elsewhere gt cv
  • 如何对使用 SimpleITK 读取的 DICOM 图像进行直方图均衡化

    我正在尝试对从 nii gz 文件读取的所有图像进行直方图均衡 我试过这段代码 import SimpleITK as sitk flair file content gdrive My Drive Colab Notebooks FLAI
  • C++/OpenCV - 用于视频稳定的卡尔曼滤波器

    我尝试使用卡尔曼滤波器稳定视频以进行平滑 但我有一些问题 每次 我都有两帧 一帧是当前帧 另一帧是当前帧 这是我的工作流程 计算 goodFeaturesToTrack 使用 calcOpticalFlowPyrLK 计算光流 只保留优点
  • 从霍夫线中选择线

    I m using Hough Lines to do corner detection for this image i plan to find the intersection of the lines as the corner T
  • 霍夫变换的累加器填充

    我写了一段需要优化的代码 只是想与社区核实一下该代码是否确实是最佳的 它填充霍夫变换的累加器 实际上 我只是复制粘贴了 OpenCV 库中的大部分代码 谢谢 int i j n index for i 0 i
  • 如何加载4通道的png图像?

    我一直在尝试加载带有透明通道 RGB 和 Alph 的 png 文件 但没有成功 看来 openCV 从图像中剥离了第四个通道 即使我必须修改 OpenCV 源代码并重建它 是否有任何方法可以加载包含 alpha 通道在内的完整 4 个通道
  • 在 OpenCV 中对 RGB 图像进行阈值处理

    我有一个彩色图像 我想在 OpenCV 中设置阈值 我想要的是 如果任何 RGB 通道低于某个值 则将所有通道中的值设置为零 即黑色 因此 我使用 opencv 阈值函数 cv Mat frame thresholded read fram
  • Aruco 标记与 openCv,获取 3d 角坐标?

    我正在使用 opencv 3 2 检测打印的 Aruco 标记 aruco estimatePoseSingleMarkers corners markerLength camMatrix distCoeffs rvecs tvecs 这将
  • 向 ca cv::Mat 添加文本比 cv::putText() 更好的方法吗?

    我想在 a 上添加一些文字cv Mat but cv putText 对我来说不够灵活 结盟 我需要将可变长度的标签放在运行时已知的几个像素位置 但由于cv putText 将输出的原点始终放在左侧 如果位置离左侧太远 我的文本就会消失在图
  • 增加图像亮度而不溢出

    我在尝试增加图像亮度时遇到问题 这是原始图像 我想要得到的图像是这样的 现在使用以下代码增加亮度 image cv2 imread home wni vbshare tmp a4 index2 png 0 if sum image 0 le
  • 如何在win32上安装OpenCV 2.0

    我需要在 Win32 上安装 OpenCV 我目前没有安装它 我下载了 OpenCV 2 0 0a win32 exe 并运行它 我现在到底该怎么办 没有 lib之类的东西 我找到了一些使用 cmake 构建版本的说明 http openc
  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • 为 Visual Studio 安装 openCV 2.4 for C/C++

    我一整天都在尝试在 Windows 7 上的 C C 上安装 Visual Studio 2010 的 OpenCV 版本 2 4 1 和 2 4 2 我一直在关注这个教程 http docs opencv org trunk doc tu
  • 如何使用 OpenCV 找到红色区域? [复制]

    这个问题在这里已经有答案了 我正在尝试编写一个检测红色的程序 然而有时它比平常更暗 所以我不能只使用一个值 检测不同深浅的红色的最佳范围是多少 我目前使用的范围是 128 0 0 255 60 60 但有时它甚至检测不到我放在它前面的红色物
  • 在opencv中保存帧而不压缩

    我正在尝试使用写 OpenCV 函数 我想保存帧 TIFF扩大 我遇到的问题是保存的图像被压缩 所以我无法使用它们 知道如何摆脱这种压缩吗 提前致谢 不要介意西奇说的话 TIFF 标志通过 LZW 压缩硬编码在 opencv 二进制文件中

随机推荐