OpenCV(二十八):连通域分割

news2024/9/25 9:37:43

目录

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);
}

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

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

相关文章

(十一)人工智能应用--深度学习原理与实战--实现泰坦尼克号生存者预测案例Titanic Survival

泰坦尼克号生存者预测(Titanic Survival)是谷歌Kaggle人工智能大赛中的经典亲例。本任务要求根据给定的1300余位乘客的特征(姓名、性别、年龄、舱位等】及幸存情况(0-死亡,1-幸存】建立神经网络模型,能够较巿准确地预测测试集中乘客的幸存情况。 主要流程为: 数据的导人及预…

Json“牵手”当当网商品详情数据方法,当当商品详情API接口,当当API申请指南

当当网是知名的综合性网上购物商城&#xff0c;由国内著名出版机构科文公司、美国老虎基金、美国IDG集团、卢森堡剑桥集团、亚洲创业投资基金&#xff08;原名软银中国创业基金&#xff09;共同投资成立1。 当当网从1999年11月正式开通&#xff0c;已从早期的网上卖书拓展到网…

python批量下载csdn文章

声明&#xff1a;该爬虫只可用于提高自己学习、工作效率&#xff0c;请勿用于非法用途&#xff0c;否则后果自负 功能概述&#xff1a; 根据待爬文章url(文章id)批量保存文章到本地&#xff1b;支持将文中图片下载到本地指定文件夹&#xff1b;多线程爬取&#xff1b; 1.爬取…

I.MX RT1176笔记(9)-- 程序异常追踪(CmBacktrace 和 segger rtt)

前言 在使用 ARM Cortex-M 系列 MCU时候&#xff0c;有时候会遇到各种异常&#xff08;Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault&#xff09;&#xff0c;这时候我们根据经验查询PC指针&#xff0c;LR寄存器&#xff0c;堆栈数据定位地址然…

深入理解联邦学习——纵向联邦学习

分类目录&#xff1a;《深入理解联邦学习》总目录 假设进行联邦学习的数据提供方为 A A A和 B B B&#xff0c;第三方为 C C C&#xff0c;则纵向联邦学习步骤如下&#xff1a; 在系统级做加密样本对齐&#xff0c;在企业感知层面不会暴露非交叉用户对齐样本进行模型加密训练&…

day2_C++

day2_C 代码题思维导图 代码题 #include using namespace std;#define MAX 50struct StuData {private:int scoreArr[MAX];int num;public:void setNum(int num);void input();void sort();void show();int getnum();};void StuData::setNum(int num){this->num num; }vo…

c语言实训心得3篇集合

c语言实训心得体会一&#xff1a; 在这个星期里&#xff0c;我们专业的学生在专业老师的带领下进行了c语言程序实践学习。在这之前&#xff0c;我们已经对c语言这门课程学习了一个学期&#xff0c;对其有了一定的了解&#xff0c;但是也仅仅是停留在了解的范围&#xff0c;对里…

[杂谈]-快速了解直接内存访问 (DMA)

快速了解直接内存访问 (DMA) 文章目录 快速了解直接内存访问 (DMA)1、使用 DMA 需要什么&#xff1f;2、DMA介绍3、DMA 中的数据传输如何进行&#xff1f;4、DMA接口5、DMAC 控制器寄存器6、DMA 控制器编程模式6.1 突发模式&#xff08;Burst Mode&#xff09;6.2 循环窃取模式…

h5微传单制作教程:快速轻松制作

在当今社交媒体充斥的时代&#xff0c;微传单作为一种新型的宣传推广方式&#xff0c;成为了企业和个人在传播信息时的重要工具。h5微传单相比传统的纸质传单更加灵活多样&#xff0c;并且能够通过手机、平板等设备随时随地进行浏览和分享&#xff0c;具有很高的传播效果。下面…

20个经典巧妙电路合集

1、防反接保护&#xff08;二极管&#xff09; 在实际电子设计中&#xff0c;防反接保护电路非常重要&#xff0c;不要觉得自己肯定不会接错&#xff0c;实际上无论多么小心&#xff0c;还是会犯错误...... 最简单的就是利用二极管了&#xff0c;利用二极管的单向导电性&#…

荔枝集团:如何提升项目管理效能,让需求交付快进50%

导语&#xff1a; 随着市场竞争日益激烈&#xff0c;企业面临的压力越来越大&#xff0c;需要不断优化自身的效率和质量&#xff0c;以更好地应对市场变化和竞争压力。因此&#xff0c;效能改进已成为企业实现长期发展的关键要素。 研发浓度作为一种能够准确反映研发效率的指…

ubuntu上ffmpeg使用framebuffer显示video

这个主题是想验证使用fbdev(Linux framebuffer device&#xff09;&#xff0c;将video直接显示到Linux framebuffer上&#xff0c;在FFmpeg中对应的FFOutputFormat 就是ff_fbdev_muxer。 const FFOutputFormat ff_fbdev_muxer {.p.name "fbdev",.p.long_…

大数据技术之Hadoop:HDFS存储原理篇(五)

目录 一、原理介绍 1.1 Block块 1.2 副本机制 二、fsck命令 2.1 设置默认副本数量 2.2 临时设置文件副本大小 2.3 fsck命令检查文件的副本数 2.4 block块大小的配置 三、NameNode元数据 3.1 NameNode作用 3.2 edits文件 3.3 FSImage文件 3.4 元素据合并控制参数 …

你知道聊天机器人在医疗保健行业发挥了什么作用吗?

在医疗保健行业&#xff0c;时间限制、数据泄露、误诊、治疗延误和人为错误等各种挑战构成了重大问题。然而&#xff0c;人工智能&#xff08;AI&#xff09;的快速发展已成为解决这些问题的解决方案。一个特别值得注意的应用是医疗保健中的聊天机器人&#xff0c;它提供了一系…

Linux---应用层获取usb设备描述信息通过endpoint地址数据通讯

文章目录 &#x1f308;应用层获取USB设备信息总体思路&#x1f308;应用层代码实例&#x1f308;实例测试&#x1f308;应用层通过endpoint进行数据读写 &#x1f308;应用层获取USB设备信息总体思路 应用层可以打开USB设备的节点&#xff0c;读取包括USB设备的配置&#xff…

核心实验12合集_vlan高级配置:基于子网划分vlan超级vlan相同vlan 端口隔离 _ENSP

项目场景一&#xff1a; 核心实验12合集-1_vlan高级配置_ENSP 基于子网划分vlan &#xff11; 当检测ip在192.168.10.0/24时候&#xff0c;PC接入交换机时&#xff0c;将其划为vlan10&#xff0c; 且可以和vlan 10 的服务器通信。 2 当检测ip在192.168.20.0/24时候&#xff0c;…

配电室数字电力智慧平台

配电室数字电力智慧平台依托电易云-智慧电力物联网&#xff0c;采用先进的人工智能、物联网、大数据技术&#xff0c;对配电室进行全面监控和管理&#xff0c;实现电力运行的自动化和智能化&#xff0c;有效降低运维成本&#xff0c;提高电力运行安全和可靠性。 该平台可以实时…

CTFHUB ICS(2)

1.modbus 还是通过strings输出文件 发现这次只找到了flag的字符666c61677b就是flag的16进制 通过strings和grep配合输出为10个数量的数据 strings 6.pcap | grep -E "^.{10}$" grep 搜索文本的工具 -E 使用扩展正则表达式 ^ 表示行的开始 . 匹配任意单…

内网渗透之凭据收集的各种方式

凭据收集是什么&#xff1f; 凭据收集是获取用户和系统凭据访问权限的术语。 这是一种查找或窃取存储的凭据的技术&#xff0c;包括网络嗅探&#xff0c;攻击者可以在网络嗅探中捕获传输的凭据。 凭证可以有多种不同的形式&#xff0c;例如&#xff1a; 帐户详细信息&#xf…

用上这个建筑管理技巧,我才知道有多省事!

在过去的几十年里&#xff0c;建筑和施工行业取得了巨大的进步。然而&#xff0c;这个行业也一直在不断面临挑战&#xff0c;如高成本、时间压力、安全隐患和资源浪费。 随着科技的飞速发展&#xff0c;我们进入了一个新的时代&#xff0c;一个改变着建筑和施工方式的时代 - 智…