gpt4 book ai didi

python - 如何提取 skimage 骨架信息到 python 中的 NetworkX 节点和边以进行进一步的高级分析

转载 作者:行者123 更新时间:2023-12-05 05:22:16 25 4
gpt4 key购买 nike

目前,我在 python 中使用 skimage 从一些二值化 map 中提取开放空间的骨架,如下图所示,

Original BW map image Skeleton-ized open area

使用以下 python 代码:

from skimage.morphology import skeletonize
from skimage import draw
from skimage.io import imread, imshow
from skimage.color import rgb2gray

# load image from file
img_fname=os.path.join('images','mall1_2F_schema.png')
image=imread(img_fname)

# Change RGB color to gray
image=rgb2gray(image)

# Change gray image to binary
image=np.where(image>np.mean(image),1.0,0.0)

# perform skeletonization
skeleton = skeletonize(image)

现在我想从骨架中提取端点和交叉点作为 Networkx 图形对象的节点,同时计算相邻节点之间的距离作为 Networkx 图形对象的边。目前,我必须手动获取点坐标并将其输入到 NetworkX 对象初始化过程中,我们有没有更智能的方法来自动完成所有操作?

对了,我找到了yaron kahanovitchthe question on stackoverflow 的回答提出了类似的方法。但是,没有给出更多的实现建议,我认为 NetworkX 可能是一种方法。

非常感谢您的任何建议。

最佳答案

给你。

这段代码是针对2D骨架图像的,您可以轻松地将其扩展到3D。

import networkx as nx
import numpy as np

def skeleton_image_to_graph(skeIm, connectivity=2):
assert(len(skeIm.shape) == 2)
skeImPos = np.stack(np.where(skeIm))
skeImPosIm = np.zeros_like(skeIm, dtype=np.int)
skeImPosIm[skeImPos[0], skeImPos[1]] = np.arange(0, skeImPos.shape[1])
g = nx.Graph()
if connectivity == 1:
neigh = np.array([[0, 1], [0, -1], [1, 0], [-1, 0]])
elif connectivity == 2:
neigh = np.array([[0, 1], [0, -1], [1, 0], [-1, 0], [1, 1], [1, -1], [-1, 1], [-1, -1]])
else:
raise ValueError(f'unsupported connectivity {connectivity}')
for idx in range(skeImPos[0].shape[0]):
for neighIdx in range(neigh.shape[0]):
curNeighPos = skeImPos[:, idx] + neigh[neighIdx]
if np.any(curNeighPos<0) or np.any(curNeighPos>=skeIm.shape):
continue
if skeIm[curNeighPos[0], curNeighPos[1]] > 0:
g.add_edge(skeImPosIm[skeImPos[0, idx], skeImPos[1, idx]], skeImPosIm[curNeighPos[0], curNeighPos[1]], weight=np.linalg.norm(neigh[neighIdx]))
g.graph['physicalPos'] = skeImPos.T
return g

关于python - 如何提取 skimage 骨架信息到 python 中的 NetworkX 节点和边以进行进一步的高级分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41008973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com