OpenCV(二十八):连通域分割
目录
1.介绍连通域分割
2.像素领域介绍
3.两遍法分割连通域
4.连通域分割函数
1.介绍连通域分割
连通域分割是一种图像处理技术,用于将图像中的相邻像素组成的区域划分为不同的连通域。这些像素具有相似的特性,如相近的灰度值或颜色。连通域分割可以用于物体检测、图像分割、目标跟踪等应用。
2.像素领域介绍
在连通域分割中,常用的领域关系有四领域和八领域。
- 四领域表示一个像素与其上下左右四个相邻像素连接。
- 八领域表示一个像素与其上、下、左、右、左上、右上、左下、右下八个相邻像素连接。
3.两遍法分割连通域
(橙色区域为目标物体,即前景像素)
1,第一遍扫描:
a. 从上往下,从左往右遍历图像的每个像素,检查其是否属于前景像素(包括目标物体)。如果是前景像素,则进行以下操作:
-
检查其上方和左方的像素
(1) 如果都是前景像素, 则取两者中像素的标签的最小值作为当前像素的标签。
(2)如果只有一个是前景像素,则将当前像素标记为该前景像素的标签。
(3) 如果两个方向都没有前景像素,则将当前像素标记为新的数字标签。(数字标签 从1开始,然后不断+1递增)
第一遍扫描的结果:
2.第二遍扫描:
a. 将同一连通区域内的不同相邻标签合并,取标签的最小值,使每个连通域只有一个标签。
第二遍扫描结果:
4.连通域分割函数
4.1只分割连通域的函数 connectedComponents()
int cv::connectedComponents ( InputArray image,
OutputArray labels,
int connectivity =8,
int ltype = CV_32S
)
- image:待标记不同连通域的图像单通道,数据类型必须为CV 8U。
- labels:标记不同连通域后的输出图像,与输入图像具有相同的尺寸。
- connectivity:标记连通域时使用的邻域种类,4表示4-邻域,8表示8-邻域,默认参数为8。
- ltype:输出图像的数据类型,目前支持CV 32S和CV 16U两种数据类型,默认参数为CV 32S
示例代码:
void connect_f(Mat image){Mat rice,riceBW;//将图像转成二值图像,用于统计连通域cvtColor(image,rice,COLOR_BGR2GRAY);threshold(rice,riceBW,50,255,THRESH_BINARY);//生成随机颜色,用于区分不同连通域RNG rng(10086);Mat out;int number= connectedComponents(riceBW,out,8,CV_16U);//统计图像中连通域的个数vector<Vec4b> colors;for(int i=0;i<number;i++){//使用均匀分布的随机数确定颜色Vec4b vec4=Vec4b(rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256));colors.push_back(vec4);}//以不同颜色标记出不同的连通域Mat result=Mat::zeros(rice.size(),image.type());int w=result.cols;int h=result.rows;for(int row=0;row<h;row++){for(int col=0;col<w;col++){int label=out.at<uint16_t>(row,col);if(label==0){//背景的黑色不改变continue;}result.at<Vec4b>(row,col)=colors[label];}}//显示结果imwrite("/sdcard/DCIM/result.png",result);
}
4.2分割并统计连通域信息的函数connectedComponentsWithStats()
int cv::connectedComponentsWithStats ( InputArray image,
OutputArray labels,
OutputArray stats,
OutputArray centroids,
int connectivity =8,
int ltype = CV_32S
)
- image:待标记不同连通域的图像单通道,数据类型必须为CV_8U。
- labels:标记不同连通域后的输出图像,与输入图像具有相同的尺寸。
- stats:不同连通域的统计信息矩阵,矩阵的数据类型为CV 32S。阵中第i行是标签为i的连通域的统计特性。
- centroids:每个连通域的质心坐标,数据类型为CV 64F。
- connectivity:标记连通域时使用的邻域种类,4表示4-邻域,8表示8-邻域,默认参数值为8。
- ltype: 输出图像的数据类型,目前只支持CV 32S和CV 16U这两种数据类型,默认参数值为CV_32S。
示例代码:
//统计连通域信息
void connectedComponentsWithStats_f(Mat image){Mat rice,riceBW;//将图像转成二值图像,用于统计连通域cvtColor(image,rice,COLOR_BGR2GRAY);threshold(rice,riceBW,50,255,THRESH_BINARY);Mat stats,centroids,out;int number= connectedComponentsWithStats(riceBW,out,stats,centroids,8,CV_16U);vector<Vec4b> colors;RNG rng(10086);for(int i=0;i<number;i++){//使用均匀分别的随机数确定颜色Vec4b vec4=Vec4b(rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256));colors.push_back(vec4);}//以不同颜色标记出不同的连通域for(int i=1;i<number;i++){//中心位置int center_x=centroids.at<double>(i,0);int center_y=centroids.at<double>(i,1);//矩形边框int x=stats.at<int>(i,CC_STAT_LEFT);int y=stats.at<int>(i,CC_STAT_TOP);int w=stats.at<int>(i,CC_STAT_WIDTH);int h=stats.at<int>(i,CC_STAT_HEIGHT);int area=stats.at<int>(i,CC_STAT_AREA);//中心位置绘制circle(image,Point(center_x,center_y),2,Scalar(0,255,0),2,8,0);//外接矩形Rect rect(x,y,w,h);rectangle(image,rect,colors[i],1,8,0);putText(image, format("%d",i),Point(center_x,center_y),FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,255),1);ostringstream ss;ss << "number:" <<i<<",area:"<<area<< std::endl;}//显示结果imwrite("/sdcard/DCIM/image_Markers.png",image);
}
相关文章:

