图像分割 分水岭法 watershed

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

本文的C#版本请访问:图像分割 分水岭法 watershed(C#)-CSDN博客

Watershed算法是一种图像处理算法,它是基于形态学的图像分割方法。在实现中,Watershed算法通常需要先对图像进行预处理,例如去除噪声、边缘检测等操作,以便更好的构建隔板。在填充山谷时,可以使用队列或其他数据结构来实现,以便管理待处理的像素。对于连通的区域,可以使用标记或者颜色来区分。最终得到的分割结果可以用于物体识别、形状分析等应用场景。

CvInvoke.Watershed方法用于执行图像的分水岭分割操作。该方法声明如下:

Public Shared Sub Watershed (

         image As IInputArray,

         markers As IInputOutputArray

)

参数说明:

  1. image:输入图像,必须是CV8U三通道彩色图。
  2. markers:指定的标记图像,这是一个CV32S的单通道图像,并且与输入图像具有相同的尺寸。可以通过FindContours和DrawContours来获得这个图像,使用像数值1、2、3……作为连通分量,来粗略勾勒出图像期望分割的区域,而未确定的区域未标记为0。

该方法没有返回值,而是直接在markers图像上进行分割操作。最终输出的图像,两个区域间使用-1作为分割线。

   '分水岭法 watershedPrivate Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.ClickDim m As New Mat("c:\learnEmgucv\tower.jpg", ImreadModes.Color)'灰度Dim mgray As New MatCvInvoke.CvtColor(m, mgray, ColorConversion.Bgr2Gray)'滤波Dim mgaussian As New MatCvInvoke.GaussianBlur(mgray, mgaussian, New Drawing.Size(5, 5), 2)ImageBox1.Image = mgaussian'边缘检测Dim mcanny As New MatCvInvoke.Canny(mgaussian, mcanny, 60, 120)'ImageBox2.Image = mcanny'获取轮廓Dim contours As New VectorOfVectorOfPointDim hierarchy As New VectorOfRectCvInvoke.FindContours(mcanny, contours, hierarchy, RetrType.Tree, ChainApproxMethod.ChainApproxNone)Dim mmark As New Matmmark = Mat.Zeros(mcanny.Rows, mcanny.Cols, DepthType.Cv32S, 1)'仅为查看轮廓使用Dim mcontours As New Mat(mcanny.Rows, mcanny.Cols, DepthType.Cv8U, 1)For i As Integer = 0 To contours.Size - 1'标记连通分量索引CvInvoke.DrawContours(mmark, contours, i, New MCvScalar(i), 1, LineType.EightConnected, hierarchy)'仅为查看轮廓使用CvInvoke.DrawContours(mcontours, contours, i, New MCvScalar(255), 1, LineType.EightConnected, hierarchy)Next'仅为查看轮廓使用CvInvoke.Imshow("mcontours", mcontours)'mmark是32S,显示不了的'CvInvoke.Imshow("mmark", mmark)'分水岭法CvInvoke.Watershed(m, mmark)'仅演示,watershed后的数据Dim mc As New Matmc = mmark.Clone'转为可以显示的CV8Umc.ConvertTo(mc, DepthType.Cv8U)CvInvoke.Imshow("mc", mc)'使用Matrix和Image便于生成图像(Mat操作像素点比较麻烦)Dim matrwater As New Matrix(Of Int32)(mmark.Rows, mmark.Cols)mmark.CopyTo(matrwater)Dim imgwater As New Image(Of Bgr, Byte)(mmark.Cols, mmark.Rows)'为每个区域填充不同的颜色Dim HSpointcolor As New Hashtable()       'index,bgrDim count As Integer = 0'对每个像素点操作For i As Integer = 0 To matrwater.Rows - 1For j As Integer = 0 To matrwater.Cols - 1'获得连通分量(像素点值)Dim index As Int32 = matrwater(i, j)'如果是区域的分割线If index = -1 Thenimgwater.Data(i, j, 0) = 255imgwater.Data(i, j, 1) = 255imgwater.Data(i, j, 2) = 255ElseDim pointcolor As Bgr'检查是否已经存在索引对应的颜色If HSpointcolor.ContainsKey(index) Thenpointcolor = HSpointcolor(index)Else'获得随机颜色pointcolor = getRadomBgr()'将已经使用的随机颜色加入ListHSpointcolor.Add(index, pointcolor)count += 1End If'像素点填充颜色imgwater.Data(i, j, 0) = pointcolor.Blueimgwater.Data(i, j, 1) = pointcolor.Greenimgwater.Data(i, j, 2) = pointcolor.RedEnd IfNextNext'输出使用分水岭法后的结果CvInvoke.Imshow("imgwater", imgwater)End Sub'获得随机颜色Private Function getRadomBgr() As BgrDim rand As New Random(Now.Millisecond)Dim b As Byte = rand.Next(0, 256)Dim g As Byte = rand.Next(0, 256)Dim r As Byte = rand.Next(0, 256)Return New Bgr(b, r, g)
End Function

输出结果如下图所示:

图8-4 分水岭法使用随机颜色填充 

由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。

学习更多vb.net知识,请参看vb.net 教程 目录

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

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

相关文章

Linux mcd命令教程:如何在MS-DOS文件系统中切换工作目录(附实例教程和注意事项)

Linux mcd命令介绍 mcd是mtools工具的指令,它用于在MS-DOS文件系统中切换工作目录。如果不加任何参数,它将显示当前所在的磁盘和工作目录。 Linux mcd命令适用的Linux版本 mcd命令在所有主流的Linux发行版中都可以使用,包括但不限于Ubuntu…

Flink 的时间属性及原理解析

Flink的API大体上可以划分为三个层次:处于最底层的ProcessFunction、中间一层的DataStream API和最上层的SQL/Table API,这三层中的每一层都非常依赖于时间属性。时间在Flink中的地位如下图所示: 时间属性是流处理中最重要的一个方面&#…

python flask图书管理系统带文档

python flask图书管理系统带文档。功能:登录,图书的增删改查,读者管理,借阅记录,有文档。 技术:python3,flask,mysql,html。 包含源码数据库文件文档。 源码下载地址: https://download.csd…

芯课堂 | MCU之TIMER精准延时

引言 华芯微特公司SWM系列单片机提供的TIMER个数和功能有些微差别,为了让您更加简单的使用这一功能,下面小编将以SWM190为例,给大家展示如何使用SWM系列产品的TIMER功能。 TIMER精准延时 一、TIMER简介 TIMER是一种定时器工具,…

实例:NodeJS 操作 Kafka

本人是C#出身的程序员,c#很简单就能实现,有需要的可以加我私聊。但是就目前流行的开发语言,尤其是面向web方向应用的,我感觉就是Nodejs最简单了。下面介绍: 本文将会介绍在windows环境下启动Kafka,并通过n…

滑动窗口最大值(力扣239题)

单调递减队列: 在解决题目之前,我们先来了解一下单调递减队列,它其实就是在队列的基础上多加了一些限制,如下图: 要求队列中的元素必须按从大到小的顺序排列。 如果向单调递减队列中加入数字 1,可以直接加入…

一起玩儿物联网人工智能小车(ESP32)——25. 利用超声波传感器测量距离

摘要:本文介绍如何利用超声波传感器测量障碍物的距离 测量距离是智能小车经常要用到的功能,今天就来介绍一个最常用的测量距离的传感器——超声波传感器。 超声波传感器的测距原理是利用超声波发射器向某个方向发射超声波,与此同时&#xff…

【Emgu.CV教程】第22篇 、色彩处理之ApplyColorMap()伪色彩应用

这篇文章讲的内容比较轻松,技术含量比较低。从我个人的角度讲,ApplyColorMap()函数实现了类似PhotoShop的一些酷炫效果,既把原始彩色图转换为21种风格各异的彩色图像,比如秋天风格、热力图风格等等,但是,在…

【Java期末】学生成绩管理系统

诚接计算机专业编程任务(C语言、C、Python、Java、HTML、JavaScript、Vue等)10/15R,如有需要请私信我,或者加我的企鹅号:1404293476 本文资源下载地址:https://download.csdn.net/download/weixin_47040861/88697244 —————…

Win11/10家庭版升专业版/企业版

2024.1.4 下载地址:HEU_KMS_Activator GitHubhttps://github.com/zbezj/HEU_KMS_Activator/tags 下载最新版即可 (升级时需要断网)打开程序 --> 其他 --> 选择professional --> 在点击四叶草图标即可 升级完后再次打开软件 -->…

Kali Linux实现UEFI和传统BIOS(Legacy)引导启动

默认Kali linux安装会根据当前启动的引导模式进行安装 例:以UEFI引导启动安装程序,安装后仅能在UEFI引导模式下进入系统 安装Kali系统 这边基于VirtualBox虚拟机镜像实战操作 首先创建一个Kali虚拟机 这里需要注意,把启动 EFI (只针对某些操…

Vue v-html中内容图片过大自适应处理

之前图片如下&#xff0c;图片已经超出了页面的展示范围 对v-html增加样式处理 <div class"body padding-l scroll " v-html"docData.content"> </div><style scoped>.body >>> img {max-width: 100% ;} </style>…

CCNP课程实验-04-BGP_CFG

目录 实验条件网络拓朴 基础配置需求实现IGP部分1. 按照图示配置OSPF区域&#xff0c;RID为Loopback 0地址。其中Area 146要配置为OSPF的特殊区域。2. 配置其它路由协议&#xff0c;重分布使得路由互相注入&#xff0c;实现全网互通。3. R1配置策略路由&#xff0c;使得R2经R1去…

Vue 框架前导:详解 Ajax

Ajax Ajax 是异步的 JavaScript 和 XML。简单来说就是使用 XMLHttpRequest 对象和服务器通信。可以使用 JSON、XML、HTML 和 text 文本格式来发送和接收数据。具有异步的特性&#xff0c;可在不刷新页面的情况下实现和服务器的通信&#xff0c;交换数据或者更新页面 01. 体验 A…

18、BLIP

简介 github BLIP提出了一种基于预训练的方法&#xff0c;通过联合训练视觉和语言模型来提升多模态任务的性能。 BLIP(Bootstrapping Language-Image Pretraining)是salesforce在2022年提出的多模态框架&#xff0c;是理解和生成的统一&#xff0c;引入了跨模态的编码器和解码…

词嵌入位置编码的实现(基于pytorch)

背景介绍 在transformers架构当中&#xff0c;对于词向量的输入需要加上原本词对应的位置信息&#xff0c;作为输入到模型中训练的input&#xff0c;那具体的位置编码如何实现呢&#xff1f;本篇博客就跟大家一起分享一下对应的步骤 位置编码的公式 对于词向量的位置编码的方…

西电期末1017.有序序列插值

一.题目 二.分析与思路 简单题。主要考察简单的排序&#xff0c;最后的插入数据同样不用具体实现&#xff0c;只需在输出时多输出一下即可&#xff0c;注意顺序&#xff01;&#xff01; 三.代码实现 #include<bits/stdc.h>//万能头 int main() {int n;scanf("%d…

HTML5+CSS3+Vue小实例:彩色圆环溶解加载动画

实例:彩色圆环溶解加载动画 技术栈:HTML+CSS+Vue.js 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge&…

【已解决】Invalid bound statement (not found)

报错讯息 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.casey.mapper.SysRoleMapper.getUserRoleCode at org.apache.ibatis.binding.MapperMethod S q l C o m m a n d . < i n i t > ( M a p p e r M e t h o d . j a v a :…

Springcloud 微服务实战笔记 Ribbon

使用 Configurationpublic class CustomConfiguration {BeanLoadBalanced // 开启负载均衡能力public RestTemplate restTemplate() {return new RestTemplate();}}可看到使用Ribbon&#xff0c;非常简单&#xff0c;只需将LoadBalanced注解加在RestTemplate的Bean上&#xff0…