基于CV模型的多相水平集图像分割系统 README
项目简介
本项目实现了一个基于Chan-Vese(CV)模型的多相变分水平集图像分割系统。传统的CV模型通常用于二相分割(前景与背景),而本系统通过引入两个水平集函数($phi_1, phi_2$),构建了一个能够处理四相(4个不同区域)的分割框架。系统基于简化的Mumford-Shah泛函,假设图像由多个分段常数区域组成,通过最小化能量泛函(包含数据拟合项和长度正则化项)来演化曲线,从而在无需图像梯度信息的情况下,有效地分割出具有不同灰度级别的目标区域。
该算法对高斯噪声具有显著的鲁棒性,并且能够自动处理拓扑结构的变化(如轮廓的分裂与合并)。代码使用MATLAB编写,包含完整的合成数据生成、核心算法求解及多视图实时可视化功能。
功能特性
- 多相分割能力:利用2个水平集函数将图像域划分为 $N=2^2=4$ 个子区域,能够同时识别背景及多个不同灰度的目标物体。
- 抗噪鲁棒性:基于区域的全局统计信息(平均灰度)而非局部梯度信息驱动曲线演化,对含噪图像表现优异。
- 变分法求解:实现了Euler-Lagrange方程的数值求解,包括正则化的Heaviside和Dirac Delta函数计算。
- 自适应拓扑变化:无需重新参数化即可自然处理曲线的合并与分裂。
- 全流程可视化:提供包含原始图像、实时轮廓演化、能量收敛曲线、重构的分段常数图像、四相分类掩膜(Mask)及三维水平集曲面的多窗口实时显示。
- 合成数据演示:内置合成图像生成逻辑,包含不同灰度级的几何图形(矩形、圆形)及高斯噪声,便于直接测试算法性能。
系统要求
- 环境:MATLAB R2016a 及以上版本
- 工具箱:Standard MATLAB Functions(无需特殊工具箱,核心计算均为基础矩阵操作)
快速开始
- 启动:在MATLAB环境中直接运行主程序脚本。
- 流程:
* 程序首先生成一张包含4个不同灰度区域(背景、两个矩形、一个圆形)的合成图像,并添加高斯噪声。
* 初始化两个水平集函数为特定的几何形状。
* 进入迭代循环,实时显示分割演化过程。
- 结果:迭代完成后,控制台输出“分割完成”,窗口最终展示分割结果及能量收敛情况。
- 自定义图像:若需处理真实图像,只需修改代码第一部分的图像读取逻辑(
imread),并将图像转换为灰度及 double 类型即可。
算法实现与代码逻辑详解
本项目的核心逻辑严格对应代码实现,主要步骤分析如下:
1. 图像生成与预处理
代码首先构建了一个 $200 times 200$ 的仿真场景,预设了四个灰度层级(20, 80, 140, 200),分别代表背景、左上矩形、右下矩形和中心圆形。随后叠加高斯白噪声以模拟真实环境下的复杂性。图像数据被转换为双精度(
double)以确保数值计算的精度。
2. 水平集函数初始化
系统初始化了两个水平集函数 $phi_1$ 和 $phi_2$。
- $phi_1$ 被初始化为一个覆盖左上区域的锥形/符号距离函数。
- $phi_2$ 被初始化为一个覆盖右下区域的函数。
这两个函数的零水平集(Zero Level Set)构成了初始的演化轮廓。
3. 多相水平集演化核心(主循环)
在400次迭代循环中,算法执行以下关键步骤:
- 计算正则化函数:使用反正切(
atan)函数构造光滑的 Heaviside 函数 ($H$) 和 Dirac Delta 函数 ($delta$),参数 epsilon 控制平滑程度,防止数值计算中的奇异性。 - 计算区域平均灰度:
利用两个 Heaviside 函数 $H_1, H_2$ 的组合,将图像域划分为四个互不重叠的区域:
* 区域11 ($H_1H_2$): $phi_1 > 0, phi_2 > 0$
* 区域10 ($H_1(1-H_2)$): $phi_1 > 0, phi_2 < 0$
* 区域01 ($(1-H_1)H_2$): $phi_1 < 0, phi_2 > 0$
* 区域00 ($(1-H_1)(1-H_2)$): $phi_1 < 0, phi_2 < 0$
代码分别计算这四个区域内的图像平均灰度值($c_{11}, c_{10}, c_{01}, c_{00}$)。
计算原始图像与各区域平均灰度之间的平方误差,这些误差项驱动轮廓向目标边缘移动。
代码显式实现了多相CV模型的梯度下降流。
*
$phi_1$ 的更新:受自身曲率项(平滑项)和数据拟合力驱动。数据拟合力由 $phi_2$ 的状态加权决定(即考虑区域11与01的差异,以及区域10与00的差异)。
*
$phi_2$ 的更新:同理,受自身曲率项和由 $phi_1$ 状态加权的数据拟合力驱动。
*
边界处理:每次迭代后调用
neumann_bc 函数,对水平集函数应用Neumann边界条件(边界法向导数为零),通过镜像填充防止演化过程中的边界数值震荡。
计算包含数据拟合误差和轮廓长度的全局能量。该能量值被记录并绘制,用于观察算法的收敛性(能量应随迭代单调递减)。
4. 辅助算法细节
采用中心差分法计算水平集函数的一阶和二阶偏导数($u_x, u_y, u_{xx}, u_{yy}, u_{xy}$),并利用公式 $K = text{div}(frac{nabla phi}{|nabla phi|})$ 计算平均曲率。分母中添加了微小量以避免除零错误。
每20次迭代刷新一次视图,展示6个子图:
1. 原始图像。
2. 叠加了 $phi_1$(红)和 $phi_2$(绿)零水平集轮廓的图像。
3. 能量下降曲线。
4. 基于当前分割结果重构的分段常数(Piecewise Constant)图像。
5. 四相分类的伪彩色掩膜,直观展示四个区域的划分。
6. $phi_1$ 函数的三维网格图,展示水平集曲面的演化形态。
总结
该项目完整展示了基于变分法的多相图像分割技术,通过严格的数学推导和数值实现,解决了复杂图像的多目标提取问题。代码逻辑清晰,将理论公式转化为具体的矩阵运算,适合用于理解水平集方法、图像分割算法以及偏微分方程在图像处理中的应用。