Я использую 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()
Выше m5_skeleton.png изображение, которое я использовал.