水平集(CV模型)

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

其实就是构造了能量泛函,使其最小,轮廓内的灰度方差和轮廓外的灰度方差之和,在轮廓上时,是最小的,其次,加入轮廓周长项,使其轮廓收敛为最小。

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

       其中μ ,λ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)是符号距离函数)。于是:

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

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

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

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

 

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

  • 13
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
基于水平模型的眼底图像视杯分割方法是一种常用的眼底图像分割方法,其主要思想是通过水平集函数对图像进行分割,将视杯区域和其他区域分离出来。该方法的具体步骤如下: 1. 对眼底图像进行预处理,如去噪、增强等操作,得到一张准备好的图像。 2. 初始化水平集函数,将其设为一个初始的曲面,该曲面应该包含视杯区域。 3. 根据水平集函数的演化方程,不断迭代更新水平集函数,使其逐渐收敛到视杯边缘。 4. 根据最终的水平集函数,将图像分割成视杯区域和其他区域。 下面是基于水平模型的眼底图像视杯分割方法的具体实现: 1. 预处理眼底图像,如去噪、增强等操作。 2. 初始化水平集函数,将其设为一个圆形曲面,该曲面应该包含视杯区域。 3. 定义水平集函数的演化方程,如下所示: ``` phi_t = -(u - v) * |grad(phi)| + lambda * div(|grad(phi)| * grad(phi)) - mu * (u - v) ``` 其中,`phi_t`表示水平集函数的时间导数,`u`和`v`分别表示视杯区域和其他区域的平均灰度值,`grad(phi)`表示水平集函数的梯度,`div`表示散度,`lambda`和`mu`分别为参数,用于控制曲面的平滑度和速度。 4. 根据演化方程,不断迭代更新水平集函数,直到其收敛到视杯边缘。迭代过程中,可以使用数值方法(如有限差分法)来计算梯度和散度。 5. 根据最终的水平集函数,将图像分割成视杯区域和其他区域。可以使用阈值法、区域生长法等方法来进行分割。 下面是Python实现基于水平模型的眼底图像视杯分割方法的代码示例: ```python import cv2 import numpy as np # 读取眼底图像 img = cv2.imread('fundus.jpg', cv2.IMREAD_GRAYSCALE) # 预处理眼底图像 img = cv2.GaussianBlur(img, (5, 5), 0) # 初始化水平集函数 rows, cols = img.shape x, y = np.meshgrid(np.arange(cols), np.arange(rows)) phi = np.sqrt((x - cols // 2) ** 2 + (y - rows // 2) ** 2) - 50 # 定义水平集函数的演化方程 def evolution_equation(phi, img, lambda_, mu): grad_x = cv2.Sobel(phi, cv2.CV_64F, 1, 0, ksize=3) grad_y = cv2.Sobel(phi, cv2.CV_64F, 0, 1, ksize=3) grad = np.sqrt(grad_x ** 2 + grad_y ** 2) norm_grad = np.divide(grad, np.finfo(float).eps + np.sqrt(grad_x ** 2 + grad_y ** 2)) div = cv2.divergence(np.multiply(norm_grad, grad_x), np.multiply(norm_grad, grad_y)) u = np.mean(img[phi > 0]) v = np.mean(img[phi < 0]) phi_t = np.multiply(-np.multiply(u - v, grad), norm_grad) + lambda_ * div - mu * (u - v) return phi + phi_t # 演化水平集函数,直到其收敛 for i in range(200): phi = evolution_equation(phi, img, 1, 1) # 根据水平集函数进行分割 binary_img = phi > 0 # 显示分割结果 cv2.imshow('segmentation result', binary_img.astype('uint8') * 255) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上就是基于水平模型的眼底图像视杯分割方法的具体实现步骤和Python代码示例。需要注意的是,该方法对于眼底图像质量较好、视杯边缘清晰的情况效果较好,对于视杯边缘模糊、图像质量较差的情况可能效果不佳。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值