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

创建时间:2020年6月22日
修改时间:2021年6月12日

文章目录

  • [图像处理]水平集(Level set)算法实现思路(简化)
    • 一、水平集介绍
    • 二、DRLSE模型构建
      • (一) 水平集算法的主要迭代公式
      • (二) 水平集函数初始化
      • (三) 零水平集的计算-窄带构建
    • 三、必要公式补充

一、水平集介绍

图像分割的首要任务是确定图像的轮廓。图像内物体的轮廓,其实际上是一条二维平面内的闭合曲线,而基于对这一数学事实的思考,研究者们开始探究从更高维度的思考角度审视图像分割的算法实现,水平集方法(Level Set Method,LSM)应运而生。
       LSM不直接对图像轮廓进行检测操作,而是将图像轮廓嵌入到更高维度的函数,此时,当前的图像的二维轮廓即为这个高纬度曲面函数的零水平集。这个高维函数称为水平集函数(Level Set Function, LSF),图像轮廓被认为是LSF的零水平集,即当前轮廓(闭合曲线L)满足
L={(x,y)∣ϕ(x,y)=0}(1)L=\{~(x,y)~|~\phi(x,y)=0~\} \tag{1} L={ (x,y) ∣ ϕ(x,y)=0 }(1)其中, (x,y)(x,y)(x,y) 为该图像轮廓的坐标点集。可以说,闭合曲线L,即当前图像轮廓由LSF的零水平集隐含的表达。LSM将图像轮廓,即二维闭合曲线描述为三维空间内LSF的演化。
       李纯明等人基于对LSM的思考,提出了一种基于距离正则化的不需要对水平集函数进行重新初始化的LSF模型,称为DRLSE模型。又由于对目标图像实现分割需要人为参与,帮助计算机进行选择,因此在本次实验报告中,我还设计了人机交互板块,对用户输入的特定信息进行分析并予以反馈。以下对DRLSE模型的主要迭代公式,以及LSF函数初始化的方法和图像轮廓的求解方式进行简单介绍。

二、DRLSE模型构建

(一) 水平集算法的主要迭代公式

DRLSE模型是由能量公式 E(ϕ)=μRp(ϕ)+Eext(ϕ)\mathcal{E}(\phi)=\mu R_{p}(\phi)+\mathcal{E}_{ext}(\phi)E(ϕ)=μRp​(ϕ)+Eext​(ϕ) 演化而来,其中 Eext(ϕ)\mathcal{E}_{ext}(\phi)Eext​(ϕ) 根据LSM的应用领域的不同而有不同的定义。在图像分割领域,DRLSE模型将其定义为
E(ϕ)=μRp(ϕ)+λLg(ϕ)+αAg(ϕ)(2)\mathcal{E}(\phi)=\mu R_{p}(\phi)+\lambda \mathcal{L}_{g}(\phi)+\alpha \mathcal{A}_{g}(\phi)\tag{2} E(ϕ)=μRp​(ϕ)+λLg​(ϕ)+αAg​(ϕ)(2)其中 μ>0\mu>0μ>0,λ>0\lambda>0λ>0 并且α\alphaα为常数。在公式(2)中,其第二项 Lg\mathcal{L}_{g}Lg​ 表示函数 ggg (公式(11)) 沿着零水平集轮廓的线积分,当LSF的零水平集位于物体的边界时,该线积分最小。公式第三项 Ag\mathcal{A}_{g}Ag​ 描述为当前零水平集,即二维闭合曲线内区域的加权面积。如果初始轮廓放置在物体外部,则 α>0\alpha>0α>0 ,以便在水平集演化过程中零水平轮廓会缩小;如果初始轮廓放置在物体内部,则 α<0\alpha<0α<0 以展开轮廓。当零水平集靠近物体边界时,第三项控制曲线扩展或收缩的速率将减小,使得零水平集逐渐稳定下来(文献使用的参数为μ=0.2,λ=5,α=−3\mu=0.2,\lambda=5,\alpha=-3μ=0.2,λ=5,α=−3)。公式(3) 即对 公式(2) 的离散化。
∂ϕ∂t=μdiv⁡(dp(∣∇ϕ∣)∇ϕ)+λδε(ϕ)div⁡(g∇ϕ∣∇ϕ∣)+αgδε(ϕ)(3){\frac{\partial \phi}{\partial t}=\mu \operatorname{div}\left(d_{p}(|\nabla \phi|) \nabla \phi\right)}{+\lambda \delta_{\varepsilon}(\phi) \operatorname{div}\left(g \frac{\nabla \phi}{|\nabla \phi|}\right)+\alpha g \delta_{\varepsilon}(\phi)} \tag{3} ∂t∂ϕ​=μdiv(dp​(∣∇ϕ∣)∇ϕ)+λδε​(ϕ)div(g∣∇ϕ∣∇ϕ​)+αgδε​(ϕ)(3)其中 δ(ϕ)\delta(\phi)δ(ϕ) 为狄拉克函数,xxx 为空间变量。由于增加了距离正则化项,公式(3)中的所有空间导数都可以用中心差分格式来离散化。中心差分格式比传统水平集公式中常用的一阶迎风格式更精确、更有效。

