图像分割的水平集方法–理论
在图像分割的传统方法中,基于偏微分方程的方法在众多方法中效果显著。但PDE方程的求解不易,因此有学者针对图像分割的 PDE 开发了水平集方法。本文主要从理论的角度理清水平集方法的来龙去脉,为实际方程中应用水平集方法提供理论支持。
曲线演化问题
对于封闭曲线序列 C(p,t),t≥0C(p, t), t\geq0C(p,t),t≥0,随时间按如下演化
∂C(p,t)∂t=V=α(p,t)T+β(p,t)N(1)\frac{\partial C(p,t)}{\partial t}=\textbf V=\alpha (p,t)\textbf T + \beta (p,t)\textbf N \quad (1)∂t∂C(p,t)=V=α(p,t)T+β(p,t)N(1)
α,β\alpha ,\betaα,β 分别是切向速率和法向速率。在局部位置,曲线 CCC 上的坐标可以使用函数表达,如下
y=γ(x,t)(2)y=\gamma (x,t) \quad (2)y=γ(x,t)(2)
即上式亦可表示曲线 CCC,γ\gammaγ 关于 ttt 的变化也可表示曲线 CCC 的变化。对于曲线 CCC 的某一点坐标 (x,γ(x))(x,\gamma (x))(x,γ(x)),切矢量为 Cx=(1,γx)C_x=(1,\gamma _x)Cx=(1,γx).
单位切矢量为 T=(1,γx)1+γx2\textbf T=\frac{(1, \gamma _x)}{\sqrt {1+\gamma _x ^2}}T=1+γx2(1,γx)
单位法矢量为 N=(−γx,1)1+γx2\textbf N=\frac{(-\gamma _x, 1)}{\sqrt {1+\gamma _x ^2}}N=1+γx2(−γx,1)
则曲线 CCC 演化时,横纵坐标 x,yx, yx,y的变化为
dydt=αT(y)+βN(y)=αγx1+γx2+β11+γx2\frac{dy}{dt}=\alpha \textbf T^{(y)}+\beta \textbf N^{(y)} \\
=\alpha \frac{\gamma _x}{\sqrt {1+\gamma _x ^2}}+\beta \frac{1}{\sqrt {1+\gamma _x ^2}}dtdy=αT(y)+βN(y)=α1+γx2γx+β1+γx21
dxdt=αT(x)+βN(x)=α11+γx2−βγx1+γx2\frac{dx}{dt}=\alpha \textbf T^{(x)}+\beta \textbf N^{(x)} \\
=\alpha \frac{1}{\sqrt {1+\gamma _x ^2}}-\beta \frac{\gamma _x}{\sqrt {1+\gamma _x ^2}}dtdx=αT(x)+βN(x)=α1+γx21−β1+γx2γx
然而,另一方面,
dydt=dydxdxdt+∂y∂t=γxdxdt+γt\frac{dy}{dt}=\frac{dy}{dx}\frac{dx}{dt}+\frac{\partial y}{\partial t}=\gamma _x\frac{dx}{dt}+\gamma _tdtdy=dxdydtdx+∂t∂y=γxdtdx+γt
联立上面三式,有
γt=dydt−γxdxdt=β1+γx2\gamma _t=\frac{dy}{dt}-\gamma _x\frac{dx}{dt}
=\beta \sqrt{1+\gamma _x^2}γt=dtdy−γxdtdx=β1+γx2
γ\gammaγ 关于 ttt 的变化也可表示曲线 CCC 的变化,从上式可以看出,曲线的变化只与法向分量 β\betaβ 有关。因此研究曲线的演化只需考虑法向。可以简单写为
∂C∂t=βN(3)\frac{\partial C}{\partial t}=\beta \textbf N \quad (3)∂t∂C=βN(3)
此即为曲线演化方程。但是 CCC 没有具体表达式, 这个方程不好求解。于是有学者开发了水平集方法。
水平集方法
水平集方法是将空间中的曲线使用二维函数表示,将曲线的变化直接使用函数表示,使得空间的曲线具象化,让我们便于采用数学工具对曲线进行干预和计算。
对于空间中的曲线 CCC,可隐式表达为
C={(x,y),u(x,y)=c}C=\{(x,y), u(x,y)=c\}C={(x,y),u(x,y)=c}
曲线 CCC 称为函数 u(x,y)u(x,y)u(x,y) 的水平集,函数 u(x,y)u(x,y)u(x,y)为曲线 CCC 的嵌入函数。则曲线 CCC 的某种变化可以归结为函数 u(x,y)u(x,y)u(x,y) 发生的变化。为了表现曲线的变化,加上时间线
C={(x,y,t),u(x,y,t)=c}C=\{(x,y,t), u(x,y,t)=c\}C={(x,y,t),u(x,y,t)=c}
函数 u(x,y)u(x,y)u(x,y) 关于时间的变化为
dudt=∂u∂t+∇u⋅∂(x,y)∂t=0\frac{du}{dt}=\frac{\partial u}{\partial t}+\nabla u \cdot \frac{\partial (x,y)}{\partial t}=0dtdu=∂t∂u+∇u⋅∂t∂(x,y)=0
注:趋于稳态时,函数uuu关于时间的变化率为0.
根据上面的曲线演化问题,有∂(x,y)∂t=∂C∂t=V\frac{\partial (x,y)}
{\partial t}=\frac{\partial C}{\partial t}=\textbf V∂t∂(x,y)=∂t∂C=V.于是
∂u∂t=−∇u⋅V=−∣∇u∣⋅∇u∣∇u∣⋅V=∣∇u∣⋅N⋅V=β∣∇u∣(4)\frac{\partial u}{\partial t}=-\nabla u\cdot \textbf V=-|\nabla u|\cdot \frac{\nabla u}{|\nabla u|}\cdot \textbf V=|\nabla u|\cdot \textbf N \cdot \textbf V=\beta |\nabla u|\quad \quad \quad \quad (4)∂t∂u=−∇u⋅V=−∣∇u∣⋅∣∇u∣∇u⋅V=∣∇u∣⋅N⋅V=β∣∇u∣(4).
此处 N=−∇u∣∇u∣\textbf N=-\frac{\nabla u}{|\nabla u|}N=−∣∇u∣∇u是按水平集内部取负,外部取正。
(4)(4)(4) 式即为水平集方法的曲线演化方程式。上述的推导过程与ccc值无关,因此我们一般取零水平集,即 c=0.c=0.c=0.
1. 函数 u(x,y)u(x,y)u(x,y)如何选取
一般选符号距离函数
u(x,y)={d[(x,y),C],(x,y)在C外部−d[(x,y),C],(x,y)在C内部 u(x,y)=\left\{
\begin{aligned}
d[(x,y),C], (x,y)在 C外部 \\
-d[(x,y),C], (x,y) 在C内部
\end{aligned}
\right.
u(x,y)={d[(x,y),C],(x,y)在C外部−d[(x,y),C],(x,y)在C内部
原因是符号距离函数有如下性质:∣∇u∣≡1|\nabla u|\equiv 1∣∇u∣≡1(这个性质的好处目前未知)
性质证明:∇u=(uξ,uη)=(0,uη)\nabla u=(u_\xi, u_{\eta})=(0, u_{\eta})∇u=(uξ,uη)=(0,uη),只有法向变化,因此∣△u∣=∣△d∣=∣△η∣|\triangle u|=|\triangle d|=|\triangle \eta|∣△u∣=∣△d∣=∣△η∣
∣∇u∣=∣uη∣=∣lim△η→0△u△η∣=1|\nabla u|=|u_\eta|=|lim_{\triangle \eta \rightarrow0} \frac{\triangle u}{\triangle \eta}|=1∣∇u∣=∣uη∣=∣lim△η→0△η△u∣=1
2. 演化问题
采用水平集演化曲线有一个问题,水平集演化方程与曲线演化方程中 β\betaβ 取值要求不一致。曲线演化方程中的 β\betaβ 的(x,y)(x,y)(x,y) 要在曲线上,而水平集掩护方程的 β\betaβ 的 (x,y)(x,y)(x,y) 点定义在整个平面 Ω\OmegaΩ上, 即 βu\beta _uβu是βC\beta _CβC的延拓。
直接将βu\beta _uβu用作βC\beta _CβC也可以,这种方法称为自然延拓,但是自然延拓无法保证演化过程中嵌入函数uuu始终保持为带符号的距离函数,使得演化可能向不期待的方向运行。
当嵌入函数偏离距离函数的性质后,某些局部可能由于∣∇u|\nabla u∣∇u 远大于1而出现尖峰或深谷,可能由于∣∇u|\nabla u∣∇u 远小于1而出现平坦,这会导致数值计算的迭代过程趋于不稳定。因此若干次迭代后需要重新初始化,把嵌入函数 uuu 拉回到距离函数性质上来。
这种重新初始化可以通过求解
∂u∂t=sgn(u(n))(1−∣∇u∣)\frac{\partial u}{\partial t} = sgn(u^{(n)})(1-|\nabla u|)∂t∂u=sgn(u(n))(1−∣∇u∣)
完成,此方程达到稳态后,解 uuu 显然满足距离函数的性质 ∣∇u∣=1|\nabla u|=1∣∇u∣=1。再将经过此迭代后的函数放入水平集演化中,可继续进行演化。缺点是具体迭代多少次后进行重新初始化,需要通过实验得到。
变分水平集方法
水平集方法先利用变分法最小化曲线 CCC 的能量泛函,得到关于 CCC 的运动方程后,再引入嵌入函数,得到关于 uuu 的PDE.
变分水平集方法是对水平集方法的改进,并不一定是比水平集方法好,适用地方不同。变分水平集方法使用的前提是问题来自于最小化曲线 CCC额能量泛函E(C)E(C)E(C)。不是这样来的就不适用变分水平集方法了。变分水平集方法通过引入嵌入函数 uuu,再利用 Heaviside 函数,将能量泛函 E(C)E(C)E(C) 改为 E(u)E(u)E(u) 通过变分法得到关于 uuu的 PDE 从而进行求解。
方法如下:
首先定义特殊函数 Heaviside 函数
H(z)={1,z≥00,z<0 H(z)=\left\{
\begin{aligned}
1, z\geq 0 \\
0, z< 0
\end{aligned}
\right.
H(z)={1,z≥00,z<0
则
E(u)=∮Cg(C)ds=∬Ωg(x,y)∣∇H(u)∣dxdyE(u) =\oint_Cg(C)ds=\iint_\Omega g(x,y)|\nabla H(u)|dxdyE(u)=∮Cg(C)ds=∬Ωg(x,y)∣∇H(u)∣dxdy
也就是要求在曲线上进行积分(∇H\nabla H∇H只有在曲线上有值,其他地方为0)
∇H(u)=δ(u)∇u,δ(z)=dH(z)dz\nabla H(u)=\delta (u)\nabla u, \delta(z)=\frac{dH(z)}{dz}∇H(u)=δ(u)∇u,δ(z)=dzdH(z), δ(z)\delta(z)δ(z)是Dirac函数。
于是 E(u)=∬Ωg(x,y)δ(u)∣∇u∣dxdyE(u)=\iint_\Omega g(x,y)\delta(u)|\nabla u|dxdyE(u)=∬Ωg(x,y)δ(u)∣∇u∣dxdy.
利用变分法,
E(u+ϵv)=∬Ωgδ(u+ϵv)∣∇(u+ϵv)∣dxdyEϵ′=∬Ωg⋅δ(u+ϵv)∇u+ϵ∇v∣∇u+ϵ∇v∣∇vdxdy=∬g⋅δ(u)⋅∇u⋅∇v∣∇u∣dxdy=∬div(g⋅δ(u)⋅∇u∣∇u∣⋅vdxdyE(u+\epsilon v)=\iint_\Omega g \delta(u+\epsilon v)|\nabla (u+\epsilon v)|dxdy\\
E_\epsilon ^{'}=\iint_\Omega g\cdot \delta(u+\epsilon v)\frac{\nabla u+\epsilon \nabla v}{|\nabla u+\epsilon \nabla v|}\nabla vdxdy\\
=\iint g\cdot \delta(u)\cdot\frac{\nabla u\cdot \nabla v}{|\nabla u|}dxdy\\
=\iint div(g\cdot \delta(u)\cdot \frac{\nabla u}{|\nabla u|}\cdot vdxdyE(u+ϵv)=∬Ωgδ(u+ϵv)∣∇(u+ϵv)∣dxdyEϵ′=∬Ωg⋅δ(u+ϵv)∣∇u+ϵ∇v∣∇u+ϵ∇v∇vdxdy=∬g⋅δ(u)⋅∣∇u∣∇u⋅∇vdxdy=∬div(g⋅δ(u)⋅∣∇u∣∇u⋅vdxdy
因此对应的梯度下降流为∂u∂t=δ(u)div(g∇u∣∇u∣)\frac{\partial u}{\partial t}=\delta(u)div(g\frac{\nabla u}{|\nabla u|})∂t∂u=δ(u)div(g∣∇u∣∇u).但是在实际计算中,δ(u)\delta(u)δ(u) 不好计算,一般用δϵ\delta_\epsilonδϵ作为近似。
δϵ(z)=ddzHϵ(z)\delta_\epsilon(z)=\frac{d}{dz}H_\epsilon(z)δϵ(z)=dzdHϵ(z)
这里HϵH_\epsilonHϵ是正则化的 Heaviside 函数,满足 Hϵ(z)→H(z),whenϵ→0H_\epsilon(z)\rightarrow H(z), when\quad\epsilon \rightarrow 0Hϵ(z)→H(z),whenϵ→0 即可。
感觉一般还是使用水平集方法多一些。
改进的变分水平集方法
在介绍水平集方法时,由于演化过程中可能会偏离距离函数,因此需要重新初始化。改进的变分水平及方法就是把重新初始化的部分作为整个能量泛函的一部分,在演化过程中同时优化,从而避免了重新初始化。
具体地,定义
P(u):=∬Ω12(∣∇u∣−1)2dxdyP(u):=\iint_\Omega \frac{1}{2}(|\nabla u|-1)^2dxdyP(u):=∬Ω21(∣∇u∣−1)2dxdy
利用变分法,
P(u+ϵv)=∬Ω12(∣∇(u+ϵv)∣−1)2dxdyPϵ=0′=∬Ω(∣∇(u+ϵv)∣−1)∇(u+ϵv)∣∇(u+ϵv)∣∇vdxdy=∬Ωdiv(∇u−∇u∣∇u∣)vdxdyP(u+\epsilon v)=\iint_\Omega \frac{1}{2}(|\nabla (u+\epsilon v)|-1)^2dxdy\\
P_{\epsilon=0}^{'}=\iint_\Omega (|\nabla (u+\epsilon v)|-1)\frac{\nabla (u+\epsilon v)}{|\nabla (u+\epsilon v)|}\nabla vdxdy\\
=\iint_\Omega div(\nabla u-\frac{\nabla u}{|\nabla u|})vdxdyP(u+ϵv)=∬Ω21(∣∇(u+ϵv)∣−1)2dxdyPϵ=0′=∬Ω(∣∇(u+ϵv)∣−1)∣∇(u+ϵv)∣∇(u+ϵv)∇vdxdy=∬Ωdiv(∇u−∣∇u∣∇u)vdxdy
因此对应的梯度下降流为∂u∂t=Δu−div(∇u∣∇u∣)\frac{\partial u}{\partial t}=\Delta u-div(\frac{\nabla u}{|\nabla u|})∂t∂u=Δu−div(∣∇u∣∇u).
将此项加入到演化方程中,得到改进的变分水平集方法
∂u∂t=μ[Δu−div(∇u∣∇u∣)]+δϵ(u)div(g∇u∣∇u∣)\frac{\partial u}{\partial t}=\mu [\Delta u-div(\frac{\nabla u}{|\nabla u|})]+\delta_\epsilon(u)div(g\frac{\nabla u}{|\nabla u|})∂t∂u=μ[Δu−div(∣∇u∣∇u)]+δϵ(u)div(g∣∇u∣∇u)
得到水平集演化方程(以上所有方法的统称)后,再利用数值计算的方法(如有限差分法,迎风格式等等)对方程进行离散计算,从而迭代计算得到最终分割结果,即水平集。
参考资料:《图像处理的偏微分方程方法》,王大凯,候榆青等,科学出版社。
3833

被折叠的 条评论
为什么被折叠?



