基于区域生长的MATLAB图像分割系统
项目简介
本项目是一个基于MATLAB开发的图像分割工具,核心采用区域生长(Region Growing)算法。系统能够从用户指定的初始种子点开始,根据像素间的相似性准则,自动将连通的同质区域合并,从而提取出感兴趣的目标(如医学影像中的病灶、特定的物体等)。该程序集成了图像预处理、交互式操作、核心分割算法、形态学后处理以及多维度结果可视化功能,是一个完整的计算机视觉演示与应用系统。
功能特性
- 灵活的图像输入机制:支持打开多种格式的图像文件(.jpg, .png, .bmp, .tif, .dcm);若用户取消选择,系统会自动生成带有噪声和圆形目标的合成图像用于演示算法效果。
- 图像预处理:自动处理多通道图像(RGB转灰度),并应用高斯低通滤波算法去除高频噪声,平滑图像以减少分割误差。
- 交互式种子点选取:提供图形化界面,用户可通过鼠标点击直接在原始图像上选取起始种子点,系统会自动捕获坐标并进行边界检查。
- 可配置参数:允许用户通过弹出对话框动态调整生长阈值,以适应不同对比度和信噪比的图像。
- 高效区域生长核心:采用预分配内存的队列数据结构实现8邻域搜索,具备实时均值更新机制,提高算法的适应性和运行效率。
- 形态学后处理:内置闭运算和空洞填充流程,有效修补分割区域内的细小孔洞并将边缘平滑化。
- 直观的结果可视化:
* 提供2x2的分屏显示(原图、预处理图、二值掩膜、最终叠加结果)。
* 使用绿色半透明蒙版高亮显示分割区域。
* 自动提取并绘制目标的黄色轮廓边界。
- 详细的统计输出:计算并显示耗时、分割出的像素总数等统计信息。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
使用方法
- 运行
main.m 脚本。 - 在弹出的文件选择窗口中选择一张图片。如果不选择直接关闭窗口,程序将自动生成并使用包含模拟目标的合成图像。
- 程序将显示“原始图像”窗口,请在想要分割的目标区域内部点击鼠标左键,确定种子点。
- 在弹出的参数对话框中输入生长判别阈值(默认值为0.10)。阈值越小,生长条件越严格;阈值越大,越容易包含更多像素。
- 等待程序运行,最终将显示分割结果对比图,并在控制台和弹窗中输出相关的统计数据。
代码实现逻辑与算法细节
本项目的主程序 main.m 严格按照以下逻辑流程实现:
1. 图像加载与合成演示
程序首先尝试通过
uigetfile 获取用户指定图片。
- 正常模式:读取图片并判断是否需要转换为灰度图。
- 演示模式:若用户未选择文件,代码会创建一个300x300的背景,叠加高斯白噪声,并绘制两个亮度不同的圆形区域模拟目标,最后归一化为0-255的图像。
2. 预处理
为了降低噪声对像素相似性判断的干扰,代码将图像转换为双精度浮点型(double),并使用
fspecial 创建大小为5x5、标准差为1.0的高斯滤波器,通过
imfilter 对图像进行平滑处理。
3. 交互模块
代码利用
ginput(1) 函数捕获用户的鼠标点击坐标。为防止坐标溢出,程序对种子点坐标进行了取整和图像边界范围检查。选定点会在原图上以红色十字标记。
4. 区域生长算法(核心)
这是系统的核心部分,基于队列(FIFO)实现,而非递归,以防止栈溢出并提高效率:
- 初始化:创建一个全黑的二值掩膜图像,并预分配一个大小等同于图像像素总数的数组作为处理队列(避免动态扩容带来的性能损耗)。
- 入队:将种子点加入队列,并标记掩膜。
- 统计变量:初始化区域总灰度值、像素计数和区域平均灰度。
- 迭代过程:
1. 从队列头部取出一个像素作为中心点。
2. 遍历其
8邻域(上、下、左、右及对角线方向)的像素。
3. 检查邻域像素是否在图像边界内且未被标记。
4.
相似性判别:计算邻域像素灰度值与
当前生长区域平均灰度值的差的绝对值。
5. 如果差值小于用户设定的
阈值,则将该像素纳入目标区域:
* 标记掩膜为True。
* 将该像素加入队列尾部。
* 累加灰度总值和像素数量,并
在线更新区域平均灰度值(Adaptive Mean),这使得算法能适应目标区域内部缓慢的灰度渐变。
5. 后处理
算法得到的原始掩膜可能包含噪点或不规则边缘。代码依次执行:
- 闭运算 (
imclose):使用半径为2的圆盘结构元素,连接邻近的断点,平滑轮廓。 - 孔洞填充 (
imfill):填充目标区域内部被包围的背景空洞。
6. 结果合成与显示
为了直观展示,程序手动操作RGB通道生成可视化图像:
- 将原图转换为RGB格式。
- 对属于目标区域的像素:保留绿色分量并适度增强,减弱红色和蓝色分量,从而形成绿色半透明覆盖效果。
- 使用
bwboundaries 函数计算最终二值掩膜的边界坐标,并在最终结果图中使用黄色线条描绘轮廓。 - 最后显示包含四个子图的综合结果窗口,并输出包含运行时间(由
tic/toc 计算)在内的统计信息。