水平集方法框架
水平集方法是现代图像处理中很重要的一个方法,为了说清楚这个东西,我们先介绍几个基本的概念。
零水平集
对于一个函数
ϕ
(
x
⃗
)
:
R
n
→
R
\phi(\vec x):{\mathbf{R}^n}\rightarrow \mathbf{R}
ϕ(x):Rn→R(其中
x
⃗
∈
R
n
\vec x \in {\mathbf{R}^n}
x∈Rn ,下同),取其值域为零部分对应的定义域:
Γ
=
{
x
⃗
∣
ϕ
(
x
⃗
)
=
0
}
\Gamma = \{ \vec x|\phi (\vec x) = 0\}
Γ={x∣ϕ(x)=0}
这里,
Γ
∈
R
n
−
1
\Gamma \in {\mathbf{R}^{n-1}}
Γ∈Rn−1 称为函数
ϕ
\phi
ϕ 的零水平集,反之,
ϕ
\phi
ϕ 称为
Γ
\Gamma
Γ 的一个水平集函数。
通俗地说,函数的水平集是这个函数在某个高度上所有点的一个集合。函数的零水平集有一些良好的性质,在如下图所示的曲面演化问题中,
n
⃗
\vec n
n 为外法线向量,
Γ
\Gamma
Γ 为演化曲线。我们不妨假设有函数
ϕ
(
x
⃗
)
\phi(\vec x)
ϕ(x),它的零水平集为
Γ
\Gamma
Γ ,并且满足,
{
ϕ
>
0
x
⃗
∈
Γ
i
n
ϕ
<
0
x
⃗
∈
Γ
o
u
t
\left\{ \begin{aligned} &\phi > 0&&\vec x \in {\Gamma_{in}}\\ &\phi < 0&&\vec x \in {\Gamma_{out}}\\ \end{aligned} \right.
{ϕ>0ϕ<0x∈Γinx∈Γout
这里,
Γ
i
n
\Gamma_{in}
Γin 表示
Γ
\Gamma
Γ 内部,
Γ
o
u
t
\Gamma_{out}
Γout 表示
Γ
\Gamma
Γ 外部。那么,对于任意的
x
⃗
∈
Γ
\vec x \in \Gamma
x∈Γ ,
ϕ
\phi
ϕ 有如下两个性质:
-
∇ ϕ ∣ ∇ ϕ ∣ = − n ⃗ \frac{{\nabla \phi }}{{|\nabla \phi |}} = - \vec n ∣∇ϕ∣∇ϕ=−n
证明:
如图所示,设 s ⃗ \vec s s 为零水平集 Γ \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 -
d i v ( ∇ ϕ ∣ ∇ ϕ ∣ ) = − κ {\rm{div}}(\frac{{\nabla \phi }}{{|\nabla \phi |}}) = -\kappa div(∣∇ϕ∣∇ϕ)=−κ
证明:
ϕ s \phi_s ϕs 在 Γ \Gamma Γ 沿切线方向上恒为零,故有: ϕ s s = 0 \phi_{ss}=0 ϕss=0 ,由链式法则,可知:
ϕ s s ( x ⃗ ) = ∂ ∂ s ( ∇ ϕ ⋅ x ⃗ s ) = ∂ ∂ s ∇ ϕ ⋅ x ⃗ s + ∇ ϕ ⋅ x ⃗ s s {\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 ⃗ s s = − κ n ⃗ \vec x_{ss}=-\kappa \vec n xss=−κ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) ,使得在每一个时刻 t t t ,它的零水平集 Γ ( t ) \Gamma(t) Γ(t) 恰好是曲线在不同的时刻的状态。
如上图所示,曲线上任意一点从当前时刻到下一个时刻,始终保持
ϕ
(
x
⃗
(
t
)
,
t
)
=
0
\phi(\vec x(t),t)=0
ϕ(x(t),t)=0 ,故对一个特定的时刻
t
t
t ,对任意
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
如图所示,我们将
t
t
t 时刻,
Γ
\Gamma
Γ 曲线上的点的速度
v
⃗
\vec v
v 分解为沿外法线方向的速度
v
⃗
n
\vec v_n
vn 和切线方向速度
v
⃗
s
\vec v_s
vs ,用
v
n
v_n
vn 表示
v
⃗
n
\vec v_n
vn 的大小,负值表示方向为内法线方向。容易知道,
x
⃗
t
=
v
⃗
\vec x_t = \vec v
xt=v ,再由之前的式子 ,那么上式可变为:
ϕ
t
(
x
⃗
,
t
)
−
v
n
∣
∇
ϕ
(
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
)
−
v
n
∣
∇
ϕ
(
x
⃗
,
t
)
∣
=
0
x
⃗
∈
Γ
(
t
)
,
t
>
0
Γ
(
0
)
=
{
x
⃗
∣
ϕ
(
x
⃗
,
0
)
=
0
}
\left\{ \begin{aligned} &{\phi _t}(\vec x,t) - {v_n}|\nabla \phi (\vec x,t)| = 0&\vec x \in \Gamma(t),t>0\\ &\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
⃗
∈
Γ
i
n
−
min
y
⃗
∈
Γ
∣
x
⃗
−
y
⃗
∣
x
⃗
∉
Γ
i
n
d(\Gamma,\vec x)= \left\{ \begin{aligned} \mathop {\min }\limits_{\vec y \in \Gamma } |\vec x - \vec y| & & &\vec x \in \Gamma_{in}\\ -\mathop {\min }\limits_{\vec y \in \Gamma } |\vec x - \vec y|& & &\vec x \notin \Gamma_{in}\\ \end{aligned} \right.
d(Γ,x)=⎩⎪⎨⎪⎧y∈Γmin∣x−y∣−y∈Γmin∣x−y∣x∈Γinx∈/Γin
Γ
i
n
\Gamma_{in}
Γin 指
Γ
\Gamma
Γ 内部,二维情况下,
x
⃗
∈
R
2
,
y
⃗
∈
R
2
\vec x \in \mathbf{R}^2 \text{,} \vec y\in \mathbf{R}^2
x∈R2,y∈R2 ,那么称
d
d
d 为一个符号距离函数,下面把符号距离函数也简称为 SDF 。
符号距离函数有很多良好的性质,包括在边界上的几乎处处可微,关于凸区域的凸性,以及不同符号距离函数之间和差运算的一些性质,作为重点,列以下两条关于单位法向量和平均曲率的性质:
-
对于任意的 x ⃗ ∈ Γ \vec x \in \Gamma x∈Γ ∣ ∇ d ∣ = 1 |\nabla d| = 1 ∣∇d∣=1 这也是符号距离函数的一个判断条件,它是充要的。这里的充分性怎么理解?指的是对任意水平集曲线上的点都要满足。
-
对于任意的 x ⃗ ∈ Γ \vec x \in \Gamma x∈Γ ,由水平集函数的性质可得:
∇ d = − n ⃗ ⋅ ∣ ∇ d ∣ = − n ⃗ Δ d = − κ ∣ ∇ d ∣ = − κ \begin{aligned} &\nabla d = - \vec n \cdot |\nabla d|=-\vec n &\\ &\Delta d = - \kappa |\nabla d| = - \kappa & \end{aligned} ∇d=−n⋅∣∇d∣=−nΔd=−κ∣∇d∣=−κ
以上便是水平集方法的一些相关的基础知识。