oepncv c++ 连通组件扫描

news2024/9/25 15:28:12

1、概念

        连通组件指在图像上通过四邻域八邻域法,连接起来的像素值大于某一阈值的区域(这些像素点被称为前景像素),而小于阈值的区域被称为背景。如下图的4个连通组件。

         四邻域、八邻域:

 

2、常用算法

a)基于像素的扫描方法                                      b)基于块的扫描方法

 说明:与卷积类似,利用上述模板在图像上平移扫描前景像素,则扫描区域内其余的前景像素与当前像素连通。

 c)两步法扫描

        1、同样采用像素模板对图像进行扫描,给予其标记,并获得等价队列(连通的不同标记队列)。

        

         2、将一个等价队列中的标记全部置为最小标记值,如上{1,3,5}队列全置为1。

        

d)opencv中的连通组件扫描算法——BBDT

c_{1}true判定:

        将上图左边的块模板分为右边所示的大块分区P、Q、R、S、X。要获取块X与块P连通的结论(c_{1}),则需满足,小像素点h和o均为前景像素。

3、代码示例:

3.1、 API:


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

int cv::connectedComponentsWithStats(	InputArray 	image,
                                        OutputArray 	labels,
                                        OutputArray 	stats,
                                        OutputArray 	centroids,
                                        int 	connectivity,
                                        int 	ltype,
                                        int 	ccltype 
                                     )	

labels——带标记的与输入图像同大小类型的图像。 

stats——每个连通组件的(包括背景)的外接矩形信息,具体如下:

 centroids——每个连通组件的(包括背景)的中心坐标信息,数据类型为CV_64F

connectivity——邻域连通方法,4/8邻域。

ltype——输出label图像类型,目前仅有CV_32S 和CV_16U类型可选用。

ccltype ——连通组件扫描方法,可选用如下方法:

 connectedComponents 示例:

void QuickDemo::scan_neighbor(Mat& image)
{
	//高斯模糊
	GaussianBlur(image, image, Size(3, 3), 0);
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);

	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
	namedWindow("adaptiveThreshold", WINDOW_FREERATIO);
	imshow("adaptiveThreshold", binary);
	Mat labels = Mat::zeros(binary.size(), binary.type());
	int num_label = connectedComponents(binary, labels, 8, CV_32S, CCL_DEFAULT);

	//显示labels

	//1、生成颜色数组
	RNG rng(12345);
	vector<Vec3b> colorTable(num_label);//定义一个num_label维度的空数组
	colorTable[0] = Vec3b(0, 0, 0);//将背景颜色置为黑色
	for (int i = 1; i < num_label; ++i) {
		//对其余标签赋予颜色数据
		colorTable[i] = Vec3b(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
	}
	Mat result = Mat::zeros(image.size(), image.type());
	//2、通过循环对不同的标签填入随机生成的颜色
	int h = image.rows, w = image.cols;
	for (int row = 0; row < h; ++row) {
		for (int col= 0; col < w; ++col) {
			int label = labels.at<int>(row, col);//将labels图像上对应像素坐标上的标记值取出
			result.at<Vec3b>(row, col) = colorTable[label];//将result图像上对应像素坐标赋予颜色
		}
	}
	//在图像上显示有多少个字体
	putText(result, format("number of %d", num_label - 1), Point(50, 50), FONT_HERSHEY_PLAIN, 3, Scalar(0, 50, 70), 1);
	namedWindow("labels", WINDOW_FREERATIO);
	imshow("labels", result);
}

connectedComponentsWithStats示例:

void QuickDemo::scan_neighbor(Mat& image)
{
	//高斯模糊
	GaussianBlur(image, image, Size(3, 3), 0);
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);

	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
	namedWindow("adaptiveThreshold", WINDOW_FREERATIO);
	imshow("adaptiveThreshold", binary);
	Mat labels = Mat::zeros(binary.size(), binary.type());
	Mat stats, centroids;
	int num_label = connectedComponentsWithStats(binary, labels,stats,centroids, 8, CV_32S, CCL_DEFAULT);

	//显示labels

	//1、生成颜色数组
	RNG rng(12345);
	vector<Vec3b> colorTable(num_label);//定义一个num_label维度的空数组
	colorTable[0] = Vec3b(0, 0, 0);//将背景颜色置为黑色
	for (int i = 1; i < num_label; ++i) {
		//对其余标签赋予颜色数据
		colorTable[i] = Vec3b(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
	}
	Mat result = Mat::zeros(image.size(), image.type());
	//2、通过循环对不同的标签填入随机生成的颜色
	int h = image.rows, w = image.cols;
	for (int row = 0; row < h; ++row) {
		for (int col = 0; col < w; ++col) {
			int label = labels.at<int>(row, col);//将labels图像上对应像素坐标上的标记值取出
			result.at<Vec3b>(row, col) = colorTable[label];//将result图像上对应像素坐标赋予颜色
		}
	}
	//绘制外接矩形和中心点圆
	for (int i = 1; i < num_label; ++i) {
		//先获取连接组件的中心坐标
		int cx = centroids.at<double>(i, 0);
		int cy = centroids.at<double>(i, 1);
		int x = stats.at<int>(i, CC_STAT_LEFT);//矩形左边界与整个图像左边的距离
		int y = stats.at<int>(i, CC_STAT_TOP);//矩形上边界与整个图像上边的距离
		int width = stats.at<int>(i, CC_STAT_WIDTH);//矩形宽度
		int height = stats.at<int>(i, CC_STAT_HEIGHT);//矩形高度
		int area = stats.at<int>(i, CC_STAT_AREA);//矩形面积

		//绘制
		circle(result, Point(cx, cy), 3, Scalar(0, 0, 255), 2, 8);
		// 外接矩形
		Rect box(x, y, width, height);
		rectangle(result, box, Scalar(0, 255, 0), 2, 8);
		putText(result, format("%d", area), Point(x, y), FONT_HERSHEY_PLAIN, 3, Scalar(0, 50, 70), 1);
	}
	namedWindow("labels", WINDOW_FREERATIO);
	imshow("labels", result);
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

35岁程序员,都到哪儿去了?

在很多人眼里&#xff0c;程序员的薪资就是普通人的天花板。关于程序员35岁被优化这个亘古不变的话题&#xff0c;也有不少人冷嘲热讽&#xff1a;你花10年的时间赚到了我30年、40年都赚不到的钱&#xff0c;有什么好焦虑不满呢&#xff1f;钱还不够用吗&#xff1f; 而那些年纪…

榛子云短信验证平台与springboot集成的短信验证

登录 - 榛子云短信用户系统 (zhenzikj.com) 上面是登录榛子云短信验证平台的入口&#xff0c;此平台的短信大概为3.1分一条短信。 如何与spring boot进行集成呢&#xff0c;我以注册为例来慢慢讲解 1.注册号榛子云账号并充值可发送短信 2.在项目pom.xml导入jar包 <!-- 榛…

HTML+CSS+JS我的班级网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

位运算介绍、图解位运算相关题目【一个数字出现了K次,其他数字出现了M次,M > 1 K < M 找到出现了K次的数】【找到出现奇数次的数】等题目

位运算 常见的位运算 >>、>>>、<<、|、&、^、||、&&、~等 原码、反码、补码 原码 将一个整数转换成二进制形式&#xff0c;就是其原码。例如 6 原码就是……0000 0000 0000 0110 反码 对于正数&#xff0c;它的反码就是其原码&#xff08;…

节省50%带宽,这款媒体处理产品了解下!

视频处理技术想必大家都有所了解&#xff0c;现在每天都会涌现出大量新的视频处理模型&#xff0c;它们有的能够超分、降噪&#xff0c;有的能够做目标检测、跟踪、识别&#xff0c;加上一些前端技术就能实现很多炫酷的功能。但是现在大多数模型都是单任务模型&#xff0c;想要…

【POJ No. 2777】 颜色统计 Count Color

【POJ No. 2777】 颜色统计 Count Color 北大OJ 题目地址 【题意】 有一个长L 厘米的电路板&#xff0c;可以将板均分为L 段&#xff08;1&#xff5e;L &#xff09;&#xff0c;每段长1厘米。现在给电路板上色&#xff0c;每段只有一种颜色。可以在电路板上执行两种操作&am…

Qt扫盲-Assistant 助手使用总结

Qt Assistant助手 使用记录预备一、顶部菜单栏1. 快捷栏2. 文件、前往、帮助3. 查看-工具栏4. 编辑-首选项5. 书签二、侧边菜单栏1. 修改显示功能Bar2. 内容3. 索引4. 书签三、内容主体1. 结构总览 Content2. Properties3. Public Functions4. Reimplemented Public Functions5…

【JUC】并发编程学习笔记(三)

JUC并发编程八、ReentrantReadWriteLock 读写锁8.1、概述8.2、案例8.3、读写锁的降级九、BlockingQueue阻塞队列9.1、阻塞队列概述9.2、阻塞队列分类9.2.1、ArrayBlockingQueue(常用)9.2.2、LinkedBlockingQueue(常用)9.2.3、 DelayQueue9.2.4、 PriorityBlockingQueue9.2.5、 …

混合馈能悬架的设计与仿真(MATLAB)

目 录 摘 要 I Abstract II 第一章 绪论 1 1.1课题研究背景和意义 1 1.2国内外研究现状 2 1.3本文的主要研究内容 4 第二章 混合馈能悬架系统的工作原理 5 2.1混合馈能悬架系统的设计理念 5 2.2馈能系统的原理 6 2.3馈能系统的类型 6 2.4混合馈能悬架系统结构选型 8 2.5本章小结…

技术分享 | 如何确保API 的稳定性与正确性?你只需要这一招

现在&#xff0c;越来越多的 Web 应用转向了RESTful的架构&#xff0c;很多产品和应用暴露给用户的往往就是一组 REST API&#xff0c;这样有一个好处&#xff0c;用户可以根据需要&#xff0c;调用不同的 API&#xff0c;整合出自己的应用出来。从这个角度来讲&#xff0c;Web…

前端字体压缩(免费简单易上手)

场景&#xff1a;前端在开发过程中有时候要用到特殊字体&#xff0c;但如果引用网上下载好的字体&#xff0c;它们都是一个全的字体文件&#xff0c;这种字体文件里往往包含了大量你用不到的文字字符&#xff0c;从而导致你引入的字体文件大小高达1M以上&#xff0c;这会严重影…

C++08函数模板

1.自动推导类型 在C语言和C98中&#xff0c;auto 关键字用于修饰变量(自动存储的局部变量)。 在C11中&#xff0c;赋予了auto 全新的含义&#xff0c;不再用于修饰的变量&#xff0c;而是作为一个类型指示符&#xff0c;指示编译器在编译时推导auto声明的变量的数据类型。 在…

SpirngBoot<读完包你更上一层楼>

目录 一、SpringBoot概念 1.1 什么是SpringBoot 1.2 为什么要学习SpringBoot 1.3 SpringBoot的特点 1.4 总结 二、入门案例 2.1 创建工程 2.1.1 创建一个空工程 2.1.2 工程名为project_test&#xff1a; 2.1.3 设置jdk版本为1.8 2.1.4 新建一个module 2.1.5 填写项…

入职字节外包一个月,我离职了

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

[附源码]计算机毕业设计springboot吾悦商城管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

老司机带带你,教你学会Java中又骚又暴力的“反射”技术

在Java中有这么一个很骚的技术&#xff0c;几乎贯穿了所有主流的框架&#xff0c;在所有主流框架的底层中你都可以看见它的身影&#xff0c;这个技术就是反射。关于反射&#xff0c;有很多小白会觉得很难&#xff0c;搞不清楚到底是怎么回事&#xff0c;也不知道该怎么用&#…

VS Code快速实现Git PR操作

注意&#xff1a;建议先学习git的基本操作。 安装插件 下图中红圈标记的插件都安装好。 Fork上游仓库 在网页上点击你想要fork的仓库&#xff0c;点击fork 然后该仓库就会fork到你的github账户下面&#xff0c;如下图。 现在可以在你账户下面的repo&#xff08;我们称为下…

[附源码]Python计算机毕业设计Django和vue的茶文化交流平台的设计与实现

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Global Mapper 导出图层功能的妙用(重采样、设置文件类型、切片、按掩膜提取or裁剪……)

许多GIS软件都有导出的功能&#xff0c;但其中大部分的导出功能比较单一直接&#xff0c;仅仅是导出而已&#xff0c;或者最多可以改个导出的格式&#xff0c;改个坐标。但是Global Mapper 不一样&#xff0c;导出功能非常非常多&#xff0c;比如重采样&#xff08;可以设置重采…

Vue3框架的创建的两种种方案(第十二课)

1 VueCLi脚手架的安装 Home | Vue CLI (vuejs.org) 使用方法 | Yarn 中文文档 (bootcss.com) 3 Vite脚手架的安装 Vite | 下一代的前端工具链 4 使用的软件 Visual Studio Code webstorm64.exe IntelliJ IDEA 2022.2.3 HBuilder X 方案一 VueCLi脚手架的安装 1 创…