DRLSE模型等号右侧公式可以代替为
L(ϕi,jk)=μdiv⁡(dp(∣∇ϕ∣)∇ϕ)+λδε(ϕ)div⁡(g∇ϕ∣∇ϕ∣)+αgδε(ϕ)(4)L\left(\phi_{i, j}^{k}\right)=\mu \operatorname{div}\left(d_{p}(|\nabla \phi|) \nabla \phi\right)+\lambda \delta_{\varepsilon}(\phi) \operatorname{div}\left(g \frac{\nabla \phi}{|\nabla \phi|}\right)+\alpha g \delta_{\varepsilon}(\phi) \tag{4} L(ϕi,jk​)=μdiv(dp​(∣∇ϕ∣)∇ϕ)+λδε​(ϕ)div(g∣∇ϕ∣∇ϕ​)+αgδε​(ϕ)(4)在检查文献代码中,发现 公式(4) 中对散度的求解,即 div(⋅)div(·)div(⋅) 算子的计算方式与 公式(4) 描述有一些不同。借鉴文献代码,

(1)对第一项的求解实际上是按照
div⁡(dp(∣∇ϕ∣)∇ϕ)=divergence⁡(dp(∇ϕ)⋅ϕx−ϕx,dp(∇ϕ)⋅ϕv−ϕv)+4∗del⁡2(ϕ)(5)\operatorname{div}\left(d_{p}(|\nabla \phi|) \nabla \phi\right)=\operatorname{divergence}\left(d p(\nabla \phi) \cdot \phi_{x}-\phi_{x}, d p(\nabla \phi) \cdot \phi_{v}-\phi_{v}\right)+4 * \operatorname{del} 2(\phi) \tag{5} div(dp​(∣∇ϕ∣)∇ϕ)=divergence(dp(∇ϕ)⋅ϕx​−ϕx​,dp(∇ϕ)⋅ϕv​−ϕv​)+4∗del2(ϕ)(5)的方式来实现的。其中 divergencedivergencedivergence 和 del2del2del2 都是Matlab内置的函数。
(2)对第二项的求解实际上是按照
div⁡(g∇ϕ∣∇ϕ∣)=gx⋅ϕx∇ϕ+gy⋅ϕy∇ϕ+g⋅divergence(gx,gy)(6)\operatorname{div}\left(g \frac{\nabla \phi}{|\nabla \phi|}\right)=g_{x} \cdot \frac{\phi_{x}}{\nabla \phi}+g_{y} \cdot \frac{\phi_{y}}{\nabla \phi}+g \cdot d i v e r g e n c e\left(g_{x}, g_{y}\right) \tag{6} div(g∣∇ϕ∣∇ϕ​)=gx​⋅∇ϕϕx​​+gy​⋅∇ϕϕy​​+g⋅divergence(gx​,gy​)(6)代码披露如下

