如何基于动脉分割中心线建图存储冠脉树并提取图像patch
冠脉造影血管拓扑图构建实操方案
你已经拿到分割结果和骨架化中心线的话,按下面三步做就能拿到符合要求的图结构,全程不需要额外复杂算法:
1 提取图节点(特征点)
先把骨架上的点分三类筛,所有筛出来的点就是图的节点,每个点分配全局唯一ID:
- 端点:遍历骨架所有像素,统计每个像素8邻域内属于骨架的像素数量,数量为1的就是血管分支的末端点,必须保留
- 分叉点:邻域内骨架像素数≥3的点,对应血管分叉的位置,这里注意加个小规则去噪:要求该点周围3*3范围内至少有2个满足邻域像素≥3的点,才判定为真分叉点,不然很多分割边缘毛刺带出来的假分叉会把拓扑搞乱
- 段内采样点:筛完所有端点和分叉点之后,任意两个特殊点(端点/分叉点)之间就是一段没有分叉的独立血管段,沿着这段血管的骨架,按固定步长采样就行,步长和你后续要提的patch尺寸匹配即可——比如你要提32*32的patch,步长设16像素,刚好patch之间有50%重叠,不会漏特征也不会太冗余。
所有节点除了ID,必须存两个核心属性:(x, y)像素坐标、该位置的血管管径(从分割掩码上算该点到血管壁的最短距离乘2即可)。
2 构建拓扑连接边
节点筛完之后顺着骨架连边就行:
- 从每个端点、分叉点出发,沿着骨架的8邻域往未遍历的方向走,每走到下一个采样点就给两个点加一条无向边,直到走到下一个分叉点/端点就停止当前路径遍历
- 全部遍历完之后做一遍清洗:删掉没有任何边连接的孤立噪点,删掉两个节点之间重复的边,最后得到的边集就是完整的冠脉拓扑,天然是树结构不会有环路,完全匹配血管的实际分支关系。
3 存储与patch提取适配
- 存储不用搞复杂格式:轻量场景直接用Python的NetworkX库存Graph对象就行,节点属性、边属性都能直接挂载,后续导出成JSON、GEXF格式跨工具用也方便;如果追求读存速度,单独存节点坐标数组+邻接表矩阵也可以。
- 提patch的时候直接遍历所有节点,拿节点的
(x,y)当中心,按你要的尺寸从原始造影图/分割图上裁即可,图像边缘位置的节点裁的时候用零值/灰度均值补padding,避免坐标越界报错。
实测提示:如果骨架提取完有很多小的短枝噪点,可以先给所有血管段算长度,把长度低于3个像素的短枝直接删掉,能省很多后续去噪的功夫。
内容的提问来源于stack exchange,提问作者Angie
相关产品推荐
相关产品推荐

