首页 > 解决方案 > 如何从二维阵列中获得完美的灰度图像?

问题描述

给定一个迷宫作为输入,我编写了一个代码来查找最短路径。但是,输出图像路径是不连续的。这是什么原因?

'''

import numpy as np
from PIL import Image
import cv2
import matplotlib.pyplot as plt
import sys
sys.setrecursionlimit(150000)
def closest_path(map,pos,fin):
    stack0=np.zeros([50,2],dtype=np.int32)
    step=0
    stack0[0]=[pos[0],pos[1]]
    while mem[fin[0],fin[1]]==1000000:
        stack1=np.zeros([50,2],dtype=np.int32)
        ar=0
        for k in stack0:
            if k[0]<len(map)-1 and map[k[0]+1,k[1]]>100 and mem[k[0]+1,k[1]]==1000000:
                stack1[ar]=[k[0]+1,k[1]]
                ar+=1
                mem[k[0]+1,k[1]]=step+1
            if k[1]<len(map[0])-1 and map[k[0],k[1]+1]>100 and mem[k[0],k[1]+1]==1000000:
                stack1[ar]=[k[0],k[1]+1]
                ar+=1
                mem[k[0],k[1]+1]=step+1
            if k[0]>0 and map[k[0]-1,k[1]]>100 and mem[k[0]-1,k[1]]==1000000:
                stack1[ar]=[k[0]-1,k[1]]
                ar+=1
                mem[k[0]-1,k[1]]=step+1
            if k[1]>0 and map[k[0],k[1]-1]>100 and mem[k[0],k[1]-1]==1000000:
                stack1[ar]=[k[0],k[1]-1]
                ar+=1
                mem[k[0],k[1]-1]=step+1
        step+=1
        stack0=stack1
def retract(mem,pos0,pos1):
    if mem[pos0,pos1]==0:
        return mem
    else:
        if pos0<len(map)-1 and mem[pos0,pos1]-mem[pos0+1,pos1]==1:

            path[pos0+1,pos1]=255
            retract(mem,pos0+1,pos1)
        elif pos1<len(map[0])-1 and mem[pos0,pos1]-mem[pos0,pos1+1]==1:

            path[pos0,pos1+1]=255
            retract(mem,pos0,pos1+1)
        elif pos0>0 and mem[pos0][pos1]-mem[pos0-1][pos1]==1:

            path[pos0-1,pos1]=255
            retract(mem,pos0-1,pos1)
        elif pos1>0 and mem[pos0][pos1]-mem[pos0][pos1-1]==1:

            path[pos0,pos1-1]=255
            retract(mem,pos0,pos1-1)
map=cv2.imread('mazza.png',0)
mem = np.zeros([365,366],dtype=np.int32)
pos=[10,10]
fin=[15,340]
path = np.zeros([365,366],dtype=np.int32)
for i in range (0,365):
    for j in range (0,366):
        mem[i,j]=1000000
        if map[i][j]<150:
            path[i,j]=0
        else:
            path[i,j]=100
closest_path(map,pos,fin)
if mem[fin[0],fin[1]]!=1000000:
    print(mem[fin[0],fin[1]])
    retract(mem,fin[0],fin[1])
    ime = Image.fromarray(path)
    plt.imshow(ime)
else:
    print("cannot be reached")
'''

图中白色为最小路径,黑色为障碍物,灰色为自由区域。但是,正如你所看到的,这条路是不规则的。为什么会这样?

标签: pythonimageimage-processing

解决方案


推荐阅读