이미지가 주어진 미로를 표현하고 풀기

| | | | | | | | | | | | | | | | | | | | | | | | |

이미지가 주어진 미로를 표현하고 해결하는 가장 좋은 방법은 무엇입니까?

The The Scope Issue 134의 표지 이미지

JPEG 이미지(위 참조)가 주어지면 이를 읽고 일부 데이터 구조로 구문 분석하고 미로를 푸는 가장 좋은 방법은 무엇입니까? 본능은 이미지를 픽셀 단위로 읽고 부울 값 목록(배열)에 저장하는 것입니다. 흰색 픽셀의 경우 True, 흰색이 아닌 경우 False 픽셀(색상은 버릴 수 있음). 이 방법의 문제는 이미지가 "픽셀 완벽"이 아닐 수 있다는 것입니다. 즉, 단순히 벽 어딘가에 흰색 픽셀이 있는 경우 의도하지 않은 경로가 생성될 수 있음을 의미합니다.

또 다른 방법(잠시 생각한 끝에 생각난)은 이미지를 캔버스에 그려진 경로 목록인 SVG 파일로 변환하는 것입니다. 이렇게 하면 경로를 다음으로 읽을 수 있습니다. True가 경로 또는 벽을 나타내는 동일한 종류의 목록(부울 값), False 이동 가능한 공간을 나타냅니다. 이 방법의 문제는 변환이 100% 정확하지 않고 모든 벽을 완전히 연결하지 않아 간격이 생기는 경우에 발생합니다.

또한 SVG로 변환할 때의 문제는 선이 "완벽하게 " 똑바로. 그 결과 경로가 3차 베지어 곡선이 됩니다. 정수로 인덱싱된 부울 값 목록(배열)을 사용하면 곡선이 쉽게 전송되지 않고 곡선에 있는 모든 점을 계산해야 하지만 목록 인덱스와 정확히 일치하지 않습니다.

나는 이러한 방법 중 하나가 효과가 있을 수 있지만(아마 그렇지 않을 수도 있음) 큰 이미지를 고려할 때 비효율적이며 더 나은 방법이 있다고 가정합니다. 이 방법이 가장 효율적이고/또는 가장 복잡하지 않습니다. 가장 좋은 방법이 있습니까?

그런 다음 미로를 푸는 것입니다. 처음 두 가지 방법 중 하나를 사용하면 본질적으로 행렬이 생깁니다. 이 답변, 미로를 표현하는 좋은 방법은 나무를 사용하는 것이고, 미로를 해결하는 좋은 방법은 A* 알고리즘. 이미지에서 나무를 만드는 방법은 무엇입니까? 아이디어가 있습니까?

TL;DR
구문 분석하는 가장 좋은 방법은 무엇입니까? 구조? 구조가 해결에 어떻게 도움이 되거나 방해가 될까요?

업데이트
저는 @Mikhail이 numpy, @Thomas가 추천한 대로 알고리즘이 올바르다고 생각하지만 원하는 대로 작동하지 않습니다. (아래 코드) PNG 라이브러리는 PyPNG입니다.

import png, numpy, Queue, operator, itertools def is_white(coord, image): """ (x, y)가 대략 흰색 픽셀인지 여부를 반환합니다.""" a = True for xrange(3)의 i: 그렇지 않은 경우 a: break a = image[coord[1]][coord[0] * 3 + i] > 240 return a def bfs(s, e, i,visited): """ 너비 우선 검색을 수행합니다. """ frontier = Queue.Queue() while s != e: for d in [(-1, 0 ), (0, -1), (1, 0), (0, 1)]: np = tuple(map(operator.add, s, d)) is_white(np, i) 및 np가 방문하지 않은 경우: frontier.put(np) Visited.append(s) s = frontier.get() 방문 반환 def main(): r = png.Reader(filename = "thescope-134.png") 행, 열, 픽셀, 메타 = r.asDirect() assert meta["planes"] == 3 # 파일이 RGB인지 확인 image2d = numpy.vstack(itertools.imap(numpy.uint8, 픽셀)) start, end = (402, 985), (398 , 27) bfs(start, end, image2d, []) 
인쇄