基于Mumford-Shah模型与水平集方法的图像分割系统
项目简介
本项目是一个基于MATLAB开发的图像分割系统,完整实现了基于Mumford-Shah能量泛函的Chan-Vese (C-V) 模型。项目采用水平集 (Level Set) 方法作为几何形状表示和演化的核心框架,能够有效地解决传统Snake模型无法处理曲线拓扑变化(如分裂、合并)的问题。
该系统通过求解欧拉-拉格朗日偏微分方程 (PDE),利用有限差分法实现分割曲线的动态演化。算法不仅利用了图像的梯度信息,还引入了区域统计信息(平均灰度),因此对于边缘模糊、对比度低或含有噪声的图像(如医学图像、合成噪声图像)具有极强的鲁棒性。
主要功能特性
- 基于区域的分割模型:实现了Chan-Vese模型,利用图像全局或局部的统计信息(区域平均灰度)来驱动曲线演化,不单纯依赖图像梯度。
- 水平集演化框架:采用水平集函数 $phi$ 的零水平集隐含地表示演化曲线,能够自动处理复杂的拓扑结构变化,无需人工干预。
- 鲁棒的数值求解:使用有限差分法对偏微分方程进行离散化求解,包含Neumann边界处理和曲率计算。
- 自适应初始化与数据源:
* 支持读取外部图像(默认尝试读取
cameraman.tif)。
*
内置合成数据生成:若未找到外部图像,系统会自动生成包含圆形、矩形和环形几何结构且带有强噪声的合成图像用于测试。
- 实时可视化监控:提供 2x2 的多视图实时显示窗口,包含原始图像、动态轮廓演化叠加图、二值化分割掩模以及能量函数收敛曲线。
- 能量最小化监控:实时计算并记录Mumford-Shah能量泛函(长度项 + 数据拟合项)的变化,直观展示算法收敛过程。
系统要求与使用方法
- 环境要求:MATLAB R2016a 及以上版本(主要用于图像处理工具箱的基本函数,如
imread, rgb2gray, imshow 等)。 - 使用方法:直接运行主脚本函数
main 即可启动程序。程序将自动完成图像读取/生成、初始化、迭代演化及结果展示的全过程。
核心算法与实现逻辑详解
该项目的核心代码严格遵循变分水平集方法的实现流程,具体逻辑如下:
1. 模型参数与初始化
- 参数配置:定义了长度项权重 $mu$(控制曲线光滑度)、面积项 $nu$(通常设为0)、以及内外数据拟合权重 $lambda_1, lambda_2$。
- 水平集初始化:
* 将水平集函数 $phi$ 初始化为图像中心的一个圆形区域。
* 采用符号距离函数(SDF)的近似形式,定义
$phi < 0$ 为目标区域(内部),$phi > 0$ 为背景区域(外部)。
* 初始掩模是一个位于图像中心的圆形。
2. 演化主循环 (PDE求解)
在每次迭代中,算法执行以下严格步骤:
- 边界处理 (Neumann Boundary Condition):
* 在计算差分前,首先对 $phi$ 矩阵进行镜像填充(Padding)。这一步确保了图像边缘处的梯度和曲率计算不会越界,且满足Neumann边界条件(边界法向导数为0)。
* 使用
atan 函数构建光滑的
Heaviside函数 ($H$) 和
Dirac函数 ($delta$) 的近似。
* $H(phi)$ 用于区分前景和背景区域的权重计算;$delta(phi)$ 用于将演化力限制在零水平集附近。
* 根据当前的 $H(phi)$,动态计算曲线内部的平均灰度 $c_1$ 和曲线外部的平均灰度 $c_2$。
* 代码逻辑中
term_in = 1 - H_phi 对应内部权重,
term_out = H_phi 对应外部权重。
* 利用中心差分法(Central Difference)计算一阶偏导 ($D_x, D_y$) 和二阶偏导 ($D_{xx}, D_{yy}, D_{xy}$)。
* 计算平均曲率项 $kappa = text{div}(frac{nabla phi}{|nabla phi|})$,该项主要起平滑边界的作用。
* 计算图像灰度与当前区域均值 $c_1, c_2$ 的均方差:$-lambda_1(I - c_1)^2 + lambda_2(I - c_2)^2$。
* 该项决定了曲线扩张还是收缩,以最小化拟合误差。
* 根据欧拉-拉格朗日方程进行显式时间步进更新:
$phi_{new} = phi_{old} + Delta t cdot delta(phi) cdot [mu cdot kappa - nu + text{DataTerm}]$
3. 能量计算
- 系统在每次迭代后计算当前的总能量 $E$,用于判断收敛性。
- 能量构成:
*
长度能量:$mu int |nabla H(phi)|$,近似为边缘长度。
*
拟合能量:内部像素与 $c_1$ 的方差 + 外部像素与 $c_2$ 的方差。
关键模块分析
主处理逻辑
负责整个算法的生命周期管理,从参数设定、图像预处理(转灰度)、初始化 $phi$ 矩阵,到执行有限差分迭代循环。它整合了数学计算与可视化调用,是程序的核心控制器。
边界填充模块 (Padding)
为了解决有限差分在矩阵边缘无法计算的问题,该模块会创建一个比原图尺寸大一圈的矩阵,并将原图边缘的像素镜像复制到扩充区域。这是数值求解偏微分方程时的标准操作。
可视化模块
提供了一个 2x2 的综合绘图面板:
- 左上:显示原始输入图像。
- 右上:在原图上叠加当前的零水平集轮廓(红色曲线),展示分割的动态过程。
- 左下:显示二值化分割掩模(也就是 $phi < 0$ 的区域),直观展示最终提取的目标形状。同时显示实时的 $c_1$ 和 $c_2$ 值。
- 右下:绘制能量随迭代次数下降的曲线,用于验证算法是否收敛(能量应呈单调递减或趋于稳定状态)。
合成图像生成器 (Synthetic Image Generator)
这是一个容错机制。当系统无法读取默认图片时,该模块会程序化地生成一张 256x256 的图像,包含圆形、矩形和一个具有拓扑孔洞的环形。图像会被添加高斯噪声,用于验证算法在噪声环境和多目标、复杂拓扑情况下的分割能力。