从中轴骨架图

时间:2012-10-19 10:38:45

标签: matlab image-processing

我有一个前景为白色的二进制图像。在其内侧轴骨架的分支点和端点之外,我想构建一个图形。理想情况下,具有以下结构:

  1. [节点]格式为[ID X Y],其中X,Y是分支点或端点的像素位置,ID是节点的ID - 整数。
  2. [edges]格式为[ID N1 N2],其中N1和N1代表节点的ID。
  3. 通过同时使用[nodes]和[edges],我会将骨架映射到无向图表示。

    使用下面的代码,我可以计算分支和端点,但现在我需要正确连接它们:

    skelImg   = bwmorph(im, 'thin', 'inf');
    branchImg = bwmorph(skelImg, 'branchpoints');
    endImg    = bwmorph(skelImg, 'endpoints');
    
    [row, column] = find(endImg);
    endPts        = [row column];
    [row, column] = find(branchImg);
    branchPts     = [row column];
    
    figure; imshow(skelImg); hold on; plot(branchPts(:,2),branchPts(:,1),'r*'); hold on; plot(endPts(:,2),endPts(:,1),'*');
    

    输入图像(左侧),骨架(中间)以及相应的分支点和终点(右侧)的示例如下:

         

    或者在以下网址中的完整解析:http://imgur.com/a/a3s4F/

2 个答案:

答案 0 :(得分:1)

作为第一步,我建议使用BFS变体。您的节点是白色像素,如果两个像素是邻居,则存在边缘。这将为您提供包含不需要的节点的完整图表,这些点不是分支点/端点。

现在,这是一个重要的观察,每个不需要的节点包含完全 2个边,否则它将是一个分支点或一个终点。

因此,开始递归删除所有不需要的节点:

While there are nodes that are not branchpoints/endpoints
    Select one of these nodes.
    Merge its two edges into one by removing the node.

答案 1 :(得分:1)

可能的解决方案包括:

getting branched points (bp) from skeleton
getting edges : edges=skeleton-bp
getting end points from edges
adding branched points in a graph
getting endpoints neighbouring branched points and linking
adding remaining endpoints in the graph
linking endpoints

A python implementation with networkx收益率: from skeleton of B to graph