基于形态学细化的静脉骨架去毛刺算法研究
项目简介
本项目专注于静脉生物识别预处理阶段的关键问题——骨架化后的伪分支(毛刺)去除。在静脉图像提取单像素骨架的过程中,受噪声或细化算法影响,往往会产生大量非主干的冗余短小分支,严重影响后续的特征点提取与拓扑结构匹配。
本项目通过MATLAB实现了一套完整的算法流程,包括模拟静脉数据生成、形态学骨架提取、基于拓扑结构的迭代去毛刺以及详细的结果可视化分析。核心算法采用像素级路径追踪策略,能够精准区分毛刺与静脉主干,在去除噪声的同时完整保留静脉的拓扑连通性。
功能特性
- 模拟数据生成:内置合成算法,利用三次贝塞尔曲线生成随机静脉主干,并叠加随机方向和长度的毛刺噪声,用于算法验证。
- 形态学骨架化:将二值化图像细化为单像素宽度的中心线网络。
- 拓扑特征分析:基于8邻域分析法,自动检测骨架中的端点(Endpoint)和分叉点(Bifurcation Point)。
- 迭代去毛刺:
* 自动追踪所有端点的延伸路径。
* 基于预设长度阈值智能识别伪分支。
* 保护分叉点(交叉路口)不被错误切除。
* 支持迭代处理,防止一次剪枝不彻底或导致新的断点。
- 可视化对比:提供原始图像、初始骨架、处理后骨架的直观对比,并用不同颜色标记特征点,实时输出端点数量和剔除统计。
系统要求
- MATLAB R2018a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
使用方法
- 直接运行主程序脚本(入口函数为
main)。 - 程序将自动执行以下流程:
* 生成一张带有随机毛刺的模拟静脉图像。
* 进行二值化和形态学细化。
* 执行多轮迭代去毛刺操作。
* 弹出结果窗口展示对比图,并在控制台输出端点统计信息。
- 可通过修改代码顶部的
params 结构体来调整参数:
*
params.pruneThreshold:决定多长的分支被视为毛刺(默认15像素)。
*
params.maxIter:最大迭代次数。
核心算法与实现细节
本项目代码完全基于MATLAB脚本实现,以下是其实际执行的逻辑流程:
1. 数据生成与预处理
程序首先调用内部函数构建测试数据。通过贝塞尔曲线模拟静脉走向,利用膨胀操作模拟血管宽度,并人为添加从主干延伸出的短线段作为“毛刺”。生成的图像经过高斯模糊和二值化处理,模拟真实的图像采集效果。之后,利用
bwmorph 函数的
'thin' 操作,将二值图像迭代腐蚀直至收敛,获得单像素宽度的骨架图。
2. 迭代去毛刺机制 (iterative_deburring)
这是本项目的核心逻辑模块。由于一次剪枝可能会暴露出新的短分支(原本的长分支被剪短),算法采用
while 循环进行迭代处理,直到骨架不再变化或达到最大迭代次数。
- 端点定位:在每一轮迭代中,首先计算当前的骨架端点 map。
- 路径追踪:对每一个端点,启动路径追踪算法,沿骨架线向内部搜索。
- 剪枝判定:
* 如果追踪到的路径长度小于设定的阈值(
pruneThreshold),且该路径汇入了一个分叉点(即连接到了主干),则判定为毛刺。
* 将该路径上的像素标记为待删除(mask)。
- 安全执行:批量删除标记的像素后,再次调用形态学细化函数。这一步非常关键,它确保了删除操作后骨架依然保持单像素连接性,防止产生锯齿或断裂。
3. 分支追踪逻辑 (trace_branch)
该函数实现了对单条血管路径的像素级遍历:
- 8邻域搜索:从给定端点开始,在3x3邻域内寻找下一个未访问的白色像素。
- 分叉点检测:在追踪过程中,实时计算当前像素的邻域连接数。如果邻域内的连接像素数量 $ge 3$,说明遇到了骨架的交叉路口(分叉点)。
- 保护机制:一旦检测到分叉点,追踪立即停止。算法会将分叉点本身从“待删除列表”中移除,确保主干结构的连通性不受影响,只切除分叉点之外出的分支部分。
4. 结果展示与评估
程序最后通过三个子图直观展示算法效果:
- 子图1:显示原始的二值化含噪图像。
- 子图2:显示初始细化后的骨架。使用不同颜色的标记点(红色圆点代表端点,绿色圆点代表分叉点),直观展示毛刺造成的端点冗余。
- 子图3:显示去毛刺后的最终骨架。可以观察到所有的短小伪分支已被移除,红色的端点数量显著减少,仅保留了主静脉的末端。
控制台通过计算
length(endpoints) 的变化,精确输出了剔除的伪分支数量,验证算法的有效性。