Matlab 中轴骨架图

Matlab 中轴骨架图,matlab,image-processing,Matlab,Image Processing,我有一个前景是白色的二值图像。在中轴骨架的分支点和端点之外,我想构建一个图。理想情况下,采用以下结构: [nodes]的格式为[ID X Y],其中X,Y是分支点或端点的像素位置,ID是节点的ID-一个整数 [edges]的格式为[ID N1 N2],其中N1和N1表示节点的ID 通过同时使用[nodes]和[Edge],我将得到骨架到无向图表示的映射 使用下面的代码,我可以计算分支和端点,但现在我需要正确连接它们: skelImg = bwmorph(im, 'thin', 'inf');

我有一个前景是白色的二值图像。在中轴骨架的分支点和端点之外,我想构建一个图。理想情况下,采用以下结构:

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

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

    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),'*');
    
    下面给出了输入图像(左侧)、其骨架(中间)以及相应的分支和端点(右侧)的示例:


    或者也可以在下面的url中完全解析:

    作为第一步,我建议使用variant。节点是白色像素,如果两个像素是相邻的,则会有一条边。这将为您提供一个包含不需要的节点的完整图形,这些节点不是分支点/端点

    现在,这里有一个重要的观察结果,每个不需要的节点正好包含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.
    

    一种可能的解决方案包括:

    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产生: