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

  • 操作系统: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

图像输出:

在这里插入图片描述

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值