图像分割 分水岭法 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.hqwc.cn/news/317213.html

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

相关文章

如何给NVIDIA JetsonOrin Nano开发套件安装CSI摄像头

Jetson Orin Nano开发套件沿袭先前系列产品的设计重点,也提供两个CSI/MIPI摄像头接口,如下图右两个黄色圆框圈出的地方,不过这次的22针接口与先前系列产品的15针接口并不相同,不过先前产品所支持的摄像头规格(例如IMX2…

Langchain访问OpenAI ChatGPT API Account deactivated的另类方法,访问跳板机API

笔者曾经写过 ChatGPT OpenAI API请求限制 尝试解决 Account deactivated. Please contact us through our help center at help.openai.com if you need assistance. 结果如何? 没有啥用。目前发现一条曲线救国的方案。 1. 在官方 openai 库中使用 此处为最新Op…

【Java并发】深入浅出 synchronized关键词原理-上

一个问题的思考 建设我们有两个线程,一个进行5000次的相加操作,另一个进行5000次的减操作。那么最终结果是多少 package com.jia.syn;import java.util.concurrent.TimeUnit;/*** author qxlx* date 2024/1/2 10:08 PM*/ public class SynTest {privat…

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜,Kotlin(1)

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜,Kotlin(1) 实现查看图片的放大镜,放大镜随着手指在屏幕上的移动,放大镜里面展示手指触点为中心、半径长度的圆形放大后的图片。 剪切出一块圆形Path…

掌握静态S5:从入门到精通的指南

在现今的数据驱动时代,静态S5作为一款强大的数据分析工具,越来越受到各行各业的青睐。然而,如何从入门到精通,全面掌握静态S5的各项功能,成为了许多用户面临的挑战。本文将为你提供一份详尽的指南,助你顺利…

milvus学习(一)cosin距离和欧式距离

参考:https://blog.csdn.net/qq_36560894/article/details/115408613 归一化以后的cosin距离和欧式距离可以相互转化,未归一化的不可以相互转化(因为距离带单位)。

一个人去广东怎么找工作

广东这么大,不用怕没有学历活不下去。没有学历想好好活下去,就得卖力气。 广东找工作上 吉鹿力招聘网 打开 吉鹿力招聘网 “注册账号”,然后输入个人基本信息,进行注册(可使用手机号注册,也可以使用邮箱注…

新闻稿件发稿:新闻稿的5大长远意义

在信息爆炸时代,企业品牌如何才能从海量的信息中可以脱颖而出,企业的成功与否不仅仅取决于产品质量或服务水平,更在于如何通过有效的传播手段塑造品牌形象、建立公众信任。 新闻稿是一种用于传达新闻信息的书面文本,通常由编辑、…

【C++入门】类和对象(完)

前言 在谈论C时,常常会涉及到一些高级特性和概念,比如初始化列表、static成员、友元、内部类、匿名对象等。这些概念在C编程中起着非常重要的作用,对于想要深入了解C语言的开发者来说,掌握这些知识是至关重要的。本文,…

桌面天气预报软件 Weather Widget free mac特点介绍

Weather Widget free for Mac多种吸引人的小部件设计可供选择,可以随时了解天气!还可以在Dock和菜单栏中为您提供简短的天气预报或当前状况的概述。 Weather Widget free for Mac软件介绍 始终在桌面上使用时尚的天气小部件来随时了解天气!多…

算法29:不同路径问题(力扣62和63题)--针对算法28进行扩展

题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff0…