如何获取图像中像素之间的所有连接

时间:2018-02-02 10:20:01

标签: python image pixels a-star

为路径规划开发A *算法,我试图获得一个名为 edges 的列表,其中所有从一个像素到其邻居像素的连接都发生在非占用空间中(其中像素值为1)。

我计算此连接的图像是351x335像素的图像。

像素P2,4,6,8与中心距离= 1,而像素P1,3,5,7距中心约为距离= 1.4(毕达哥拉斯定理);见图像:

Neighbourhood of a pixel

为edge循环编写的代码永远不会结束。由于循环,这会花费太多的计算时间吗? 顶点循环以一秒左右结束。

注意:我正在将列表初始化为两个非常大的数组,并在最后将它们剪切为不使用动态分配。

编辑:图片(imOut)如下: Link to image used as map

编辑:完整代码如下:

'''
IMPORTS
'''

import cv2 as cv  # Import OpenCV
import numpy as np  # Import Numpy
from skimage.color import rgb2gray
import math
from datetime import datetime
import matplotlib.pyplot as plt
from scipy import arange


'''
CODE SETTINGS
'''
# Allowing to print full array without truncation
np.set_printoptions(threshold=np.nan)

'''
MAIN PROGRAM
'''
im = rgb2gray(cv.imread('map1.png'))
imOut = im  # Making a copy of the image to output
# plt.imshow(imOut)
# plt.show()



vertices = np.zeros((imOut.shape[0]*imOut.shape[1], 3))  # 1st col to x, 2nd col to y, 3rd col to heuristic (euclidean distance to QGoal)
edges = np.zeros((100*imOut.shape[0]*imOut.shape[1], 3))     # 1st col 1st vertex, 2nd col 2nd vertex, 3rd col edge length
# Initialization of vertices with start pos.


# CREATE VERTICES AND EDGES LISTS FROM THE MAP PROVIDED

'''
Vertices List -> Add all obstacle-free configurations to the vertices list.
Edges List -> Go pixel by pixel in the map and, if they are obstacle-free configurations,
add, out of the 8 neighbouring pixels, the ones that are obstacle-free as feasible edges.
'''

# Vertices list creation
indexVertices = 0
for i in range(0, imOut.shape[0]):
    for j in range(0, imOut.shape[1]):
        if imOut[i,j] == 1:     # If it's in free space
            # Compute heuristic to goal node (euclidean distance).
            heuristic = math.sqrt(pow(i-QGoal[0],2) 
                                + pow(j-QGoal[1],2))
            vertices[indexVertices,:] = [i, j, heuristic]
            indexVertices = indexVertices + 1

vertices = vertices[0:indexVertices,:]

# Edges list creation
# I loop over the same vertices array, as it only contains the free pixels.
indexEdges = 0
for i in range(0, vertices.shape[0]):
    for k in range(0, vertices.shape[0]):
        # If it is not the same pixel that we are checking
        if i != k:
            # Check if it is a neighbouring pixel and, if so, 
            #add it to the list of edges with its distance(path cost).
            pathCost = (math.sqrt(pow(vertices[i,0] 
                                    - vertices[k,0], 2) 
                                + pow(vertices[i,1] 
                                    - vertices[k,1], 2))
            if pathCost == 1 or round(pathCost,1) == 1.4:
                edges[indexEdges,:] = [i, k, pathCost]
                indexEdges = indexEdges + 1

edges = edges[0:indexEdges,:]

0 个答案:

没有答案