本篇文章,解释的是水平集算法最基础的原理。
  • 1

水平集方法的解释 
有一个表面S,它与一个平面P相交,得到一个曲线C,这个C就是我们通过水平集得到的轮廓。 
在图像分割中,表面S是随着由图像派生得到的势(force)来更新。 
本文的思路是: 
1提出问题 
2提出解决方法 
3方法的局限性

跟踪界面 
首先,我们来想象水从一个小山的山顶往下流的画面。我们的目标是,在水往下流的时候,跟踪水前(water front,每一个点的水下一秒流动的方向叫作水前,我们跟踪的是所有点的水前。并且我们的初始条件是,所有初始位置点构成的曲线)。

如下图所示,这是一个V型小山,黑色部分是山顶,越往白色的地方,海拔越低。 
 
红色箭头是水前。

问题来了,如何在给定时间T时刻,得到所有的水前?

显式轮廓方法 
一个方法是,跟踪一系列点,沿着它们的法线方向(normal direction)来演化水前,并且猜测水前的停止位置。

如下图所示,在t=0时刻点集的水前位置,当t=1的时候,点集运动到了虚线位置。 

显式演化一个点集的水前,听起来是个好主意,但是它有很大的缺陷,使得我们不得不放弃这种可以直观理解的方法。

那究竟是什么缺陷呢? 
如下图所示,这个倒V型的曲线,在它的顶端是一个角(corner)。离角最近的那两个点有着各自的水前,它们方向不一致。随着水前的演化,该角最后的状态将无法得知。红色是0时刻的点状态,粉色是1时刻的点状态。 
 
另外,如果水前是向外扩展的,那么初始的点集可能不够用来得到演化后的水前。需要使用插值法或者在演化出现冲突的时候删掉一些点。并且,点之间的距离要保证足够小,才能得到平滑的水前。这种得到演化水前的机制在应用时是很麻烦的。

在应用上,拓扑变化需要关注的问题更多,比如在分裂和合并的情况下。在我们的小山流水的例子中,左图的中间的红色矩形方框是初始点集,圈住的是山顶最高位置,即将向上下的白色山谷流下去。 
在右图中,我们看到,初始点集演化到一定阶段,就会分裂,并且分裂后会与本来在山谷里的曲线合并~问题很明白了,这个方法要解决的挑战是,如何确定在分裂时该插入的点,以及在分裂时该删掉的点呢? 
  
所以,追踪点集的水前,尽管是一个很直观的办法,但却有很难解决的缺陷。

隐式轮廓方法 
这个方法的本质是演化一个表面S,而不是一个水前曲线C,且我们用隐式轮廓法得到的水前定义为这个表面S在高度h=0的所有点构成的集合(没有删除和插值这么麻烦的事情了,开心~)。于是根据定义,水前曲线就是零水平集φ=0。如下图所示,是从一个演化的表面得到轮廓。 
 
当表面φ(x,y,t)在演化时,它将呈现杯状,过后杯口或将变窄,或将消失。下图中的零水平集显示了轮廓曲线合并和分裂的情况,z=0表示的是山谷。 
  
(a)t=50,合并开始 (b)t=52,合并结束 
  
(c)t=90,分裂开始 (d)t=120,分裂结束

对于拓扑变化,我们不用再过多关注其它问题了。 
那么问题在于,我们如何确定函数φ呢?

水平集方程 
首先,我们来看看这个方法背后的数学理论~ 
点x(x,y)属于一个随着时间演化的曲线,x(t)为它在t时刻的位置。在任意时刻t,对于每一个点x(t)都是表面φ在高度为0的曲线上的点,即: 
φ(x(t),t) = 0

问题还是,这个函数φ到底是什么呢? 
只要它给得出我们需要的零水平集,那么它可以是任何定义。。。(这就糟了,怎么造呢)

举个栗子,上面有一幅图,显示的初始轮廓是一个矩形。该表面的高度等于(x,y)到轮廓上点的最近距离,于是有φ(x,y,t=0)=±d,+d表示在轮廓外,-d表示在轮廓内。只要φ的零水平集可以匹配初始轮廓,那它可以被定义成任何函数。 
在时刻t=0处,给定初始函数φ,根据运动方程∂φ/∂t我们可以得到任意t时刻的φ。对于此,利用链式法则,有: 
 
把∂φ/∂x记作▽φ,速度x_t 的方向由表面的法向量给定,因此x_t =F(x(t))n,其中。上面的运动方程可重写为: 
 
最后一个方程定义了φ的运动。给定t=0时的φ以及它随时间演化的运动方程,我们可以通过演化初始函数得知任何t时刻的。这样我们就回答了最初的问题,即我们知道了φ是什么。 
φ有个有趣的特征,就是我们可以用下式得到表面的曲率: 
 
我们可以用这个来控制水前曲线的平滑度。

应用 
在计算机的世界,图像是具有的像素,而函数需要被离散化。也就是说,在 像素(i,j)处的值由估计。这个梯度由有限差分法(finite difference scheme)来估计,比如下: 
 
其中,对于给定点x,表示左有限差分,表示右有限差分。如下图所示,梯度计算的方式因水前方向的不同而不同,有点差分法也会考虑到水前方向。 
 
于是,之前的运动方程可化作: 
 
从此,我们可以用下式来更新表面: 
 
当我们计算曲率的时候,只依赖于表面φ。于是可以使用中心差分法: 
 
曲率的数值计算可利用下式: 

为了使水前曲线平滑,高的曲率应该被惩罚。为了使零水平集扩展,我们不通过减小φ,而是利用高曲率使得水前运动反向。我们可以利用曲率来更新: 

