基于GraphCut的交互式图像分割工具包
本项目提供了一套基于MATLAB实现的交互式图像分割系统。其核心采用经典的图割(GraphCut)算法,将图像分割问题转化为图论中的最小割(Min-Cut)问题。通过用户少量的交互引导,程序能够自动计算出图像中目标物体的全局最优边界,适用于需要高精度提取前景目标的多种应用场景。
功能特性
- 交互式种子点标记:支持用户通过鼠标实时在图像上标注前景(左键红色种子)和背景(右键蓝色种子),作为算法的先验约束。
- 区域能量建模:基于颜色空间分布计算像素的归属概率,通过计算像素与种子点之间的欧氏距离,建立精确的区域项(Data Term)。
- 边缘平滑约束:利用像素间的梯度信息构建边界惩罚项(Smoothness Term),在保持边缘平滑的同时,确保分割线精准贴合图像的实际物理轮廓。
- 高效全局优化:直接调用MATLAB内置的高性能最大流算法,在多项式时间内求解能量函数的全局最小值,避免陷入局部最优解。
- 实时结果预览:自动生成二值化掩码、绿色边界覆盖图,并以直方图形式展示最小化后的能量数值。
- 数据自动化导出:处理完成后的分割掩码(Mask)和Alpha通道数据将自动保存至MATLAB基础工作区,便于后续处理。
运行环境与系统要求
- 软件环境:MATLAB R2015b 及以上版本(需支持
digraph 和 maxflow 函数)。 - 硬件要求:建议内存 8GB 或以上,以处理高分辨率图像。
- 依赖工具箱:Image Processing Toolbox(图像处理工具箱)。
实现逻辑与算法流程
程序严格遵循马尔可夫随机场(MRF)框架下的能量最小化路径,具体步骤如下:
- 参数初始化:设置平衡因子 Lambda(调节区域项与平滑项权重)、指数衰减系数 Sigma 以及邻域连接强度。
- 图像预处理:载入图像后进行归一化处理,将色彩数值映射至 [0, 1] 区间以便进行数值计算。
- 交互式采集:通过图形句柄实时捕获用户点击。左键坐标存入前景集合,右键坐标存入背景集合。用户点击回车键激活核心计算模块。
- 构建 T-links(终端连接桩):
* 计算区域能量(Data Term):利用
pdist2 函数计算每个像素到前景/背景种子点集的最小颜色距离。
* 建立极性:将像素节点分别连接到源点(Source)和汇点(Sink)。
* 强化约束:对于用户手动选中的种子点,赋予极大的权重值(1e6),强制其在分割结果中保持正确分类。
- 构建 N-links(邻域连接桩):
* 采用 8 邻域(或 4 方向对称)模型,对图像中相邻像素建立连接。
* 计算权重:根据像素间的 RGB 差异进行指数衰减计算。温差越小(颜色越接近),权重越大,表示越难发生割断。
- 图构建与最大流求解:
* 使用
digraph 构建有向图,整合所有的 T-links 和 N-links。
* 调用
maxflow 算法寻找从源点到汇点的最大流量,根据最大流最小割定理,该过程对应的割集即为能量函数的全局最优解。
- 掩码提取与后处理:
* 根据最小割将节点划分为两个集合,属于源点集合的像素标记为前景。
* 使用 Canny 算子提取掩码边界,并将其叠加到原图进行可视化展示。
核心函数段详细分析
- 区域项计算逻辑:
该模块通过计算像素在颜色空间中与样本点的相似度来分配代价。如果一个像素的颜色与用户标记的前景色非常接近,则它到源点的分割代价(Weight)会很低,而到汇点的代价会很高,从而促使算法将其划分给前景。
- 平滑项计算逻辑:
平滑项体现在相邻像素之间的边权上。其公式基于像素梯度:$exp(-Delta I^2 / 2sigma^2)$。这意味着在图像平坦区域,边权非常大,算法倾向于不切断该处;而在图像梯度较大(即边缘处),边权迅速减小,引导最小割线从真正的边缘处穿过。
- 硬约束处理:
为了保证交互的可靠性,程序对用户标注的种子点像素执行了“硬约束”处理。通过将种子点与对应终端节点的权重设为极大值(Large Value),确保在执行最小割时,这些路径绝对不会被切断,从而百分之百遵循用户的交互意图。
使用说明
- 启动主程序后,在弹出的对话框中选择待处理的图片。
- 在标注窗口中,使用鼠标左键在目标物体(前景)上点击或涂鸦,留下红色坐标点。
- 使用鼠标右键在背景区域点击,留下蓝色坐标点。
- 确认标注覆盖了主要特征后,按下键盘上的 Enter (回车) 键。
- 等待控制台计算完成,系统将弹出结果对比图,并在工作区生成
final_mask 变量。