Как найти кратчайший путь в скелетонированном изображении лабиринта? - PullRequest
0 голосов
/ 26 июня 2018

Я работаю над решением лабиринта, используя Обработка изображений и NetworkX Алгоритм поиска, и мне нужно найти кратчайший путь соединения между двумя точками на этих линиях.

#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')

Когда я запускаю код выше, я получаю следующие выводы.

Исходное изображение лабиринта:

Original Input Maze Image -

После обработки изображения:

After Processing Image -

Узел указывает на координаты X-Y:

Node points on X-Y coordinates -

Информация о пути:

Path Info

Я могу успешно выполнять операции по обработке изображений, но алгоритм поиска находит самое короткое расстояние полета птицы между двумя узлами. Я хочу найти кратчайший путь вдоль скелета.

Когда я работал над этим github repo показал мне, как решить эту проблему с помощью библиотеки NetworkX, но я не могу решить ее, потому что она не дает никакой детализации.

Как найти кратчайший путь вдоль скелета лабиринта, используя обработку изображений и любой алгоритм поиска?

Заранее спасибо.

1 Ответ

0 голосов
/ 26 июня 2018

Это потому, что вы переназначаете ссылку на скелетонизированный график здесь

G = nx.path_graph(len(ps))
G = nx.karate_club_graph()

enter image description here

enter image description here

...