问题
I am working on maze solving using Image Processing and NetworkX search algroithm and need to find the shortest connecting path between two points on those lines.
#Solving Maze Using Image Processing and NetWorkx search
#Open Maze image
img = cv2.imread("C:/Users/Dell/HandMadeMaze1.jpg")
kernel = np.ones((1,1),np.uint8)
#Convert to GrayScaledImage
grayscaled = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#BınaryThreshold + OtsuThreshold + BinaryThreshold
retval, threshold = cv2.threshold(grayscaled, 10, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
retval, threshold2 = cv2.threshold(threshold, 10, 255, cv2.THRESH_BINARY_INV)
threshold2[threshold2 == 255] = 1
#Skeletonize the Thresholded Image
skel = skeletonize(threshold2)
#Build Graph from skeleton
graph = sknw.build_sknw(skel, multi=False)
G = nx.Graph(graph)
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], 'red')
#Draw Node by 'o'
node, nodes = graph.node, graph.nodes()
ps = np.array([node[i]['o'] for i in nodes])
plt.plot(ps[:,1], ps[:,0], 'g.')
plt.title('Skeletonize')
plt.savefig('Overlay_Maze.jpg')
plt.show()
G = nx.path_graph(len(ps))
G = nx.karate_club_graph()
pos = nx.spring_layout(G)
nx.draw(G,pos,node_color='b')
When I run the code above, I get the following outputs.
Original Input Maze Image :
--
After Processing Image:
--
Node points on X-Y coordinates:
--
Path Info:
I can successfully perform image processing operations, but the search algorithm finds the shortest bird flight distance between two nodes. I want to find the shortest path along the Skeleton.
When I was working on this github repo showed me solve this problem using the NetworkX library but I can not solve it because it does not give any detail.
How to find the shortest path along skeleton of maze image using image processing and any search algorithm ?
Thanks in advance.
回答1:
It's because you are reassigning you reference to the skeletonized graph here
G = nx.path_graph(len(ps))
G = nx.karate_club_graph()
回答2:
You can use the graph
function in skimage to achieve this.
import skimage.graph
### give start (y1,x1) and end (y2,x2) and the binary maze image as input
def shortest_path(start,end,binary):
costs=np.where(binary,1,1000)
path, cost = skimage.graph.route_through_array(
costs, start=start, end=end, fully_connected=True)
return path,cost
来源:https://stackoverflow.com/questions/51043824/how-to-find-shortest-path-in-skeletonized-maze-image