基于区域分裂合并算法的灰度图像分割系统
项目简介
本项目是一个基于 MATLAB 开发的高精度灰度图像分割系统。它实现了经典的 区域分裂合并(Region Splitting and Merging) 算法,旨在通过分析图像的统计特性,将具有相似属性的像素集合分离出来。
系统采用了四叉树分解(Quadtree Decomposition)技术进行初始区域分裂,并结合基于图论(Graph Theory)的区域邻接图(RAG)算法执行高效的区域合并。相比于传统的阈值分割,该方法结合了局部统计特性与全局结构信息,能够有效克服噪声干扰,清晰地提取目标物体与背景的边界。
功能特性
- 智能图像源处理:自动尝试读取标准测试图像(如
cameraman.tif),若无法读取则自动生成含正弦/余弦纹理的合成图像用于功能演示。 - 自适应四叉树分裂:基于灰度一致性谓词(最大最小灰度差)递归分解图像,自动适应图像细节,支持设定最小块尺寸限制。
- 基于图论的高效合并:利用图的连通分量算法(Connected Components)处理区域合并,相比传统的迭代扫描更加高效且准确。
- 鲁棒的边界处理:通过填充算法(Padding)将图像扩展为2的幂次大小以适配四叉树算法,处理结束后自动裁剪回原始尺寸。
- 全流程可视化:提供原始图像、分裂阶段的四叉树网格(红色边界)以及最终合并后的重建图像的对比展示。
- 结果量化统计:在控制台输出初始分裂区域数量与最终合并后的区域数量,便于评估算法压缩率。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
使用方法
- 将项目代码保存至 MATLAB 工作路径中。
- 直接运行主程序入口函数。
- 程序将自动清理工作区,加载或生成图像,并开始执行分割流程。
- 运行结束后,会弹出一个包含三个子图的窗口,分别显示原始图像、分裂过程可视化和最终分割结果。控制台将打印区域数量统计信息。
算法实现原理与代码逻辑
本项目核心逻辑封装在主程序中,主要包含以下五个关键处理阶段:
1. 图像预处理与填充
程序首先对输入图像进行灰度化处理(若为彩色),并将数据类型归一化为
double 精度([0, 1] 范围)。为了满足四叉树分解对图像尺寸的要求(必须为正方形且边长为2的幂次),算法计算出能够包围原图的最小
2^N 尺寸,并创建一个全零矩阵进行填充。原始图像数据被放置在该矩阵的左上角。
2. 递归区域分裂 (Split Phase)
分裂过程由一个递归辅助函数控制。算法从整幅填充后的图像开始:
- 一致性判断:计算当前块内像素的最大灰度值与最小灰度值的差值。
- 分裂准则:如果差值大于预设的
splitThreshold(默认为 0.15)且当前块尺寸大于 minBlockSize(默认为 2x2),则将该块均分为四个子象限,并继续递归处理。 - 叶子节点记录:若满足一致性要求或达到最小尺寸,停止分裂。程序将该区域的位置(行、列)、尺寸、以及平均灰度值记录到全局变量
leafBlocks 中。
3. 可视化标记生成
在得到所有叶子节点后,程序构建一个标记矩阵(Label Matrix),将每个像素点映射到其对应的区域ID。同时,为了直观展示分裂效果,程序生成一张可视化图像,在每个叶子区域的边界绘制红色线条,勾勒出四叉树的结构。
4. 基于图论的区域合并 (Merge Phase)
合并阶段采用了高效的向量化操作和图论算法,而非传统的双重循环扫描:
- 邻接关系构建:通过对标记矩阵进行矩阵移位(水平和垂直方向),快速识别所有相邻的像素对,从而构建区域邻接列表。
- 相似性度量:利用索引快速查找相邻区域的平均灰度值,计算二者的差值。
- 边的筛选:若相邻区域的均值差小于
mergeThreshold(默认为 0.08),则认为这两个区域应当合并,保留该边。 - 连通分量计算:使用 MATLAB 的
graph 对象构建区域关系图,并调用 conncomp 函数计算连通分量。属于同一个连通分量的所有原始区域被标记为同一个新区域ID,从而一步完成复杂的合并操作。
5. 结果重建
程序根据新的区域ID重新计算最终图像的像素值:
- 既使用面积加权法计算每个新合并区域的全局平均灰度值。
- 利用标记矩阵的索引映射,将计算出的新均值回填到图像像素中,生成最终的分割结果图。
- 最后显示结果时,会将图像从填充尺寸裁剪回原始图像的
rows x cols 尺寸,确保输出与输入一致。