% Gradfx,Gradfy 为LSF的偏导数矩阵
fa = divergence(dps.*Gradfx-Gradfx,dps.*Gradfy-Gradfy)+4*del2(faiLSF);  % 公式(5)
% 需要防止分母出现为0的情况,否则将使得分式没意义出现NaN
gx = Gradfx./G;
gy = Gradfy./G;
% g_Gfx,g_Gfy 为函数g的偏导数矩阵
divMatrix = (g_Gfx.*gx+g_Gfy.*gy) + g.*divergence(gx,gy); % 公式(6)

函数左侧的偏微分方程可以通过有限差分格式来实现,即
∂ϕ∂t=(ϕi,jk+1−ϕi,jk)/Δt(7)\frac{\partial \phi}{\partial t}=\left(\phi_{i, j}^{k+1}-\phi_{i, j}^{k}\right) / \Delta t \tag{7} ∂t∂ϕ​=(ϕi,jk+1​−ϕi,jk​)/Δt(7)如此一来,我们解决了离散公式的偏微分方程的求解。于是对于DRLSE模型则有迭代公式
ϕi,jk+1=ϕi,jk+ΔtL(ϕi,jk),k=0,1,2,…(8)\phi_{i, j}^{k+1}=\phi_{i, j}^{k}+\Delta t L\left(\phi_{i, j}^{k}\right), \quad k=0,1,2, \dots \tag{8} ϕi,jk+1​=ϕi,jk​+ΔtL(ϕi,jk​),k=0,1,2,…(8)其中,kkk 表示当前迭代的次数,Δt\Delta tΔt 表示时间步长。我们用在笛卡尔坐标网格上定义的LSF,即 ϕi,j\phi_{i,j}ϕi,j​ 来表示水平集。对于 公式(8) 的理解,可以认为是:
之后的位置=当前位置+时间间隔×速度之后的位置=当前位置+时间间隔\times速度 之后的位置=当前位置+时间间隔×速度

(二) 水平集函数初始化