OpenCV(二十八):连通域分割
目录 1.介绍连通域分割 2.像素领域介绍 3.两遍法分割连通域 4.连通域分割函数 1.介绍连通域分割 连通域分割是一种图像处理技术,用于将图像中的相邻像素组成的区域划分为不同的连通域。这些像素具有相似的特性,如相近的灰度值或颜色。连通域分割可以…...

达梦控制台还原报错“管道失败”
达梦数据库控制台还原报错“管道失败” 环境 主机操作系统:windows10 profession 达梦数据库版本:达梦7 问题背景 全新安装达梦7数据库后,创建数据库实例,需要恢复往期bat备份。在控制台配置指定搜索目录后,获取备份时…...

[杂谈]-快速了解直接内存访问 (DMA)
快速了解直接内存访问 (DMA) 文章目录 快速了解直接内存访问 (DMA)1、使用 DMA 需要什么?2、DMA介绍3、DMA 中的数据传输如何进行?4、DMA接口5、DMAC 控制器寄存器6、DMA 控制器编程模式6.1 突发模式(Burst Mode)6.2 循环窃取模式…...
java八股文面试[设计模式]——23种设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结 在GOF编写的设计模式(可复用面向对象软件的基础)一书中说道: 本书涉及的设计模式并不描述新的或未经证实的设计,我们只收录那些在不同系统中…...

mysql(十)mysql主从复制--主库切换
概述 可能为了更迭升级服务器,或者主库出现问题,又或者只是希望重新分配容量,此时需要切换主库。 如果这是计划内的切换,会相对容易点。只需要在从库上使用CHANGE MASTER TO命令,并设置合适的值。大多数的值都是可选…...
vue3项目的src下的各个文件夹介绍
在Vue 3项目中,通常的目录结构如下所示: src/|- assets/ # 存放静态资源文件,如图片、字体等|- components/ # 存放可复用的Vue组件|- views/ # 存放页面级别的Vue组件|- router/ # 存放路由相关的配置文件|- store…...
五、编译预处理
源程序编译预处理命令一律以‘#’开头 5.1宏定义 不带参数的宏定义 # define 宏名 字符串 宏命令之后,出现宏名的地方均用其对应的字符串来替换。 宏替换是一种”机械替换“,宏定义语句后一般不加分号,因为它仅具有替换功能,…...

