推荐设计网站/百分百营销软件官网
1.图像分割概述
(1)What(什么是图像分割)
将图像划分为不同的子区域,使得同一子区域具有较高的相似性,不同的子区域具有明显的差异性
(2)Why(对图像进行分割有什么作用)
- 医学领域:将不同组织分割成不同区域帮助分析病情
- 军事领域:通过对图像的分割,为自动目标识别提供参数,为飞行器或武器的精准导航提供依据
- 遥感领域:通过遥感图像分析城市地貌、作物生长情况。此外,云系分析和天气预报都离不开图像分割
- 交通领域:车辆跟踪和车牌识别
- 工业领域:零部件分类、质量评估等
(3)Which(有哪些图像分割的方法)
- 基于阈值的分割方法:利用灰度直方图得到分割的阈值,利用这些阈值将图像分为几个部分,核心思想是认为同一部分的像素是同一个物体。
- 基于边缘的分割方法:检测图像的边界以实现对图像的分割
- 基于区域的分割方法:核心思想是将有相似特性的像素集合起来构成区域,将差异性较大的区域进行分裂
- 基于神经网络的分割方法:这里不多赘言,现在很火…
- 基于聚类的分割方法:依据像素相似度,使用聚类算法将像素划分为不同类别
2.基于阈值的分割
(1)固定阈值分割
将图像分为两个部分:黑和白两个区域
/*@author @还下着雨ZG
* @brief 固定阈值图像分割
* @param[in] imSrc, 待分割的图像
* @param[out] imSegment, 分割后的图像
* @param[in] threVal, 输入的阈值
* @return, 返回正整数表示图像分割成功,负整数表示失败
**/
int ImgSegmentByGlbThreVal(const cv::Mat& imSrc, cv::Mat& imSegment, int threVal)
{if(imSrc.empty()) return -1;if(threVal<0 || threVal>255) return -2;// 图像预处理cv::Mat imGray;if(imSrc.channels()==1) imGray = imSrc.clone();else if(imSrc.channels() == 3){cv::cvtColor(imSrc, imGray, cv::COLOR_RGB2GRAY);}else{return -3;}cv::GaussianBlur(imGray, imGray, cv::Size(3,3), 0);//全局阈值法cv::threshold(imGray, imSegment, threVal);return 1;
}
阈值分割函数threshold的介绍:
double cv::threshold(cv::Mat &imSrc, //输入图像,应该为单通道cv::Mat &imDst, //分割后的图像,大小和类型和imSrc相同double thresh, //表示阈值double maxval, //最大灰度值,一般设为255int type //阈值化类型,详细介绍如下所示};
参数type的介绍:type是一个枚举类型的数据
THRESH_BINARY = 0, // ( x > thresh ) ? 255 : 0
THRESH_BINARY_INV = 1, // ( x > thresh ) ? 0 : 255
THRESH_TRUNC = 2, // ( x > thresh ) ? thresh : x
THRESH_TOZERO = 3, // ( x < thresh ) ? 0 : x
THRESH_TOZERO = 4, // ( x < thresh ) ? x : 0
THRESH_MASK = 7,
THRESH_OTSU = 8, // 自动处理,图像自适应二值化,常用区间【0-255】
(2)自适应阈值分割
根据图像不同区域的亮度分布计算局部阈值,对于图像的不同区域能够自适应计算不同阈值
void cv::adaptiveThreshold(cv::Mat &imSrc, //输入的源图像cv::Mat &imDst, //输出图像double maxval, //预设满足条件的最大值int adaptMethod, //指定自适应阈值算法类型(ADAPTIVE_MEAN_C或ADAPTIVE_THRESH_GAUSSIAN_C两种)int threshType, //阈值类型(THRESH_BINARY或THRESH_BINARY_INV)int blockSize, //领域块的大小,用于计算区域阈值(3,5,7 ...)double C, //与算法有关的参数,是一个从均值或加权均值提取的常数,可为负);
使用adaptiveThresh:
/*@author @还下着雨ZG
* @brief 自适应阈值图像分割
* @param[in] imSrc, 待分割的图像
* @param[out] imSegment, 分割后的图像
* @return, 返回正整数表示图像分割成功,负整数表示失败
**/
int ImgSegmentByAdpThre(const cv::Mat& imSrc, cv::Mat& imSegment)
{if (imSrc.empty()) return -1;cv::Mat imGray;if (imSrc.channels() == 1){cv::copyTo(imSrc, imGray, cv::Mat());}else if (imSrc.channels() == 3){cv::cvtColor(imSrc, imGray, cv::COLOR_RGB2GRAY);}else{return -2;}cv::GaussianBlur(imGray, imGray, cv::Size(3, 3), 0);int blockSize = 3;int constValue = 0;cv::adaptiveThreshold(imGray, imSegment, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, blockSize,constValue);return 1;
}
在实际使用时,大部分是先通过算子寻找边缘,然后和区域生长融合来分割图像
3.基于区域的分割
有相似特性的像素集合起来构成区域,将差异性较大的区域进行分裂
(1)分水岭算法
A.What(分水岭算法的概念)
将图像看作是测地学上的拓扑地貌,每一个像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域被称为盆地,对应得边界形成分水岭。
每一个局部极小值表面,刺穿一个小孔,然后从小孔浸水,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,两个盆地间形成分水岭。
opencv提供的分水岭算法原型如下:
void cv::watershed(cv::Mat &imBGR, //三通道8bit的彩色图像);
B.How(如何使用分水岭算法对图像进行分割)
- step01: 图像预处理(灰度化、滤波去噪等)
- step02: Canny边缘检测
- step03: 查找轮廓(findContours函数查找轮廓),并把轮廓信息按照不同编号绘制到watershed的第二次参数markers上,相当于标记注水点
- step04: watershed分水岭算法调用
- step05: 绘制分割出来的区域
/*@author @还下着雨ZG
* @param[in] imSrc, 输入的源图像
* @param[in] imMarks, 输出图像,分割之后的结果
* @return, 正整数表示成功,负整数表示失败
*/
int ImgDvdWatershed(const cv::Mat& imSrc, cv::Mat& imMarks)
{//step01 图像预处理:灰度+滤波cv::Mat imGray;cv::Mat imGray;if (imSrc.channels() == 1){cv::copyTo(imSrc, imGray, cv::Mat());}else if (imSrc.channels() == 3){cv::cvtColor(imSrc, imGray, cv::COLOR_RGB2GRAY);}else {return -1;}cv::GaussianBlur(imGray, imGray, cv::Size(3, 3), 2); //高斯滤波//Step02 Canny边缘检测cv::Mat imEdg(imGray.size(), CV_8UC1);cv::Canny(imGray, imEdg, 40, 110);//Step03 查找轮廓并绘制轮廓std::vector<std::vector<cv::Point>> vCnts;std::vector<cv::Vec4i> hierarchy;cv::findContours(imEdg, vCnts, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);cv::Mat imContours;if (!imMarks.empty()){imMarks.release();}imMarks = cv::Mat(imGray.size(), CV_32S, cv::Scalar::all(0));int iIdx = 0;int compCount = 0;for (; iIdx >= 0; iIdx = hierarchy[iIdx][0], compCount++){cv::drawContours(imMarks, vCnts, iIdx, cv::Scalar::all(compCount + 1), 1, 8, hierarchy);cv::drawContours(imContours, vCnts, iIdx, cv::Scalar(255), 1, 8, hierarchy);}cv::Mat imRGB;if (imSrc.channels() == 1){cv::cvtColor(imSrc, imRGB, cv::COLOR_GRAY2RGB);}else if (imSrc.channels() == 3){imRGB = imSrc.clone();}//Step04 调用分水岭算法cv::watershed(imRGB, imMarks);//marks既是输入参数又是输出参数imRGB.release();return 1;
}
说明:该函数输出参数imMarks图像,同一区域用相同的数值标识,分水岭用-1标识
(2)洪水填充法分割图像
该算法通常对边缘图像进行操作,可用于分割出比较完整的外轮廓
int cv::floodFill(cv::Mat &imSrc, //输入图像cv::Point seedPt, //填充的起始点cv::Scalar newVal, //填充的像素值cv::Rect *rect=0, //将要重绘区域的最小边界矩形区域cv::Scalar loDiff = cv::Scalar(), //像素值负差的最大值cv::Scalar upDiff = cv::Scalar(), //像素值正差的最大值int flags = 4 //操作标识符);
相关文章:

计算机视觉全系列实战教程 (十二):图像分割(阈值分割threshold、分水岭算法watershed的使用步骤、洪水填充floodFill算法的使用)
1.图像分割概述 (1)What(什么是图像分割) 将图像划分为不同的子区域,使得同一子区域具有较高的相似性,不同的子区域具有明显的差异性 (2)Why(对图像进行分割有什么作用) 医学领域:将不同组织分割成不同区域帮助分析病情军事领域ÿ…...

Linux的免交互
交互:我们发出指令控制程序的运行,程序在接收到指令之后按照指令的效果做出对应的反应。 免交互:间接的通过第三方的方式把指令传送给程序,不用直接的下达指令。 1、here document免交互 ere document免交互:是命令…...

查看es p12证书文件过期方法
查看证书过期时间: openssl pkcs12 -in elastic-certificates.p12 -nokeys -out elastic-certificates.crt (需要输入证书生成时配置密码) openssl x509 -enddate -noout -in elastic-certificates.crt...

1.8 无符号大数加、减运算
作者 李卫明 单位 杭州电子科技大学 1.8 无符号大数加、减运算。程序设计中经常遇到无符号大数加、减运算问题,请在样例程序Ex1.4基础上实现无符号大数减运算。题目要求输入两个无符号大数,保证一个大数不小于第二个大数,输出它们的和、差。…...

Java常用类--包装类
包装类 一方面出于性能方面的考虑,java为数值使用基本类型,而不是对象。基本类型不是对象层次的组成部分,它们不继承Object。 另一方面有时需要创建表示基本类型的对象,例如集合类只处理对象。为了在类中存储基本类型,…...

SpringMvcの拦截器全局异常处理
一、拦截器 我们在网上发贴子的时候如果没有登录,点击发送按钮会提示未进行登录,跳转到登录页面。这样的功能是如何实现的。 1、 拦截器的作用 Spring MVC 的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理…...

JVM虚拟机的组成
一、为什么要学习 JVM ? 1. “ ⾯试造⽕箭,⼯作拧螺丝” , JVM 属于⾯试官特别喜欢提问的知识点; 2. 未来在⼯作场景中,也许你会遇到以下场景: 线上系统突然宕机,系统⽆法访问,甚⾄直…...

探索CSS clip-path: polygon():塑造元素的无限可能
在CSS的世界里,clip-path 属性赋予了开发者前所未有的能力,让他们能够以非传统的方式裁剪页面元素,创造出独特的视觉效果。其中,polygon() 函数尤其强大,它允许你使用多边形来定义裁剪区域的形状,从而实现各…...

【华为OD机试B卷】单词接龙(C++/Java/Python)
题目 题目描述 单词接龙的规则是: 可用于接龙的单词首字母必须要前一个单词的尾字母相同;当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;已经参与接龙的单词不能重复使用。现给定一组全部由小写字母组成单词数组,并指定其中的一个…...

项目实训-vue(十七)
项目实训-vue(十七) 文章目录 项目实训-vue(十七)1.概述2.问诊类型3.问诊时间统计4.看诊时间统计 1.概述 本篇博客将记录我在数据统计页面中的工作。因为项目并未实际运行,因此我们拟定了一些数据,并构建了…...

Android10 SystemUI系列 需求定制(二)隐藏状态栏通知图标,锁屏通知,可定制包名,渠道等
一、前言 SystemUI 所包含的界面和模块比较多,这一节主要分享一下状态栏通知图标和通知栏的定制需求:隐藏状态栏通知图标,锁屏通知,可定制包名,渠道等 来熟悉一下Systemui。 二、准备工作 按照惯例先找到核心类。这里提前说一下,这个需求的修改方法更多,笔者这里也只…...

Linux:RAID磁盘阵列
目录 一、RAID(磁盘阵列) 1.1、概念 1.2、RAID 0(条带化存储) 1.3、RAID 1(镜像存储) 1.4、RAID 5 1.5、RAID 6 1.6、RAID 10 (先做镜像,再做条带) 二、创建RAID 2.1、建立RAID 0 …...

MongoDB和AI 赋能行业应用:零售
欢迎阅读“MongoDB 和 AI 赋能行业应用”系列的第三篇。 本系列重点介绍 AI 应用于不同行业的关键用例,涵盖制造业和汽车行业、金融服务、零售、电信和媒体、保险以及医疗保健行业。 利用生成式 AI 技术(Gen AI),零售商可以创造…...

MQ~消息队列能力、AMQP协议、现有选择(Kafka、RabbitMQ、RocketMQ 、Pulsar)
消息队列 消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。由于队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。 常⽤的消息队列主要这 五 种,分别…...

开源网安参与编制的《代码大模型安全风险防范能力要求及评估方法》正式发布
代码大模型在代码生成、代码翻译、代码补全、错误定位与修复、自动化测试等方面为研发人员带来了极大便利的同时,也带来了对安全风险防范能力的挑战。基于此,中国信通院依托中国人工智能产业发展联盟(AIIA),联合开源…...

【树状数组 队列】1505. 最多 K 次交换相邻数位后得到的最小整数
本文涉及知识点 树状数组 队列 LeetCode1505. 最多 K 次交换相邻数位后得到的最小整数 给你一个字符串 num 和一个整数 k 。其中,num 表示一个很大的整数,字符串中的每个字符依次对应整数上的各个 数位 。 你可以交换这个整数相邻数位的数字 最多 k 次…...

【附精彩文章合辑】当谈到程序的“通用性”与“过度设计”的困境时,我们可以通过一些具体的例子来更直观地阐述这些解决方案
当谈到程序的“通用性”与“过度设计”的困境时,我们可以通过一些具体的例子来更直观地阐述这些解决方案。以下是一些示例: 一、明确需求与目标 例子1:在线购物平台 需求分析:平台需要支持用户注册、登录、浏览商品、下单购买、…...

Word中删除空白页
① 文字后面出现的空白页 把鼠标放在空白页的位置,按住Ctrl Delete即可。 ② 表格后面的空白页 把鼠标放在空白页左侧,直到出现一个空白的箭头,点击一下选中空白页,然后再Ctrl D,打开字体选项卡,在效果中…...

30.Netty进阶-黏包半包解决方案-短链接
客户端发送一次完整的消息,然后就把与服务端的链接断开。服务端读到的结果就是-1。 服务器就知道 从链接建立到断开,发送的数据是一条完整的数据。 客户端代码 package com.xkj.nian;import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBuf; import io.net…...

斜堆(数据结构篇)
数据结构之斜堆 斜堆 概念: 斜堆是左式堆的自调节形式,斜堆和左式堆间的关系类似于伸展树和AVL树间的关系斜堆是具有堆序性的二叉树,但是不存在对树的结构限制不同于左式堆,关于任意节点的零路径长的任何信息都不保留ÿ…...

河南大学24计算机考研数据,有三个学院招收计算机相关专业,都是考的408!
河南大学(Henan University),简称“河大”,是河南省人民政府与中华人民共和国教育部共建高校,国家“双一流”建设高校,入选国家“111计划”、中西部高校基础能力建设工程、卓越医生教育培养计划、卓越法律人…...

ubuntu离线安装docker导入镜像
docker安装包 准备工作 1.准备一个docker.service文件 内容如下: [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target[Service] Typenoti…...

鸿蒙原生应用元服务开发-位置服务申请权限
申请位置权限开发指导 场景概述 应用在使用位置服务系统能力前,需要检查是否已经获取用户授权访问设备位置信息。如未获得授权,可以向用户申请需要的位置权限。 系统提供的定位权限有: ohos.permission.LOCATION:用于获取精准位置…...

基于SpringBoot的“智慧食堂”管理系统设计与实现
你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:SpringBootVue 工具:IDEA/Eclipse、Navicat、Maven 系统展示 首页 用户管理界面 菜品…...

高效记录收支明细:揭秘如何通过曲线图精准分析每月开销
在理财的道路上,你是否曾感到迷茫和无力?每个月的开销如同流水般悄无声息地滑过指尖,但你却始终难以掌握自己的财务脉络。今天,我们为你揭秘一个全新的理财方法——通过曲线图精准分析每月开销,让你的财务生活焕发智慧…...

开发注意事项
开发注意事项 简介1. 查询条件照成的OOM问题原因注意事项 2. 因为事务导致数据查询不到问题原因注意事项 简介 这篇文章主要是想记录在开发过程中遇到的坑已经注意事项。 1. 查询条件照成的OOM 问题 SIT 环境内存突然暴增,直接打到100%,导致服务频繁…...

Vue79-路由组件独有的2个新的生命周期钩子
一、需求 news.vue路由组件被缓存了(因为想要保留里面的输入框的数据!),导致,路由页面切走,组件也不会被销毁,所以,beforeDestroy()函数就不会被执行,所以,定…...

Lua博客网站支持搜索、评论、登录注册
该简易博客示例用于学习网站的基础知识与MySQL数据库。 简述:开源Lua网站开发服务(FastWeb)支持:注册、登录、文章分页、评论分页、简易权限管理和搜索功能。发帖功能支持Markdown(支持记忆功能)图示:...

BGP高级特性
BGP路由反射器 l 路由反射器的两种角色 RR(router reflector):路由反射器 client:RR客户端 l RR会将学习到的路由反射出去,从而使得IBGP路由在AS内传播时无需建立IBGP的全互联结构 l 将一台BGP路由器指定为RR的…...

鸿蒙开发:1.环境搭建和入门
环境搭建 安装HUAWEI DevEco Studio 简介 HUAWEI DevEco Studio是基于IntelliJ IDEA Community开源版本打造, 为运行在HarmonyOS和OpenHarmony系统上的应用和服务提供一站式的开发平台。 特点 1.高效智能代码编辑:支持ArkTS、JS、C/C等语言的代码高亮、…...