networkx.exception.NodeNotFound, даже если узел существует - PullRequest
1 голос
/ 11 февраля 2020

Я использую sknw для построения графика из скелетонизированного изображения (изображение создается с scikit-image ). Проблема в том, что я пытаюсь нарисовать кратчайший путь с помощью любого алгоритма, указанного в skimage networkx.exception.NodeNotFound . Но функция graph.has_node() говорит, что узел существует.

Не знаю, что делать, так как завис на много дней. Любая помощь приветствуется.

Код

from skimage.morphology import skeletonize
from skimage import data, io
from skimage.graph import shortest_path
import matplotlib.pyplot as plt
import sknw
import networkx as nx
import numpy as np
import numba


img = io.imread('m5_skeleton.png')
ske = skeletonize(img).astype(np.uint16)

# build graph from skeleton
graph = sknw.build_sknw(ske)

# draw image
plt.imshow(img, cmap='gray')

# draw edges by pts
for (s, e) in graph.edges():
    ps = graph[s][e]['pts']
    plt.plot(ps[:, 1], ps[:, 0], 'green')

# draw node by o
nodes = graph.nodes()
ps = np.array([nodes[i]['o'] for i in nodes])
plt.plot(ps[:, 1], ps[:, 0], 'r.')

print('------------------------------------------------------------------------------')
print('nodes')
print('------------------------------------------------------------------------------')
print(nodes)
print('------------------------------------------------------------------------------')

# title and show
plt.title('Build Graph')
plt.savefig('m5_graph.svg', dpi=1200)

pos = nx.spring_layout(graph)
print('------------------------------------------------------------------------------')
print('pos')
print('------------------------------------------------------------------------------')
print(pos)
print('------------------------------------------------------------------------------')

# nx.draw(graph, pos, node_color='k')

# draw path in red
print('graph.has_node(0): ' + str(graph.has_node(0)))
print('graph.has_node(10): ' + str(graph.has_node(10)))

# source = graph.nodes[0]
# target = graph.nodes[2]

path = nx.astar_path(graph, graph.nodes.get(0), graph.nodes.get(10))
h = graph.subgraph(path)
path_edges = zip(path, path[1:])
path_edges = set(path_edges)
nx.draw_networkx_nodes(h, pos, nodelist=path,  node_color='b', cmap='gray')
nx.draw_networkx_edges(h, pos, edge_cmap='gray')
plt.axis('equal')

plt.show()

enter image description here Выше m5_skeleton.png изображение, которое я использовал.

1 Ответ

0 голосов
/ 12 февраля 2020

Вам необходимо заменить:

path = nx.astar_path(graph, graph.nodes.get(0), graph.nodes.get(10))

на

path = nx.astar_path(graph, 0, 10)

То есть функция принимает ID узла, а не его содержимое, в качестве ввода.

...