通常使用二维阶跃函数作为初始LSF,因为它可以极其有效地生成。二维阶跃函数定义为
ϕ0(x)={−c0,if x∈R0c0,otherwise (9)\phi_{0}(\mathbf{x})=\left\{\begin{array}{ll} -c_{0}, & \text { if } \mathbf{x} \in R_{0} \\ c_{0}, & \text { otherwise } \end{array}\right. \tag{9} ϕ0​(x)={−c0​,c0​,​ if x∈R0​ otherwise ​(9)其中c0c_{0}c0​为一个正的常数,而R0R_{0}R0​位于图像域当中。对于一张输入图像III,我们可以自定义初始的R0R_{0}R0​范围。xxx是一个空间位置参量,实际上是图像内网格点的坐标值(i,j)(i,j)(i,j)。难点是判断该网格点是否在R0R_{0}R0​内。然而使用二位阶跃函数的好处在于,当(i,j)(i,j)(i,j)位于R0R_{0}R0​内时,LSF函数值为负;otherwise,为正。这样我们就很好判断当前点的位置了。
      此外,该区域R0R_{0}R0​有时可以通过简单有效的初步分割步骤,如阈值分割,使其接近要分割的区域。因此,只需少量的迭代就可以将零水平集从的R0R_{0}R0​边界移动到所需的图像内的对象的边界。

(三) 零水平集的计算-窄带构建

窄带的构建过程,实际上是确定LSF零水平集位置的过程。在一维曲线当中,曲线某个区间存在零点的充要条件是

1)曲线连续;
2)区间两个端点的函数值的符号相反。

确定LSF的零交叉点也可以用相似的方法来确定。我们仍然使用掩模来完成。在当前处理像素点的领域Ni,j(r)N_{i, j}^{(r)}Ni,j(r)​内,如果ϕi−1,j\phi_{i-1,j}ϕi−1,j​和ϕi+1,j\phi_{i+1,j}ϕi+1,j​是相反的符号,或者ϕi,j−1\phi_{i,j-1}ϕi,j−1​和ϕi,j+1\phi_{i,j+1}ϕi,j+1​是相反的符号,那么当前计算的网格点(i,j)(i,j)(i,j)称之为一个零交叉点。LSF的所有零交叉点的集合用ZZZ来表示。然后,我们构造窄带为
Br=⋃(i,j)∈ZNi,j(r)(10)B_{r}=\bigcup_{(i, j) \in Z} N_{i, j}^{(r)} \tag{10} Br​=(i,j)∈Z⋃​Ni,j(r)​(10)其中Ni,j(r)N_{i, j}^{(r)}Ni,j(r)​是当前网格点的一个(2r+1)×(2r+1)(2 r+1) \times(2 r+1)(2r+1)×(2r+1)尺寸的邻域,这个就是掩模的尺寸大小。该过程可以称之为遍历过程。DRLSE的窄带实现包括以下步骤:

  1. 初始化。确定一个LSF的零水平集函数。我们需要通过人机交互来选择初始零水平集轮廓,这在Section II当中已经说明。然后,依据此可以构造初始窄带Br0=⋃⟨i,j⟩∈Z0Ni,j(r)B_{r}^{0}=\bigcup_{\langle i, j\rangle \in Z^{0}} N_{i, j}^{(r)}Br0​=⋃⟨i,j⟩∈Z0​Ni,j(r)​,其中Z0Z^{0}Z0是零水平集函数中零交叉点的集合。于是,我们应该开辟出一个新的存储区域,来存储这个集合。
  2. 更新LSF函数。使用ϕi,jk+1=ϕi,jk+τL(ϕi,jk)\phi_{i, j}^{k+1}=\phi_{i, j}^{k}+\tau L\left(\phi_{i, j}^{k}\right)ϕi,jk+1​=ϕi,jk​+τL(ϕi,jk​),即公式(4)更新描述的窄带BrkB_{r}^{k}Brk​。这一步需要遍历整个图像区域,完成对整个图像区域的新零水平集计算。
  3. 更新窄带。确定窄带BrkB_{r}^{k}Brk​内的ϕi,jk+1\phi^{k+1}_{i,j}ϕi,jk+1​的所有零交叉点,将这些零交叉点的集合由Zk+1Z^{k+1}Zk+1来描述,然后通过赋值更新窄带的代数。这个对新一代的窄带的赋值关系可以描述为Brk+1=⋃(i,j)∈Zk+1Ni,j(r)B_{r}^{k+1}=\bigcup_{(i, j) \in Z^{k+1}} N_{i, j}^{(r)}Brk+1​=⋃(i,j)∈Zk+1​Ni,j(r)​。
  4. 为窄带上的新像素赋值。位于窄带Brk+1B_{r}^{k+1}Brk+1​内而不在窄带BrkB_{r}^{k}Brk​内的像素点,若ϕi,jk+1\phi^{k+1}_{i,j}ϕi,jk+1​>0则该点的像素值设置为h,否则设置为-h。h是一个常数,它可以设置为h=r+1并作为一个默认值。
  5. 确定迭代的终止准则。如果连续迭代的零交叉点停止变化,或者超过规定的最大迭代次数,则停止迭代;否则,转到步骤2。每一次循环是在求出ϕi,jk+1\phi_{i, j}^{k+1}ϕi,jk+1​之后。

文献代码中,对LSF零水平集位置的确定通过contour函数来实现,代码如下

% 在原始图像上绘制出此时的初始LSF的零水平集
level = [0,0];
contour(initial_faiLSF,level,'r','LineWidth',2);% contour思路借鉴

DRLSE模型迭代的终止准则为,当连续迭代的零交叉点停止变化,或者超过规定的最大迭代次数,则模型停止迭代。

三、必要公式补充

​ 公式(3)中函数 ggg 的表达式
g≜11+∇∣Gσ∗I∣2(11)g \triangleq \frac{1}{1+\nabla\left| G_{\sigma} * I\right|^{2}} \tag{11} g≜1+∇∣Gσ​∗I∣21​(11)其中 GσG_{\sigma}Gσ​ 是一个高斯核函数,σ\sigmaσ 为一个标准差。公式(11) 用来平滑图像当中的噪声,并求取平滑后的图像梯度场模的平方,再按照 公式(11) 的描述求解函数 ggg。但当前计算点位于图像边界时,此时梯度值较大, ggg 值小,于是函数 ggg 通常在对象边界处取较小的值。此外 dpdpdp 函数被定义为
dp(s)≜p′(s)s(12)d_{p}(s) \triangleq \frac{p^{\prime}(s)}{s} \tag{12} dp​(s)≜sp′(s)​(12)其中函数 ppp 为势能函数,依据文献采用double-well即双井式势能函数 p=p2p=p_2p=p2​ 来设计,p2p_2p2​ 表达式为
p2(s)={1(2π)2(1−cos⁡(2πs)),if s≤112(s−1)2,if s≥1(13)p_{2}(s)=\left\{\begin{array}{ll} \frac{1}{(2 \pi)^{2}}(1-\cos (2 \pi s)), & \text { if } s \leq 1 \\ \frac{1}{2}(s-1)^{2}, & \text { if } s \geq 1 \end{array}\right. \tag{13} p2​(s)={(2π)21​(1−cos(2πs)),21​(s−1)2,​ if s≤1 if s≥1​(13)和一阶微分的表达式
p2′(s)={12πsin⁡(2πs),if s≤1s−1,if s≥1(14)p_{2}^{\prime}(s)=\left\{\begin{array}{ll} \frac{1}{2 \pi} \sin (2 \pi s), & \text { if } s \leq 1 \\ s-1, & \text { if } s \geq 1 \end{array}\right. \tag{14} p2′​(s)={2π1​sin(2πs),s−1,​ if s≤1 if s≥1​(14)对于 δ(ϕ)\delta(\phi)δ(ϕ) 和 HHH 分别为狄拉克函数和Heaviside函数,他们由两个函数 δε\delta_{\varepsilon}δε​ 和 HεH_{\varepsilon}Hε​ 光滑近似,如
δε(x)={12ε[1+cos⁡(πxε)],∣x∣≤ε0,∣x∣>ε(15)\delta_{\varepsilon}(x)=\left\{\begin{array}{ll} \frac{1}{2 \varepsilon}\left[1+\cos \left(\frac{\pi x}{\varepsilon}\right)\right], & |x| \leq \varepsilon \\ 0, & |x|>\varepsilon \end{array}\right. \tag{15} δε​(x)={2ε1​[1+cos(επx​)],0,​∣x∣≤ε∣x∣>ε​(15)和
Hε(x)={12(1+xε+1πsin⁡(πxε)),∣x∣≤ε1,x>ε0,x<−ε(16)H_{\varepsilon}(x)=\left\{\begin{array}{ll} \frac{1}{2}\left(1+\frac{x}{\varepsilon}+\frac{1}{\pi} \sin \left(\frac{\pi x}{\varepsilon}\right)\right), & |x| \leq \varepsilon \\ 1, & x>\varepsilon \\ 0, & x<-\varepsilon \end{array}\right. \tag{16} Hε​(x)=⎩⎨⎧​21​(1+εx​+π1​sin(επx​)),1,0,​∣x∣≤εx>εx<−ε​(16)注意到 δε\delta_{\varepsilon}δε​ 为 HεH_{\varepsilon}Hε​ 的导数。参数 ε\varepsilonε 通常设置为1.5。

[图像处理]水平集(Level set)算法实现思路(简化)相关推荐

  1. 水平集(level set)算法原理介绍

    本篇文章,解释的是水平集算法最基础的原理. 1 水平集方法的解释  有一个表面S,它与一个平面P相交,得到一个曲线C,这个C就是我们通过水平集得到的轮廓.  在图像分割中,表面S是随着由图像派生得到的 ...

  2. 水平集(Level Set)的基本方法

    水平集(Level Set)的基本方法 水平集(Level Set)的基本方法-曲线演化的直观解释 映射C(p), p\in [a,b] : R→R^2定义了一个平面的曲线,p是参数,对属于区间[a, ...

  3. LevalSet水平集分割算法 matlab程序源码

    首先,我见了一个图像处理讨论群,感兴趣的同学们可以加一下,图像处理讨论社:397489395 基于水平集的图像分割算法算是一种进化的snake算法,是一种隐式函数的方法,目前代码以及原理还处于深究阶段 ...

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

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

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

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

  6. 图形学笔记(九)几何 ——几何表示方法(CSG、距离函数、水平集 、点云、网格(obj格式))、贝塞尔曲线(面)

    图形学笔记(八)着色2 -- 纹理映射.重心坐标.双线性插值.Mipmap.三线性插值.各向异性过滤.纹理的应用(环境贴图.法线贴图等) 图形学笔记(十)几何2 -- 曲面细分(Loop细分.Catm ...

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

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

  8. 『分享』水平集算法简介(Level Set)

    注:原文网页广告太多,决定转帖到这里,待更新! [原链接]http://www.caogenit.com/caogenxueyuan/yingyongfangxiang/rengongzhineng/ ...

  9. level set 介绍4(水平集应用)

    3水平集技术的应用 明白了原理,就可以来考虑水平集的应用了,有了基本原理的理解也才能很好的应用.总体来说,水平集主要应用于图像的分割中,当然也可以应用于图像的其他方面,如文献[3]就提到了水平集在图像 ...

最新文章

  1. order by总结
  2. 框架:DAO,Service,Controller,View层之间的逻辑关系
  3. java web如何配置ask_Javaweb新手之路之JavaWeb开发环境配置篇
  4. CodeIgniter配置之config
  5. C#算法设计查找篇之05-二叉树查找
  6. 详解 Qt 串口通信程序全程图文 (4)
  7. 为什么 Flink 无法实时写入 MySQL?
  8. Advanced Graphics and Animations for iOS Apps
  9. linux python-3.10.4 安装
  10. 第一章 时空、运动
  11. SpringCloud分布式架构演进
  12. Unity资源加载简析(一)Resources
  13. 浩辰3D制图软件中用零件族实现多配置!
  14. 10 竞争神经网络与SOM神经网络matlab参考程序
  15. 计算机itunes无法安装,Win7 iTunes安装出错怎么办?电脑上无法安装iTunes怎么解决?...
  16. python实现从豌豆荚批量下载样本
  17. vue3中的setup函数
  18. 毕业论文 | 基于STM32的双轮平衡小车设计(基于Keil5的完整注释版代码工程,原器件清单)
  19. js 日期对象深拷贝
  20. 每日分享:Word如何翻译成中文

热门文章

  1. MySQL 使用sum求和
  2. 【华为机试真题 Python实现】树形目录操作【2022 Q1 Q2 |200分】
  3. Windows登录虚拟机Ubuntu系统登录不成功解决办法(ssh: connect to host 192.168.220.128 port 22: Connection refused)
  4. 代理模式(三):远程代理,虚拟代理,缓冲代理
  5. 流程控制——分支语句
  6. CMMI组织机构的建立
  7. 开学季实惠好用电容笔有哪些?推荐平价好用的电容笔
  8. CCF:201609-2 火车购票
  9. Python爬虫:Q房网房源信息
  10. katalon Listeners