6

我有一个前景是白色的二进制图像。从它的中轴骨架的分支点和端点中,我想构建一个图。理想情况下,具有以下结构:

  1. [nodes] 具有 [ID XY] 格式,其中 X,Y 是分支点或端点的像素位置,ID 是节点的 ID - 一个整数。
  2. [edges] 具有 [ID N1 N2] 格式,其中 N1 和 N1 表示节点的 ID。

通过同时使用 [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/

4

2 回答 2

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.
于 2012-10-19T11:27:08.503 回答
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

带有 networkx的python 实现产生: 从B的骨架到图

于 2013-06-05T11:12:19.567 回答