传统图像分割——分水岭算法(watershed)

article/2025/10/16 5:30:58

传统图像分割——分水岭算法(watershed)


文章目录

  • 传统图像分割——分水岭算法(watershed)
  • 前言
  • 一、什么是分水岭算法?
  • 二、经典的分水岭求解算法
    • 1.定义
    • 2.算法流程
  • 总结


前言

本篇文章主要梳理分水岭算法的原理,不涉及编程实现
一些经典的分水岭算法文献:

  • [1] Vincent L, Soille P. Watersheds in digital spaces: an efficient algorithm based on immersion simulations[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 1991, 13(06): 583-598.
  • [2] Roerdink J B T M, Meijster A. The watershed transform: Definitions, algorithms and parallelization strategies[J]. Fundamenta informaticae, 2000, 41(1, 2): 187-228.
  • [3] Najman L, Schmitt M. Watershed of a continuous function[J]. Signal Processing, 1994, 38(1): 99-112.

Matlab代码可参考使用教程:

  • https://ww2.mathworks.cn/help/images/marker-controlled-watershed-segmentation.html?s_tid=gn_loc_drop

一、什么是分水岭算法?

传统分水岭算法是一种基于拓扑理论的形态学分割方法。通常在基于形态学分割的方法中,会将图片视作地形表面,将图片的每一个灰度级与等高线相对应。由此,图片的每一个局部最小值都会有一个影响区域(influence zone)这些影响区域的边界被称为“分水岭”(相当于是寻找波峰线)这样做的好处在于对于图片梯度的估计非常直接,便于寻找图像的梯度波峰,用于分割。
下图所示为分水岭的一维示意图。更直观一点来讲,首先戳漏每一个局部最小值点,然后水从下到上漫延会逐渐淹没 B V i BV_i BVi这些影响区域(图(a),也被称为吸水盆地,注意这些不同的吸水盆地内水的高度是一致的);而随着水位继续上涨中间的小峰值也会被淹没,为了不让两个不同的影响区域合并会建立一个水坝(图(b)中Barrage),这些水坝就是“地形图”的分水岭,也可以想象为图形的边缘。
分水岭算法一维示意图
而对于图像分割任务这种二维的情况,分水岭更难获取,二维的情况如下图所示(分水岭为图中Dam)
在这里插入图片描述


二、经典的分水岭求解算法

1.定义

  • 测地线距离(geodesic distance):对于一个集合 A A A a a a, b b b A A A中的两个元素,则定义在 A A A中连接 a a a b b b的路径长度的最小值为测地线距离,记作 d A ( a , b ) d_A(a,b) dA(a,b)。具体来讲,如下图所示两个黑点之间的测地线距离为 d 12 + d 23 + d 34 + d 45 d_{12}+d_{23}+d_{34}+d_{45} d12+d23+d34+d45。在三维曲面空间中两点间的测地距离就是两点间沿着三维曲面的表面走的最短路径。
    在这里插入图片描述

  • 测地线影响区域(geodesic influence zone):对于 A A A中的一个点 B i B_i Bi,所有与点 B i B_i Bi的测地线距离小于距离其他点 B j B_j Bj距离的点的集合,即 i z A ( B i ) = { p ∈ A , ∀ j ∈ [ 1 : i − 1 , i + 1 : k ] , d A ( p , B i ) < d A ( p , B j ) } iz_A(B_i)=\{p \in A,\forall j \in [1:i-1,i+1:k],d_A(p,B_i)<d_A(p,B_j)\} izA(Bi)={pA,j[1:i1,i+1:k],dA(p,Bi)<dA(p,Bj)}

  • 集水盆地(catchment basins):对于数值图像 I I I,定义 h m i n h_{min} hmin是图像 I I I最小的灰度级, T h ( I ) T_{h}(I) Th(I)是图像 I I I中所有灰度级小于等于 h h h的像素点, M i n h Min_{h} Minh是图像 I I I在灰度级 h h h处区域最小值的集合,进而可以通过递归求解得到集合 X h m a x X_{h_{max}} Xhmax X h m i n = T h m i n ( I ) X_{h_{min}}=T_{h_{min}}(I) Xhmin=Thmin(I) ∀ h ∈ [ h m i n , h m a x − 1 ] , X h + 1 = M i n h + 1 ∪ I Z T h + 1 ( I ) ( X h ) \forall h\in [h_{min},h_{max}-1],X_{h+1}=Min_{h+1}\cup IZ_{T_{h+1}(I)}(X_h) h[hmin,hmax1],Xh+1=Minh+1IZTh+1(I)(Xh)

2.算法流程

  • 首先,把梯度图像中所有的像素按照灰度值分类,并设定一个测地线距离阈值
  • 其次,找到灰度值最小的像素点(即 h m i n h_{min} hmin),让阈值从最小值开始增长( h m i n + 1 h_{min}+1 hmin+1,…, h m a x h_{max} hmax),在增长的过程中计算 h m i n h_{min} hmin与像素点的测地线距离,如果小于设定阈值,则将这些像素淹没,否则在这些像素上设置大坝,这样就对这些邻域像素进行了分类。

示意图如下[4]
在这里插入图片描述

[4]摘自https://zhuanlan.zhihu.com/p/67741538
[5]一个讲的比较清晰的视频:https://www.bilibili.com/video/BV1fk4y167Gv?spm_id_from=333.337.search-card.all.click&vd_source=4242990e0fbe2c9c04876ca373dbce12


总结

可以看到传统分水岭算法计算量大,并且阈值的选取与灰度级的数量都会影响到分割效果,另外分水岭算法处理复杂图像的效果可能会差。


http://chatgpt.dhexx.cn/article/68vR0DEF.shtml

相关文章

图像分割 - 分水岭算法

目录 1. 介绍 2. 分水岭算法的实现 距离变换 连接连通分量 3. 代码 1. 介绍 图像是由x&#xff0c;y表示的&#xff0c;如果将灰度值也考虑进去的话&#xff0c;那么一幅图像需要一个三维的空间去表示。 这样就可以把x&#xff0c;y轴比作大地&#xff0c;将灰度值的z轴…

【OpenCv】图像分割——分水岭算法

文章目录 1 原理2 算法改进3 API4 实例 1 原理 分水岭分割方法&#xff0c;是一种基于拓扑理论的数学形态学的分割方法&#xff0c;其基本思想是把图像看作是测地学上的拓扑地貌&#xff0c;图像中每一点像素的灰度值表示该点的海拔高度&#xff0c;每一个局部极小值及其影响区…

MFC图像处理CImage类常用操作

原文作者&#xff1a;aircraft 原文地址&#xff1a;https://www.cnblogs.com/DOMLX/p/9598974.html MFC图像处理CImage类常用操作 CImage类头文件为#include<atlimage.h> CImage类读取图片CImage.Load("src.bmp"); CImage类保存图片CImage.Save("dst…

使用CImage进行图像处理

MFC和ATL共享的新类CImage为图像处理提供了许多相应的处理方法 CImage类 我们知道&#xff0c;Visual C的CBitmap类和静态图片控件的功能是比较弱的&#xff0c;它只能显示出在资源中的图标、位图、光标以及图元文件的内容&#xff0c;而不像VB中的Image控件可 以显示出绝大多数…

用CImage类来显示PNG、JPG等图片

系统环境&#xff1a;Windows 7 软件环境&#xff1a;Visual Studio 2008 SP1 本次目的&#xff1a;实现VC单文档、对话框程序显示图片效果 CImage 是VC.NET中定义的一种MFC/ATL共享类&#xff0c;也是ATL的一种工具类&#xff0c;它提供增强型的&#xff08;DDB和DIB&#xff…

CImage类(外部图像文件(BMP、GIF、JPEG等)

CImage类 我们知道&#xff0c;Visual C的CBitmap类和静态图片控件的功能是比较弱的&#xff0c;它只能显示出在资源中的图标、位图、光标以及图元文件的内容&#xff0c;而不像VB中的Image控件可 以显示出绝大多数的外部图像文件(BMP、GIF、JPEG等)。因此&#xff0c;想要在对…

CImage的一般使用方法和技巧

Visual C的CBitmap类的功能是比较弱的,它只能显示出在资源中的图标、位图、光标以及图元文件的内容&#xff0c;而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP、GIF、JPEG等)。如果想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码,…

图像处理(C++ CImage class)学习笔记

基础篇 A. 图像三原色及灰度值 A1. 彩色图像的三原色 图像三原色 — R&#xff1a;红色red — G&#xff1a;绿色green — B&#xff1a;蓝色blue三原色的取值范围&#xff1a;0&#xff08;无&#xff09;~255&#xff08;满&#xff09; — 红色&#xff1a;R255 G0 B0 —…

Cimage

本系列文章由zhmxy555编写&#xff0c;转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7422922 作者&#xff1a;毛星云 邮箱&#xff1a; happylifemxyqq.com 欢迎邮件交流编程心得 我们知道&#xff0c;Visual C中的CBitmap类的功能简直太弱小了&am…

【无标题】c++ MFC图像处理CImage类常用操作代码

原文作者&#xff1a;aircraft 原文地址&#xff1a;https://www.cnblogs.com/DOMLX/p/9598974.html 我看了一下发现关于c下的CImage图像处理类 的图像处理相关的介绍真的是比较少&#xff0c;因为我要做大二的数据结构的课程设计&#xff0c;要用纯c语言去实现&#xff08;老…

C++,CImage类的建立方法(可以打开图像和保存)

建立CImage类&#xff08;以vs2015为例&#xff09; 一&#xff0c; 新建一个MFC项目&#xff1a;名字为 image3 二&#xff0c; 单个文档&#xff0c;MFC标准&#xff0c;然后完成。 三&#xff0c;打开应用程序的 stdafx.h 文件添加 CImage 类的包含文件&#xff1a; #incl…

VB.net 进程通信中FindWindow、FindWindowEX、SendMessage函数的理解

目录 一、代码背景 二、主要工具 三、函数解析 1、FindWindow&#xff1a; 2、 FindWindowEx&#xff1a; 3、SendMessage&#xff1a; 四、具体代码示例&#xff1a; 1、第一部分功能&#xff1a; A、接收端&#xff1a; B、发送端 C、运行测试 2.第二部分功能&…

C#-FindWindow的用法

C# FindWindow用法 函数功能&#xff1a;该函数获得一个顶层窗口的句柄&#xff0c;该窗口的类名和窗口名与给定的字符串相匹配。 这个函数不查找子窗口。在查找时不区分大小写。 函数型&#xff1a;HWND FindWindow&#xff08;LPCTSTR IpClassName&#xff0c;LPCTSTR IpWi…

vb.net中FindWindow方法的使用

问题描述 遇到的问题是&#xff0c;需要判断MsgBox是否已经弹出&#xff0c;如果已经弹出就不要重复弹出了。 解决方案&#xff1a; 利用FindWindow方法判断MsgBox是否已经出现 MsgBox的本质就是一个窗体&#xff0c;有标题和内容&#xff0c;可以使用FindWindow这个API函数去…

C# FindWindow的用法

找了一大堆C#怎么用FindWindowAPI函数不多说,请看步骤. 创建好WinForm窗口,如果不会创建的话,在图下面有. 项目名字和位置这个自己设置,下面那个框架,目前现在出5.0了,为了演示实例,就4.6吧. 创建完成后,把自己窗口设置一下

FindWindow ,GetWindowThreadProcessId , OpenProcess 和ReadProcessMemory

文章目录 FindWindow函数功能&#xff1a;函数声明&#xff1a;第一个参数第二个参数返回值注意&#xff1a;GetWindowThreadProcessId函数功能函数声明第一个参数&#xff1a;第二个参数&#xff1a;返回值代码实现OpenProcess函数功能&#xff1a;函数声明&#xff1a;第一个…

【CV系列】主动轮廓模型snake及其应用

DATE: 2019.5.30 前言 主动轮廓模型(Active Contour Model)&#xff0c;又被称为Snake&#xff0c;是由Andrew Blake教授提出的一种目标轮廓描述方法&#xff0c;主要应用于基于形状的目标分割。该模型的优越之处在于它对于范围广泛的一系列视觉问题给出了统一的解决方法,在最…

图像分割之Snake主动轮廓模型(Matlab代码)

示例演示 如果在中文搜索的话&#xff0c;一般会找到《数字图像处理-图像分割&#xff1a;Snake主动轮廓模型 Matlab代码及运行结果》。里面有句代码&#xff0c;千万别用&#xff0c;否则出不来效果。&#xff08;别问我怎么知道的&#xff09; % 转化为双精度型 %I im2doub…

Snake活动轮廓模型Matlab实现

1. Snake模型 人为地在图像感兴趣的区域&#xff08;ROI&#xff09;上给出初始轮廓曲线&#xff0c;最小化一个能量函数&#xff0c;使轮廓曲线在图像中运动&#xff08;变形&#xff09;&#xff0c;最终逼近该区域的边界。 设v(s)[x(s),y(s)]为活动轮廓线&#xff0c;s∈[0,…

snake主动轮廓模型

模型&#xff1a;一条可变形的参数曲线及相应的能量函数&#xff0c;以最小化能量函数为目标&#xff0c;控制参数曲线变形&#xff0c;具有最小能量的闭合曲线即是目标轮廓。 snake模型调和了上层知识和底层图像特征矛盾。 上层知识指物体形状。表示内部力。 底层图像特征是局…