结果 
给定任意的初始函数φ,比如一个初始轮廓的距离转换,的数值计算方法,我们来展示一些轮廓演化的例子。 
第一个小栗子,一滴在扩展的水,前面有一个小障碍物,如下图所示: 
 
水前运动被障碍物停止下来,并被扰动。 
下面有个更复杂的例子。 
 
初始轮廓仍旧是个圆~~随着表面的演化,轮廓开始分裂,从第三图可看到已经完全分裂。

下面这个例子,利用真实的图片。不使用连续的正势和负势,有无曲率皆可以,我们利用图像派生出势(force)。这个势值在物体内应该很高,在十分接近物体的边缘时,应该很低(我们是从物体内部去得到它的边缘的)。图像的梯度表现了它的边缘所在。 
  
势可以是上面梯度图像的逆,也可以是它的高斯部分,如下: 
 
λ和σ是控制惩罚因子的参数。下图是使用梯度图像来演化轮廓: 
  

到此为止,你应该了解,水平集方法是关于演化表面的函数,而不是演化曲线的函数~~(尽管我们的目的是得到轮廓) 
这也是这个方法的优雅魅力之处!

水平集(level set)算法原理介绍相关推荐

  1. [图像处理]水平集(Level set)算法实现思路(简化)

    [图像处理]水平集(Level set)算法实现思路(简化) 创建时间:2020年6月22日 修改时间:2021年6月12日 文章目录 [图像处理]水平集(Level set)算法实现思路(简化) 一 ...

  2. 目标检测—SSD系列算法原理介绍

    一.SSD系列算法原理介绍 1.1 SSD算法介绍: ➢Single Shot MultiBox Detector (one-stage方法)                  ●Wei Liu在EC ...

  3. 常见的推荐算法原理介绍

    常见的推荐算法原理介绍,随着互联网的发展短视频运营越来越精准化,我们身边常见的抖音.火山小视频等软件让你刷的停不下来,这些软件会根据你的浏览行为推荐你感兴趣的相关内容,这就用到了很多推荐算法在里面. ...

  4. GAT 算法原理介绍与源码分析

    GAT 算法原理介绍与源码分析 文章目录 GAT 算法原理介绍与源码分析 零. 前言 (与正文无关, 请忽略) 广而告之 一. 文章信息 二. 核心观点 三. 核心观点解读 四. 源码分析 4.1 G ...

  5. 【机器学习】5:谱聚类算法原理介绍

    前言:学习谱聚类,最好有一些图论.矩阵分解(SVD)方面的知识,这样会更加有利于谱聚类的学习.当然,谱聚类理解起来并不困难,实际操作也大多是谱聚类+K-means聚类联合使用的. –--------- ...

  6. 【MATLAB第6期】基于MATLAB的粒子群及若干改进的粒子群算法原理介绍 持续更新

    一.经典粒子群PSO算法 1 思想来源 粒子群优化(Particle Swarm Optimization,PSO) 作为进化计算的一个分支,是由 Eberhart 和 Kennedy 于 1995 ...

  7. 图像处理:TDLMS算法原理介绍及MATLAB实现

    一.TDLMS介绍 1.1 算法原理 二维最小均方(two-dimensional least mean square, TDLMS)滤波算法由最小均方误差(least mean square err ...

  8. 最差性能最优波束形成算法原理介绍及MATLAB实现

    原理介绍 标准的Capon波束形成是最小化阵列输出功率,并且对期望信号无失真接收来达到最大化输出信干噪比的目的.但是当真实导向矢量未知且存在一个不确定集中时,为了对真实导向矢量设置无失真响应约束,最差 ...

  9. SSD算法原理介绍,包含算法结构、Loss计算、默认框计算几个方面

    一.SSD算法的介绍 1.SSD算法: 是One-stage目标检测算法中的一种,不需要region proposal阶段,可以直接产生物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结 ...

最新文章

  1. java构造方法的书写和注意事项(入门可看)
  2. 关肇直 automation lingjunrenwu
  3. 机器视觉中彩色成像必须考虑的十个问题
  4. T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响...
  5. html 设置div占位符,HTML5+CSS3 一组文本输入框占位符动效
  6. 宝塔面板使用阿里云ssl证书
  7. 顺序、二分查找文本数据
  8. SwiftUI之深入解析高级动画的时间轴TimelineView
  9. C#中使用MD5对用户密码加密与解密
  10. .Net中json序列化与反序列化
  11. arch开机自动认证
  12. CommandName 与 CommandArgument
  13. mac终端 install_Mac常用终端命令
  14. c语言题库打不开软件,编写题库程序_想把一个老师编的做题练习的软件里面的题库弄出来貌似是用VB60编写的要怎么做啊_淘题吧...
  15. Hook技术第二讲,之虚表HOOK
  16. CodeForces - 767C Garland(附带易错数据)
  17. Java 集合之TreeSet 自定义类 比较器
  18. 计算机视觉基础知识复习
  19. 机器学习综述——机器学习理论基础与发展脉络
  20. 南卡和三星哪款蓝牙耳机音质好些?高颜值且音质好的蓝牙耳机测评

热门文章

  1. ps基础学习: ps使用环境介绍
  2. 区块链:多链体系在提升性能的同时,怎么去保证单链被攻击性问题
  3. 二分图最大匹配——匈牙利算法
  4. 01 AppStore付费App的数据可视化分析
  5. 每周评论:科学领域的妇女和女孩,碳足迹,Angular 9等
  6. Flash中使用AS3改变元件整体颜色,模拟涂鸦
  7. 关于本次活动超算平台的vscode远程连接(新人向)
  8. hexo 搭建个人博客
  9. 关于二分类,多分类,及多标签分类的损失函数详解及Pytorch实现
  10. 工大科雅通过注册:年营收4亿 逾期应收账款余额超2亿