传统图像分割——分水岭算法(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)这些影响区域的边界被称为“分水岭”(相当于是寻找波峰线)这样做的好处在于对于图片梯度的估计非常直接,便于寻找图像的梯度波峰,用于分割。
下图所示为分水岭的一维示意图。更直观一点来讲,首先戳漏每一个局部最小值点,然后水从下到上漫延会逐渐淹没BViBV_iBVi​这些影响区域(图(a),也被称为吸水盆地,注意这些不同的吸水盆地内水的高度是一致的);而随着水位继续上涨中间的小峰值也会被淹没,为了不让两个不同的影响区域合并会建立一个水坝(图(b)中Barrage),这些水坝就是“地形图”的分水岭,也可以想象为图形的边缘。

而对于图像分割任务这种二维的情况,分水岭更难获取,二维的情况如下图所示(分水岭为图中Dam)


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

1.定义

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

  • 测地线影响区域(geodesic influence zone):对于AAA中的一个点BiB_iBi​,所有与点BiB_iBi​的测地线距离小于距离其他点BjB_jBj​距离的点的集合,即izA(Bi)={p∈A,∀j∈[1:i−1,i+1:k],dA(p,Bi)<dA(p,Bj)}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​)={p∈A,∀j∈[1:i−1,i+1:k],dA​(p,Bi​)<dA​(p,Bj​)}

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

2.算法流程

  • 首先,把梯度图像中所有的像素按照灰度值分类,并设定一个测地线距离阈值
  • 其次,找到灰度值最小的像素点(即hminh_{min}hmin​),让阈值从最小值开始增长(hmin+1h_{min}+1hmin​+1,…,hmaxh_{max}hmax​),在增长的过程中计算hminh_{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


总结

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

传统图像分割——分水岭算法(watershed)相关推荐

  1. OpenCV3学习(7.2)——图像分割之二(分水岭算法watershed)

    分水岭算法原理 分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭 ...

  2. Opencv分水岭算法——watershed自动图像分割用法

    分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特 ...

  3. OpenCV学习(二十) :分水岭算法:watershed()

    OpenCV学习(二十) :分水岭算法:watershed() 参考博客: OpenCV-分水岭算法 图像处理--分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法--wat ...

  4. 使用OpenCV和C++实现的分水岭算法(Watershed)

    分水岭算法(watershed)是一种比较基本的数学形态学分割算法,其基本思想是将灰度图像转换为梯度图像,将梯度值看作高低起伏的山岭,将局部极小值及其邻域看作一个"集水盆".设想一 ...

  5. OpenCV4.5.5学习笔记(十七):分水岭算法watershed(),图像修补inpaint()

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.分水岭算法watershed() 二.图像修补inpaint() 总结 前言 笔者本科时候有幸接触了OpenCV3 ...

  6. 传统图像分割——区域合并算法(region merging)

    传统图像分割--区域合并算法(region merging) 前言 本篇文章主要梳理基于区域算法的原理.首先先介绍区域增长算法:然后在此基础上介绍区域合并算法:之后再介绍区域分割合并算法,最后介绍20 ...

  7. 基于边缘的图像分割——分水岭算法(watershed)算法分析(附opencv源码分析)

    最近需要做一个图像分割的程序,查了opencv的源代码,发现opencv里实现的图像分割一共有两个方法,watershed和mean-shift算法.这两个算法的具体实现都在segmentation. ...

  8. Opencv 分水岭算法 watershed的图像分割

    分水岭算法 参考博客: (1)迈克老狼2012   https://www.cnblogs.com/mikewolf2002/p/3304118.html (2)-牧野-              h ...

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

    文章目录 1 原理 2 算法改进 3 API 4 实例 1 原理   分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示 ...

最新文章

  1. php 生成动态键值 数组_你的PHP项目遇到性能问题了吗?看完这篇性能分析恍然大悟...
  2. 一个JS对话框,可以显示其它页面,
  3. XML 的简介与开发
  4. 如何判断对象是不是出轨了?
  5. Ubuntu 16.04安装Bless十六进制编辑器
  6. 你见过错误 CS0234...吗?
  7. 素数环(nyoj488)
  8. 竞价排名才是万恶之源
  9. 【网络信息安全】网络安全基础
  10. 她,18岁,李飞飞三度公开表扬,高中时NIPS获奖,创造「AI手术教练」
  11. 飞聊不可 · 上海技术招聘专场
  12. mysql5.7 主从
  13. 如果面试官问您还有什么问题要问的,应该如何巧妙的回答才算合适呢?
  14. FlinkSQL 列转行/解开map array/unnest/lateral table udtf
  15. 爬取搜狗微信文章笔记2
  16. 学生信息管理系统-结构体编写
  17. windows 10目标文件夹访问被拒绝(没有权限)或者(你需要来自XXX的权限才能对此文件夹进行更改 )
  18. 欢迎百度成为开源社年度白金伙伴
  19. SveletJs学习——运动动画
  20. DAY12 计蒜客 有趣的数字 爬楼梯 七巧板

热门文章

  1. 微信小程序的onLoad方法不执行
  2. swift5 中 selector 的正确写法
  3. 年轻人应该如何看待高薪
  4. NVIDIA之Tesla、GeForce和Quadro系列GPU对比
  5. 人生在世短短几十载,怎甘碌碌终生而无为?
  6. fastjson详解
  7. Java通俗易懂30天 第30天:Java9- 14 新特性
  8. 分组后取每组最新的数据
  9. 按某个字段分组并排序后,取每一组的第一条数据
  10. 【人工智能】机器学习的持续交付 (CD4ML)