OpenCV(四十一):图像分割-分水岭法

1.分水岭方法介绍

       OpenCV 提供了分水岭算法(Watershed Algorithm)的实现, 使用分水岭算法对图像进行分割,将图像的不同区域分割成互不干扰的区域。分水岭算法模拟了水在图像中的扩散和聚集过程,将标记的边界被看作是阻挡水扩散的高山,通过模拟水的扩散和聚集,最终确定图像的分割边界。

如图所示:水从山低蔓延,而高山阻止水扩散。

2.分水岭法分割图像函数watershed()

void cv::watershed ( InputArray   image,

InputOutputArray markers

  • image:输入图像,数据类型为CV_8U的三通道图像
  • markers:输入/输出CV_32S通道图像的标记结果,与原图像具有相同的尺寸

示例代码:

       基于标记图像中画的线来对原图像进行分割。


void  watershed_f(Mat mat,Mat mat2){//mat原图像  mat2含有标记的图像// 把四通道原图像转换成三通道Mat image;cv::cvtColor(mat, image, cv::COLOR_BGRA2BGR);Mat imgGray,imgMask,img_;Mat maskWaterShed;//watershed()函数的参数//对标记的图像进行灰度化Mat image2;cvtColor(mat2,imgGray,COLOR_BGR2GRAY);//对标记的图像二值化并开运算,可得到标记画的线threshold(imgGray,imgMask,250,255,THRESH_BINARY);Mat k= getStructuringElement(0,Size(3,3));morphologyEx(imgMask,imgMask,MORPH_OPEN,k);//显示二值化并开运算的结果imwrite("/sdcard/DCIM/imgMask2.png",imgMask);//对二值化后的标记图像进行轮廓检测,可得到画的线的轮廓vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(imgMask,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());//在maskWaterShed上绘制出上面得到的轮廓maskWaterShed=Mat::zeros(imgMask.size(),CV_32S);for(int index=0;index<contours.size();index++){drawContours(maskWaterShed,contours,index,Scalar::all(index+1),2,8);}//分水岭算法 需要对原图像进行处理watershed(image,maskWaterShed);//显示分水岭算法分割的每个区域imwrite("/sdcard/DCIM/maskWaterShed2.png",maskWaterShed);//随机生成几种颜色vector<Vec3b> colors;for(int i=0;i<contours.size();i++){int b=theRNG().uniform(0,255);int g=theRNG().uniform(0,255);int r=theRNG().uniform(0,255);colors.push_back(Vec3b((uchar)b,(uchar)g,(uchar)r));}//给分水岭算法分割的每个区域添加颜色Mat resultImg=Mat(image2.size(),CV_8UC3);for(int i=0;i<imgMask.rows;i++){for(int j=0;j<imgMask.cols;j++){//绘制每个区域的颜色int index=maskWaterShed.at<int>(i,j);if(index==-1)//区域间的值被置为-1(边界){resultImg.at<Vec3b>(i,j)=Vec3b(255,255,255);}else if(index<=0||index>contours.size())//没有标记清楚的区域被置为0{resultImg.at<Vec3b>(i,j)=Vec3b(0,0,0);}else{resultImg.at<Vec3b>(i,j)=colors[index-1];}}}//显示给分水岭算法分割的每个区域添加颜色的结果imwrite("/sdcard/DCIM/resultImg2.png",resultImg);//分割的区域与原图像结合resultImg=resultImg*0.8+image*0.2;imwrite("/sdcard/DCIM/resultImg3.png",resultImg);}

 

 

 

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

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

相关文章

Edge官方鼠标手势

前言 日期&#xff1a;2023年8月 Edge浏览器目前已自带官方的鼠标手势功能&#xff0c;若要使用首先将浏览器更新至最新版&#xff0c;下文介绍使用方法。 官方鼠标手势 前提 更新Edge至最新版&#xff0c;并关闭其它鼠标手势扩展。 开启鼠标手势 打开Edge浏览器的设置&…

NoSQL之redis持久化(RDB、AOF)

目录 一、Redis高可用 二、Redis持久化 1、持久化的功能 2、Redis的两种持久化 三、RDB 持久化 1、触发条件 1.1 手动触发 1.2 自动触发 1.3 其它自动触发机制 2、执行流程 3、启动时加载RED文件(恢复) 四、Redis的AOF持久化 1、开启AOF 2、执行流程 2.1 命令追加…

基于Qt5的计算器设计

Qt5的信号与槽 ✨描述&#xff1a;信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽&#xff0c;实际就是观察者模式(发布-订阅模式)。当某个事件发生之后&#xff0c;比如&#xff0c;按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号&#xff08;signal&#xff09…

TSUMU58CDT9-1显示器芯片方案

TSUMU58CDT9-1是用于LCD显示器的整体解决方案图形处理IC&#xff0c;面板分辨率高达WUXGA。它配置了高速集成三adc /PLL、集成DVI/HDMI接收器、高质量显示处理引擎、集成微控制器和支持LVDS面板接口格式的输出显示接口。TSUMU58CDT9-1支持一个灵活的可配置数字输入接口&#xf…

动态SQL

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能&#xff0c;它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。 1、if if标签可通过test属性的表达式进行判断&#xff0c;若表达式的结果为true&#xff0c;则标签中的内容会执行&#xff1b;反之标签…

「Java」Java面试宝典:全面覆盖常见问题和难点解析

Java面试宝典&#xff1a;全面覆盖常见问题和难点解析 1. 怎么理解Spring MVC?2. 为什么说ConcurrentHashMap是线程安全的&#xff1f;3. 为什么说HashMap是线程不安全的&#xff1f;4. 遍历map的方法5. HashSet怎样处理重复的数据?6. HashSet 具备哪些特点&#xff1f;7. 什…

【MySQL系列】MySQL数据库索引详解

目录 一、为什么要用索引&#xff1f; 二、什么是索引&#xff1f; 三、MySQL索引使用场景 四、索引的原理 五、MySQL的存储引擎 六、索引的数据结构 七、索引如何使用 八、实际使用示例 九、优缺点、使用建议和注意事项 十、为什么Mysql不选择Hash索引&#xff1f; …

电脑死机的时候,CPU到底在做什么?

电脑死机&#xff0c;应该每个接触计算机的小伙伴都经历过吧。 尤其是早些年&#xff0c;电脑配置还没现在这么高的时候&#xff0c;多开几个重量级应用程序&#xff0c;死机就能如约而至&#xff0c;就算你把键盘上的CTRLALTDELETE按烂了&#xff0c;任务管理器也出不来&…

Linux基础入门

一、操作系统安装方法 1、使用u盘安装 工具&#xff08;前提条件&#xff09;&#xff1a; <1>u盘 <2>镜像文件iso/msdn.itellyou.cn <3>把u盘做成PE&#xff1a;大白菜/老毛桃/winPE/软碟通/ultralSO 设置BIOS&#xff1a;通过u盘启动 安装系统&…

什么是云存储,从对象存储说起?

在《存储系统形态之争,从块存储到统一存储》一文中我们提到了对象存储的概念,知道目前很多企业级存储都是支持对象存储的,比如EMC、NetApp和华为等。以EMC的对象存储为例,其最早在1998年就已经具备成熟的产品了,到目前已经有二十多年的历史了。如图是关于对象存储主要产品…

base64转为blob,然后转成file文件,具体步骤以及注释说明,以及使用案例

文章目录 1. 将base64字符串转为blob对象&#xff1a;2. 将blob对象转为file对象&#xff1a;3. 使用案例&#xff1a; 1. 将base64字符串转为blob对象&#xff1a; function convertBase64ToBlob(base64Str) {// 将base64字符串转为二进制数据const byteCharacters atob(bas…

《银河麒麟高级服务器操作系统V10》使用

一言而论&#xff1a;讲了麒麟服务器V10的基本使用&#xff0c;包括终端、VNC 文章目录 前言基本架构环境硬件环境软件环境 麒麟安装步骤1.在宿主机上安装好VM&#xff0c;并且激活2.使用VM创建虚拟机3.启动虚拟机 终端常用点VNC的使用麒麟上安装VNC服务器Windows上安装VNC客户…

09架构管理之工作量评估评审

一句话导读 在软件工程中&#xff0c;如何做到精准的预算评估&#xff0c;软件开发的工作量评估是很多项目开始的首要要素&#xff0c;它会影响到整个工程的预算、人员配置、进度管理&#xff0c;甚至是工程能否正常交付。那么如何保证工作量评估的准确性呢&#xff0c;那就要用…

【deepspeed】【训练】【交互】【wandb】训练过程中的wandb交互如何去除

问题&#xff1a;gpt模型训练时&#xff0c;中间有询问输入账户&#xff0c;交互式的询问影响自动执行脚本&#xff0c;询问是这样的&#xff1a; 解决办法&#xff1a; 在脚本中设置环境变量&#xff0c;关闭wandb&#xff0c;如下图&#xff1a; 其他&#xff1a; log中没有…

nslookup和dig的区别

nslookup是一个常用的网络工具&#xff0c;用于查询域名系统&#xff08;DNS&#xff09;的信息。它允许用户通过域名查找与之相关的IP地址、查询主机名和IP地址的映射关系&#xff0c;以及执行反向DNS查找等操作。下面是对nslookup的详细解释&#xff1a; 查询域名对应的IP地…

Mysql InnoDB引擎 的hash索引

Mysql InnoDB引擎不支持hash索引&#xff0c;但是在内存结构中有一个自适应hash索引&#xff0c;来提高查询性能 当设置hash索引时会自动转换成btree索引 查一下mysql官方文档&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/create-index.html innodb_adaptive_hash_i…

第13篇:ESP32 idf wifi联网使用SNTP同步网络时间LCD ST7920液晶屏显示

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

MarkText快捷键(随时补充中)

MarkText快捷键 ctrl1&#xff1a;一号标题 &#xff08;需要手动在【左上角】-【file】-【preferences】-【Key Bindings】-【 Transform into Heading 1】手动调整&#xff0c;先将【Switch tab to the 1st】占用快捷键删除才能在下面添加&#xff09; ctrlg&#xff1a;添加…

自然语言处理技术之词向量:GloVe单词表示的全局向量(glove.840B.300d、glove.6B)

目录 一、词向量介绍二、GloVe学习词向量的词嵌入模型三、词向量入门(代码下载)四、训练五、模型概述六、可视化七、发布历史一、词向量介绍 自然语言处理(NLP)中的词向量是将文本中的词汇表示为数值向量的技术。词向量的主要作用是将文本数据转换成计算机可以理解和处理的…

实时云渲染应用之虚拟仿真项目的四大优势

虚拟仿真在教育领域的应用越来越广&#xff0c;尤其在科研和实验教学领域&#xff0c;这主要是因为虚拟仿真具有操作简单、场景逼真、更安全、易维护的优势。比如在实验教学过程中&#xff0c;一些实验对象相对于学生来说过于宏观或微观&#xff0c;学生不易理解&#xff0c;而…