应用出海,Google 分享如何让数字营销素材再上层楼
数字营销广告要想取得理想的效果,广告素材是最关键的决定因素之一。 事实上米贸搜谷歌推广发现,在广告给品牌带来的销售额增量中,有 47% 都归功于广告素材。在当今自动化时代,广告素材的作用尤其重要:固然机器可以完成…...

酱香咖啡喝了没?用数据分析揭秘瑞幸咖啡的7500万用户增长策略
瑞幸 X 茅台 这波联名赢麻了,不仅狂卖 542 万杯,甚至带动茅台市值飙升200亿。 瑞幸这几年联名搞了不少,又是线条小狗的爱情故事,又是椰树、维密、周大福、足球的,下面老李就从数据分析角度,带大家来看一下…...

Grafana之魔法:揭秘数据可视化的艺术
在数据驱动的时代,如何有效地呈现和理解数据成为了每个组织和个人的核心任务。Grafana作为一个领先的开源数据可视化工具,为我们提供了强大的功能和灵活性。本文将深入探讨Grafana的魔法,以及它如何帮助我们更好地理解数据。 Grafana简介 G…...

c高级day2作业
写一个1.sh脚本,将以下内容放到脚本中: 在家目录下创建目录文件,dir 在dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中, 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz…...

第3章 【MySQL】字符集和比较规则
3.1 字符集和比较规则简介 3.1.1 字符集简介 如何存储字符串?需要建立字符与二进制数据的映射关系。建立这个关系需要: 1.把哪些字符映射成二进制数据? 2.怎么映射? 将一个字符映射成一个二进制数据的过程也叫做 编码 &#…...

2023 年全国大学生数学建模D题目-圈养湖羊的空间利用率
D题目应该是专科题目???不确定了 感觉类似一个细胞分裂问题一样,1,2,4,8, 题目1中规中矩 按照前面说的分配方法,一步一步计算进行 缺口的问题考虑反推回去,…...

攻防世界-WEB-ics-05
打开靶机 只有设备维护中心可以点开 点标签得到新的url pageindex 想到文件包含漏洞(URL中出现path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼 利用php伪协议查看源码 出现一段base64源码,进行转码得出源码 ?pagephp://filter…...
typedef的四种用法
目录 前言 1)为基本数据类型定义类型名 2)为自定义数据类型(结构体、枚举、共用体)定义别名 3)为数组定义简易的别名 4)为指针定义简洁的名称 前言 在看工程的过程中发现typedef的如下用法,…...

Rstudio开不开了怎么办?R is taking longer to start than usual
Rstudio Server 启动时卡死 在使用 linux 服务器版 RstudioServer 的过程中,发现出现了一个问题,导致没有办法正常载入工作页面,网页提示信息是“R is taking longer to start than usual”,直接翻译过来就是“这次启动 R 会比平…...
kubernetes 集群安装加载 br_netfilter 模块
kubernetes 集群安装加载 br_netfilter 模块 Linux 系统默认是禁止数据包转发功能。 加载系统参数: # sysctl -p /etc/sysctl.d/k8s.conf 错误提示: sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or director…...

CATIA Composer软件安装包分享(附安装教程)
目录 一、软件简介 二、软件下载 一、软件简介 CATIA(Computer-Aided Three-dimensional Interactive Application)是一款由法国达索系统公司开发的三维计算机辅助设计(CAD)软件。它是一种全面的产品开发解决方案,广泛…...

入行测试一年半的心得体会
成为xx一员测试已经有1年半了,一直没有真正坐下来花些时间将自己的思路理清一下。刚好近期公司落地了OKR,给自己制定了OKR之后思路终于开始清晰起来,朦朦胧胧地开始看清了远方的路,麻着胆子分析一下自己,毕竟摸黑走路的…...

Vue的props配置项
简介:Vue中的组件模板是可以复用的,但是模板中的数据是可以改变的。props配置项用于解决组件迁移复用时接受和保存传递给组件的数据的问题。 1.如何给组件传递数据? 答:按照key:value的形式进行传递。 2.如何保存传递给组件的数…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...