基于活动轮廓模型的图像分割系统
项目介绍
本项目是一个在 MATLAB 环境下开发的图像分割程序,核心采用了基于能量最小化原理的活动轮廓模型(Active Contour Model)。程序具体实现了经典的无边缘活动轮廓模型(Chan-Vese Model),通过变分水平集方法,将图像分割问题转化为求解泛函极值的问题。该算法不依赖图像梯度,因此对于边缘模糊、对比度低或噪声严重的图像具有极佳的分割鲁棒性,能够精确提取复杂背景下的目标边界。
功能特性
- 交互式初始分割:支持用户通过鼠标在原始图像上点选定义初始多边形区域,灵活指定目标的大致位置。
- 区域统计自适应:基于 C-V 模型,利用目标内部与背景区域的平均灰度值驱动曲线演化,而非单纯依赖边缘信息。
- 实时演化可视化:程序在迭代过程中动态展示轮廓曲线的变形过程,并同步绘制能量泛函的收敛曲线。
- 鲁棒的水平集维持:内置水平集重新初始化算法,确保演化过程中水平集函数始终保持带符号距离函数的特性,防止曲线产生数值畸变。
- 多维度结果展示:最终输出包括原图边界提取图、二值掩膜图以及透明度叠加的区域分割效果图。
系统要求
- 软件环境:MATLAB R2016b 或更高版本。
- 工具箱需求:Image Processing Toolbox(图像处理工具箱)。
- 硬件建议:支持图形显示的计算机,内存 4GB 以上。
实现逻辑与算法流程
项目核心逻辑遵循变分水平集演化框架,具体步骤如下:
- 图像预处理与归一化
程序首先引导用户选择本地图像文件,将其转换为灰度图像,并进行双精度浮点数转换。通过归一化操作将像素值映射至 [0, 1] 区间,以保证算法在处理不同动态范围图像时的参数一致性。
- 水平集函数初始化
通过交互式获取的用户自定义掩膜,程序利用二进制距离变换(bwdist)构建初始的带符号距离函数(SDF)phi。轮廓内部定义为负值,外部定义为正值,零电平集即代表初始分割边界。
- 能量泛函迭代求解
在设定的最大迭代次数内,程序循环执行以下计算:
- 正则化函数计算:使用平滑算子计算海维赛德(Heaviside)函数和狄拉克(Dirac)δ函数,用于平滑地处理边界。
- 区域特征提取:实时计算当前轮廓内部区域和外部区域的平均灰度值 c1 和 c2。
- 曲率计算:通过水平集函数的一阶和二阶梯度,计算当前曲线的平均曲率,作为内部能量项来控制边界的平滑度。
- 演化驱动力计算:结合区域均值与 lambda 参数构建数据拟合项,形成驱动曲线向目标边缘运动的外部力量。
- 水平集更新:利用显式欧拉法,结合时间步长更新水平集函数 phi。
- 距离正则化(重新初始化)
为防止水平集函数在演化过程中变得过陡或过平缓,程序每隔 2 次迭代调用一次 Sussman 重新初始化子函数,通过求解偏微分方程强制 phi 的梯度模长保持为 1。
- 结果生成
迭代完成后,程序通过提取 phi <= 0 的区域生成最终的二值掩膜,并利用该掩膜在原图上绘制黄色的边界曲线,最后生成带透明度的绿色覆盖层以直观展示分割区域。
关键函数与细节分析
- 核心模型(C-V Model):
程序实现的能量泛函由长度项(mu)、面积项(nu)和数据拟合项(lambda1, lambda2)组成。其中 mu 越大,生成的边界越平滑;lambda 项则决定了模型对区域内、外灰度差异的敏感程度。
- 狄拉克函数(delta):
采用了 epsilon 参数平滑后的连续近似函数。它决定了只有在零电平集附近的点才会感受并响应演化力,保证了算法的局部特性和数值稳定性。
- 曲率算子:
利用发散(Divergence)公式计算归一化梯度的散度。这是控制活动轮廓“刚性”的关键,能有效抵抗细小噪声对边界提取的影响。
- 重新初始化算法:
sussman_reinit 函数通过符号函数近似和梯度修正,在不改变零电平集位置的前提下,修正 phi 函数的数值性质,这是水平集方法长期稳定演化的必要保障。
- 实时监控:
演化过程中通过 subplot 实时对比分割状态与能量下降情况,用户可以直观判断算法是否收敛,并通过能量曲线确认 mu 和 lambda 等参数设置的合理性。