水平集详解与代码分析一

       前面我们从大体上描述了一下水平集方法的思想,实际上,各种水平集方法的区别只是在于如何构建能量函数E(C)。当构建好能量泛函E(C)之后,通过水平集的思想,将曲线C用水平集函数Φ代替,再通过求解能量泛函对应的Euler-Lagrange方程获得水平集的演化方程。

       这里,通过讲解Chan-Vese模型来理解水平集方法的具体步骤。C-V模型是基于区域的水平集方法,它对于要分割对象与背景的像素平均值具有明显不同的图像具有很好的效果。根据定义可得C-V模型的能量公式:

水平集详解与代码分析一_第1张图片

       其中μ ,λ1 和λ2 是取值为正的常数,一般令λ1 = λ2= 1。c1和c2分别是演化曲线C 内部和外部的图像灰度均值。能量泛函的第一项是长度约束,用于规整演化曲线C ,保证获得的是足够短的曲线;而第二项和第三项合称为保真项,负责将演化曲线C 吸引到目标轮廓上来。用水平集函数 φ ( x , y)来代替将演化曲线C,且设定如果点( x , y )在C 的内部,则水平集函数 φ ( x , y) > 0;如果点( x , y )在C 的外部时,则水平集函数 φ ( x , y) < 0;而如果点( x , y )恰好在C 上面时,则 φ ( x , y) = 0(这一步骤即是初始化水平集,一般令φ ( x , y)值为(x,y)与C的最小距离值,符号根据前面说的来取,即φ ( x , y)是符号距离函数)。于是:

水平集详解与代码分析一_第2张图片

        其中 H ε( z)和δε ( z)分别是海氏(Heaviside)函数 H ( z )和狄拉克(Dirac)函数 δ ( z)的正则化形式。 H ( z )和 δ ( z)的公式如下:

        通过对上述公式对应的Euler-Lagrange方程进行求解,可得到如下的演化方程:

        获得此演化方程后,我们就不难对其进行数值求解了。其中div(Δφ/|Δφ|)是水平集曲面的曲率,c1和c2在每次演化都需要重新求解。对CV模型的直观理解可以这样:①首先是初始化水平集;②根据初始化的水平集计算(估算)前景和背景灰度均值;③利用前面估算的前景和背景均值对水平集每一个点进行调整(演化),因为根据定义前景>0,背景<0,所以如果当前点的灰度值接近前景估值,那么该点水平集的值相应的就要增加,反之则减小。

       在实际运用中,只采用上述的演化公式在演化一段时间后会使水平集失去光滑性和距离函数的特性,具体表现为会出现一些小的孤岛。为了避免这个问题,需要在演化一定时间后对水平集函数重新初始化。但是由于重新初始化水平集函数为距离函数需要消耗很多时间,为了解决这个问题,李纯明提出了在水平集演化的过程中增加一个能量惩罚项,使得水平集函数在演化过程中保持近似的符号距离函数。该惩罚项表示为:

水平集详解与代码分析一_第3张图片

 

       对于该惩罚项的理解可以这样:控制水平集梯度▽Φ稳定在1附近,当梯度很大的时候,使得能量变大,于是就会驱使水平集趋于平滑,这样就使得水平集函数减少了出现孤岛的情况,自然的保持了近似的符号距离函数(但这不能完全避免水平集在演化过程中不偏离符号距离函数)。通过增加惩罚项的演化函数只是在前述的演化函数中增加一项而已。至此,一个不需要初始化水平集的CV模型已经分解完毕,下一节将代码贴上,谢谢大家的支持!如有问题,欢迎讨论!

你可能感兴趣的:(图像分割)