首页 > 其他分享 >OPenCV结构分析与形状描述符(5)查找图像中的连通组件的函数connectedComponents()的使用

OPenCV结构分析与形状描述符(5)查找图像中的连通组件的函数connectedComponents()的使用

时间:2024-09-05 12:50:17浏览次数:15  
标签:connectedComponents int 标签 CV OPenCV 描述符 参数 图像 cv

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

connectedComponents 函数计算布尔图像的连通组件标签图像。

该函数接受一个具有4或8连通性的二值图像,并返回 N,即标签总数(标签范围为 [0, N-1],其中 0 代表背景标签)。ltype 参数指定了输出标签图像的类型,这是基于标签总数或源图像中的像素总数的一个重要考虑因素。ccltype 参数指定了要使用的连通组件标签算法,目前支持 Bolelli(Spaghetti)[31]、Grana(BBDT)[108] 和 Wu(SAUF)[296] 算法,详见 ConnectedComponentsAlgorithmsTypes。请注意,SAUF 算法强制使用行主序(row-major order)的标签,而 Spaghetti 和 BBDT 不强制。如果至少有一个允许的并行框架被启用,并且图像的行数至少是 getNumberOfCPUs 返回值的两倍,该函数将使用并行版本的算法。

函数原型1


int cv::connectedComponents
(
	InputArray 	image,
	OutputArray 	labels,
	int 	connectivity,
	int 	ltype,
	int 	ccltype 
)		

参数1

  • 参数image 待标记的8位单通道图像。
  • 参数labels 目标标记图像。
  • 参数connectivity 8或4,分别表示8连通性或4连通性
  • 参数ltype 输出图像标签类型。目前支持 CV_32S 和 CV_16U。
  • 参数ccltype 连通组件算法类型(详见 ConnectedComponentsAlgorithmsTypes).

函数原型2

这是一个重载成员函数,提供方便。它与上述原型1的不同之处仅在于它接受的参数不同。

int cv::connectedComponents	
(
	InputArray 	image,
	OutputArray 	labels,
	int 	connectivity = 8,
	int 	ltype = CV_32S 
)		

参数2

  • 参数image: 要标记的8位单通道图像。
  • 参数labels: 目标标记图像(输出)。
  • 参数connectivity: 连通性设置,8表示8邻接,4表示4邻接。
  • 参数ltype: 输出图像的标签类型。目前支持 CV_32S(32位有符号整型)和 CV_16U(16位无符号整型)。

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
    // 创建一个简单的二值图像
    cv::Mat img = cv::Mat::zeros( 300, 300, CV_8UC1 );

    // 添加一些连通区域
    cv::rectangle( img, cv::Rect( 50, 50, 100, 100 ), cv::Scalar( 255 ), cv::FILLED );
    cv::rectangle( img, cv::Rect( 150, 150, 100, 100 ), cv::Scalar( 255 ), cv::FILLED );

    // 显示原始二值图像
    cv::imshow( "Binary Image", img );
   
    // 初始化输出标签图像
    cv::Mat labels;
    int nr_components;

    // 使用8连通性来寻找连通组件
    nr_components = cv::connectedComponents( img, labels, 8, CV_32S, cv::CCL_WU );

    // 打印连通组件的数量
    std::cout << "Number of components: " << nr_components << std::endl;

    // 将标签图像转换为8位单通道图像
    cv::Mat labels_8u;
    labels.convertTo( labels_8u, CV_8U, 255.0 / ( nr_components - 1 ) );

    // 将标签图像可视化
    cv::Mat vis;
    cv::applyColorMap( labels_8u, vis, cv::COLORMAP_JET );

    // 显示标签图像
    cv::imshow( "Labeled Image", vis );
    cv::waitKey( 0 );

    return 0;
}

运行结果

终端输出:

Number of components: 2

图像输出:

在这里插入图片描述

标签:connectedComponents,int,标签,CV,OPenCV,描述符,参数,图像,cv
From: https://blog.csdn.net/jndingxin/article/details/141927902

