水平集方法框架

水平集方法是现代图像处理中很重要的一个方法,为了说清楚这个东西,我们先介绍几个基本的概念。

零水平集

对于一个函数 ϕ(x⃗):Rn→R\phi(\vec x):{\mathbf{R}^n}\rightarrow \mathbf{R}ϕ(x):Rn→R(其中x⃗∈Rn\vec x \in {\mathbf{R}^n}x∈Rn ,下同),取其值域为零部分对应的定义域:
Γ={x⃗∣ϕ(x⃗)=0}\Gamma = \{ \vec x|\phi (\vec x) = 0\}Γ={x∣ϕ(x)=0}
这里, Γ∈Rn−1\Gamma \in {\mathbf{R}^{n-1}}Γ∈Rn−1 称为函数 ϕ\phiϕ 的零水平集,反之, ϕ\phiϕ 称为 Γ\GammaΓ 的一个水平集函数。

通俗地说,函数的水平集是这个函数在某个高度上所有点的一个集合。函数的零水平集有一些良好的性质,在如下图所示的曲面演化问题中,

n⃗\vec nn 为外法线向量, Γ\GammaΓ 为演化曲线。我们不妨假设有函数 ϕ(x⃗)\phi(\vec x)ϕ(x),它的零水平集为 Γ\GammaΓ ,并且满足,
{ϕ&gt;0x⃗∈Γinϕ&lt;0x⃗∈Γout\left\{ \begin{aligned} &amp;\phi &gt; 0&amp;&amp;\vec x \in {\Gamma_{in}}\\ &amp;\phi &lt; 0&amp;&amp;\vec x \in {\Gamma_{out}}\\ \end{aligned} \right.{​ϕ>0ϕ<0​​x∈Γin​x∈Γout​​
这里, Γin\Gamma_{in}Γin​ 表示 Γ\GammaΓ 内部, Γout\Gamma_{out}Γout​ 表示 Γ\GammaΓ 外部。那么,对于任意的 x⃗∈Γ\vec x \in \Gammax∈Γ , ϕ\phiϕ 有如下两个性质:

  • ∇ϕ∣∇ϕ∣=−n⃗\frac{{\nabla \phi }}{{|\nabla \phi |}} = - \vec n∣∇ϕ∣∇ϕ​=−n
    证明:
    如图所示,设 s⃗\vec ss 为零水平集 Γ\GammaΓ 的切线方向, ϕ\phiϕ 在 Γ\GammaΓ 沿切线方向上恒为零,故有:
    ∂ϕ∂s=0\frac{{\partial \phi }}{{\partial s}} = 0∂s∂ϕ​=0 由链式法则,可得:
    ϕs(x⃗)=∇ϕ⋅x⃗s=0{\phi _s}(\vec x) = \nabla \phi \cdot {{\vec x}_s} = 0ϕs​(x)=∇ϕ⋅xs​=0
    由此可知 ∇ϕ\nabla \phi∇ϕ 与切向垂直,对 ∇ϕ\nabla \phi∇ϕ 进行单位化并根据 ϕ\phiϕ 内正外负的情况取符号,即得:
    ∇ϕ∣∇ϕ∣=−n⃗\frac{{\nabla \phi }}{{|\nabla \phi |}} = - \vec n∣∇ϕ∣∇ϕ​=−n

  • div(∇ϕ∣∇ϕ∣)=−κ{\rm{div}}(\frac{{\nabla \phi }}{{|\nabla \phi |}}) = -\kappadiv(∣∇ϕ∣∇ϕ​)=−κ
    证明:
    ϕs\phi_sϕs​ 在 Γ\GammaΓ 沿切线方向上恒为零,故有: ϕss=0\phi_{ss}=0ϕss​=0 ,由链式法则,可知:
    ϕss(x⃗)=∂∂s(∇ϕ⋅x⃗s)=∂∂s∇ϕ⋅x⃗s+∇ϕ⋅x⃗ss{\phi _{ss}}(\vec x) = \frac{\partial }{{\partial s}}(\nabla \phi \cdot {{\vec x}_s}) = \frac{\partial }{{\partial s}}\nabla \phi \cdot {{\vec x}_s} + \nabla \phi \cdot {{\vec x}_{ss}}ϕss​(x)=∂s∂​(∇ϕ⋅xs​)=∂s∂​∇ϕ⋅xs​+∇ϕ⋅xss​
    由曲率的定义,有 x⃗ss=−κn⃗\vec x_{ss}=-\kappa \vec nxss​=−κn ,由性质 [xz1] ,有 ∇ϕ⋅n⃗=−∣∇ϕ∣\nabla \phi \cdot \vec n = -|\nabla \phi|∇ϕ⋅n=−∣∇ϕ∣ ,代入上式,移项,可得:
    −κ∣∇ϕ∣=∂∂s∇ϕ⋅x⃗s- \kappa |\nabla \phi | = \frac{\partial }{{\partial s}}\nabla \phi \cdot {{\vec x}_s}−κ∣∇ϕ∣=∂s∂​∇ϕ⋅xs​
    将上式左端展开,即证。

水平集方程

如下图所示,

我们将演化曲线上各点的速度分解到法线方向和切线方向,切线方向的速度不影响曲线几何形状的改变,所以,考虑由曲率驱动的曲线演化问题时,我们可以只考虑曲线上的点沿法向的速度。我们现在寻找一个发展方程 ϕ(x⃗(t),t)\phi(\vec x(t),t)ϕ(x(t),t) ,使得在每一个时刻 ttt ,它的零水平集 Γ(t)\Gamma(t)Γ(t) 恰好是曲线在不同的时刻的状态。

如上图所示,曲线上任意一点从当前时刻到下一个时刻,始终保持 ϕ(x⃗(t),t)=0\phi(\vec x(t),t)=0ϕ(x(t),t)=0 ,故对一个特定的时刻 ttt ,对任意 x⃗∈Γ(t)\vec x \in \Gamma(t)x∈Γ(t) ,有以下式子成立:
∂ϕ(x⃗,t)∂t=0\frac{{\partial \phi (\vec x,t)}}{{\partial t}} = 0∂t∂ϕ(x,t)​=0
使用链式法则,可以得到:
∂ϕ(x⃗,t)∂t+∂ϕ(x⃗,t)∂x⃗⋅∂x⃗∂t=0\frac{{\partial \phi (\vec x,t)}}{{\partial t}} + \frac{{\partial \phi (\vec x,t)}}{{\partial \vec x}} \cdot \frac{{\partial \vec x}}{{\partial t}} = 0∂t∂ϕ(x,t)​+∂x∂ϕ(x,t)​⋅∂t∂x​=0
如图所示,我们将 ttt 时刻, Γ\GammaΓ 曲线上的点的速度 v⃗\vec vv 分解为沿外法线方向的速度 v⃗n\vec v_nvn​ 和切线方向速度 v⃗s\vec v_svs​ ,用 vnv_nvn​ 表示 v⃗n\vec v_nvn​ 的大小,负值表示方向为内法线方向。容易知道, x⃗t=v⃗\vec x_t = \vec vxt​=v ,再由之前的式子 ,那么上式可变为:
ϕt(x⃗,t)−vn∣∇ϕ(x⃗,t)∣=0{\phi _t}(\vec x,t) - {v_n}|\nabla \phi (\vec x,t)| = 0ϕt​(x,t)−vn​∣∇ϕ(x,t)∣=0
此方程是一个特殊的哈密顿-雅克比方程 (Hamilton-Jacobi Equation) ,一般就称之为水平集方程,需要注意的是,此时方程中的 x⃗∈Γ(t)\vec x \in \Gamma(t)x∈Γ(t) 。结合给定的初始曲线,那么曲线演化问题就转化为了解下面一个偏微分方程:
{ϕt(x⃗,t)−vn∣∇ϕ(x⃗,t)∣=0x⃗∈Γ(t),t&gt;0Γ(0)={x⃗∣ϕ(x⃗,0)=0}\left\{ \begin{aligned} &amp;{\phi _t}(\vec x,t) - {v_n}|\nabla \phi (\vec x,t)| = 0&amp;\vec x \in \Gamma(t),t&gt;0\\ &amp;\Gamma(0)=\{\vec x|\phi(\vec x,0)=0\}\\ \end{aligned} \right.{​ϕt​(x,t)−vn​∣∇ϕ(x,t)∣=0Γ(0)={x∣ϕ(x,0)=0}​x∈Γ(t),t>0

符号距离函数

符号距离函数 (Signed Distance Function) 是一个水平集函数,它给定了点到某条曲线上距离这个点最近点的距离,也可以说是这个点离曲线的最短距离,它在数学上可以这样表述:

在某区域上给定一条曲线 Γ\GammaΓ ,定义与之相关的函数:
d(Γ,x⃗)={min⁡y⃗∈Γ∣x⃗−y⃗∣x⃗∈Γin−min⁡y⃗∈Γ∣x⃗−y⃗∣x⃗∉Γind(\Gamma,\vec x)= \left\{ \begin{aligned} \mathop {\min }\limits_{\vec y \in \Gamma } |\vec x - \vec y| &amp; &amp; &amp;\vec x \in \Gamma_{in}\\ -\mathop {\min }\limits_{\vec y \in \Gamma } |\vec x - \vec y|&amp; &amp; &amp;\vec x \notin \Gamma_{in}\\ \end{aligned} \right.d(Γ,x)=⎩⎪⎨⎪⎧​y​∈Γmin​∣x−y​∣−y​∈Γmin​∣x−y​∣​​​x∈Γin​x∈/​Γin​​
Γin\Gamma_{in}Γin​ 指 Γ\GammaΓ 内部,二维情况下, x⃗∈R2,y⃗∈R2\vec x \in \mathbf{R}^2 \text{,} \vec y\in \mathbf{R}^2x∈R2,y​∈R2 ,那么称 ddd 为一个符号距离函数,下面把符号距离函数也简称为 SDF 。

符号距离函数有很多良好的性质,包括在边界上的几乎处处可微,关于凸区域的凸性,以及不同符号距离函数之间和差运算的一些性质,作为重点,列以下两条关于单位法向量和平均曲率的性质:

  • 对于任意的 x⃗∈Γ\vec x \in \Gammax∈Γ ∣∇d∣=1|\nabla d| = 1∣∇d∣=1 这也是符号距离函数的一个判断条件,它是充要的。这里的充分性怎么理解?指的是对任意水平集曲线上的点都要满足。

  • 对于任意的 x⃗∈Γ\vec x \in \Gammax∈Γ ,由水平集函数的性质可得:
    ∇d=−n⃗⋅∣∇d∣=−n⃗Δd=−κ∣∇d∣=−κ\begin{aligned} &amp;\nabla d = - \vec n \cdot |\nabla d|=-\vec n &amp;\\ &amp;\Delta d = - \kappa |\nabla d| = - \kappa &amp; \end{aligned}​∇d=−n⋅∣∇d∣=−nΔd=−κ∣∇d∣=−κ​​

以上便是水平集方法的一些相关的基础知识。

水平集方法的一个基本框架相关推荐

  1. level set 介绍4(水平集方法)

    2.5 水平集方法 在2.4中的时候,我们已经知道曲线演化主要涉及到两个几何参数,一个是曲线的曲率,一个是曲线的方向矢量,而这两个参数的计算一并不是一件容易的事情,怎么有效的更方便处理曲线的几何参数的 ...

  2. 卷积神经网络结合水平集方法

    水平集方法用于深度卷积网络 水平集简介 CNN结合Level Set 疑惑 水平集简介 水平集(Level Set)方法是用于图像分割非常受欢迎的方法,其通过比目标维度高一维的水平集函数(LSF)的零 ...

  3. 水平集方法引入主动轮廓模型算法中的两种方法

    水平集方法引入主动轮廓模型算法中的两种方法 1.传统的基于主动轮廓模型和水平集理论的方法 2.变分水平集方法 在讲解水平集理论在主动轮廓模型中的应用前,我们先用流程图说明一下常见的处理主动轮廓模型的流 ...

  4. 拓扑优化中SIMP方法与水平集方法有何优缺点,水平集法变换到高维,不是更复杂了...

    作者:周平章 链接:https://www.zhihu.com/question/52008623/answer/187927508 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  5. 计算机视觉之图像分割——水平集方法_ACWE2001

    一个简单的例子引入能量函数 其实是Mumford-Shah的特例 用水平集函数表示曲线 变分法得到欧拉-拉格朗日公式 迭代法解偏微分方程 算法 问题 这篇博客介绍的是2001年的一篇文章Active ...

  6. 【图像分割】基于GAC水平集方法实现图像分割matlab 源码

    一.简介 1 原理分析\ \ \ \ \ 2 编程过程\ 2.1 准备工作\ \ 2.2 迭代运算\ 二.源代码 ``` %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  7. 基于水平集方法和G0模型的SAR图像分割

    基于水平集方法和G0模型的SAR图像分割 Abstract(摘要) 这篇文章提出了一种分割SAR图像的方法,探索利用SAR数据中的统计特性将图像分区域.我们假设为SAR图像分割分配参数,并与水平集模型 ...

  8. 基于水平集的图像分割方法

    一.引言 借鉴一些流体中的重要思想, 1988年,Osher和Sethian首次提出了水平集算法[1],这是一种有效解决曲线演化问题的数值方法,并且计算稳定,适宜任意维数空间.随后,Osher等人对水 ...

  9. 水平集与图割算法浅析

    LeveSet 水平集方法主要的思想是利用三维(高维)曲面的演化来表示二维曲线的演化过程.在计算机视觉领域,利用水平集方法可以实现很好的图像分割效果. 1.数学原理 根据维基百科的定义,在数学上一个包 ...

最新文章

  1. 1.为什么使用spring boot
  2. 分布式存储MooseFS的搭建
  3. es springboot 不设置id_springboot整合ES_文档ID删除
  4. html页面 wordpress,WordPress纯代码实现前端页面HTML完美压缩
  5. PV EV AC BAC EAC ETC等计算公式
  6. Linux 内存管理之 SLUB分配器(6):slub debug 实例测试
  7. 设计模式和java实现
  8. rtnetlink组数量与设置
  9. php求1000以内的素数 10个一行,1000以内的素数_php求1000以内质数
  10. 卡尔曼滤波器工作原理
  11. reimage repair-打开网页总是自动跳转要你下reimage repair
  12. CodeRunner破解
  13. 编写Java程序,使用抽象类和抽象方法构建不同动物的扑食行为,抽象类设计
  14. word,Excel等office中鼠标不停闪动的解决方法
  15. Redis过期时间及过期策略
  16. iOS拍照识别车牌技
  17. 咸鱼Micropython—LED用法
  18. 我的2018——最美的年龄为最纯的梦想尽最大的努力
  19. 移植Opencv到arm tq2440
  20. VMware Workstation 15 Pro 秘钥

热门文章

  1. Python修仙之路 —— 类变量在实例方法和类方法的调用方式
  2. 什么是包含块,对于包含块的理解?
  3. DOM--操作元素案例:分时显示不同的图片以及问候语;仿淘宝关闭标签案例;隐藏显示文本框内容;仿新浪注册页面中密码长度的判定
  4. Loader技术原理
  5. VMware创建Windows虚拟机与优化
  6. SystemC: sc_bv and sc_uint
  7. 在Vue中获取DOM元素的实际宽高
  8. 如何利用Python和win32编程避免重复性体力劳动(二)——菜单操作:GetMenu,GetSubMenu,GetMenuItemID以及wParam的HIWORDLOWORD
  9. multiprocessing.Pool报pickling error
  10. Android-彻底解决启动白屏、跳转页面白屏!