相关文章

  • OPenCV结构分析与形状描述符(3)计算一个点集的最小外接矩形的函数boundingRect()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述计算一个点集的最小右上边界矩形或灰度图像中的非零像素。该函数计算并返回指定点集或灰度图像中非零像素的最小右上边界矩形。在OpenCV中,boundingRect函数用于找到一个点集的最......
  • opencv全面详解教程
    opencv全面详解教程1.OpenCV简介2.安装OpenCV2.1使用pip安装(适用于Python)2.2通过conda安装2.3从源码编译(高级)3.OpenCV基本操作3.1读取和显示图像3.2保存图像3.3视频处理4.图像处理操作4.1调整大小和裁剪4.2颜色空间转换4.3图像平滑(滤波)4.4边......
  • OpenCV使用RTMP流
    使用RTMP流之前使用nginx进行推流sudoapt-getinstallnginxlibnginx-mod-rtmp配置文件中添加以下内容:rtmp{server{listen1935;chunk_size4096;applicationlive{liveon;recordoff;}}}Linux下安......
  • 《OpenCV计算机视觉》—— 图像轮廓检测与绘制
    文章目录一、轮廓的检测二、轮廓的绘制图像轮廓检测与绘制的代码实现三、轮廓的近似一、轮廓的检测轮廓检测是指在包含目标和背景的数字图像中,忽略背景和目标内部的纹理以及噪声干扰的影响,采用一定的技术和方法来实现目标轮廓提取的过程注意:做轮廓检测前需要将图片......
  • 《OpenCV计算机视觉》—— 模板匹配
    文章目录一、模板匹配简单介绍二、三个主要函数的介绍1.执行模板匹配函数-cv2.matchTemplate()2.查找最佳匹配函数-cv2.minMaxLoc()3.在原图上绘制匹配区域函数-cv2.rectangle()三、代码实现一、模板匹配简单介绍在Python中,模板匹配是一种在图像中查找与给定模板最......
  • OpenCV 之图像平滑处理
    引言图像平滑处理(也称为“模糊处理”)是计算机视觉中一项非常基础的技术,常用于减少图像噪声或失真,提高图像质量。平滑处理可以通过各种滤波器实现,常见的滤波器包括均值滤波、方框滤波、高斯滤波和中值滤波。本文将详细介绍这些滤波器的原理及其在OpenCV中的具体实现。基础概......
  • opencv轮廓近似,模板匹配
    在图像处理领域,轮廓近似和模板匹配是两种非常关键的技术,它们广泛应用于计算机视觉、图像分析和图像识别等多个方面。本文将详细介绍如何使用OpenCV库进行轮廓近似和模板匹配,并给出具体的代码示例。一、轮廓近似(ContourApproximation)轮廓近似是指将图像中的轮廓逼近成由直线......
  • 【全网独家】OpenCV: 影像格式(Mat)
    OpenCV:影像格式(Mat)介绍在OpenCV中,Mat是一个非常重要的数据结构,用于表示二维的图像数据。它能够支持多种类型的数据存储,包括灰度图、彩色图以及多通道图像。特点多维矩阵:支持多维度矩阵操作。高效内存管理:使用引用计数来确保内存资源安全且高效地释放。灵活性:......
  • 【OpenCV】手势识别实现电脑音量控制
            从AdvanceComputerVisionwithPython-ComputerVisionZone 这个网站上找到了一些有关人脸识别和手势识别的示例代码与课程,记录一下学习的过程和结果,Python初学,写得比较基础。            代码基本是流程类的代码,核心功能在导入的库中......
  • 图像边缘检测技术详解:利用OpenCV实现Sobel算子
    图像边缘检测技术详解:利用OpenCV实现Sobel算子前言Sobel算子的原理代码演示结果展示结语前言  在数字图像处理的广阔领域中,边缘检测技术扮演着至关重要的角色。无论是在科学研究、工业自动化,还是在日常生活中的智能设备中,我们都需要从图像中提取有用的信息。边缘,作......