from PIL import Image
import numpy
import array
src = numpy.uint8(Image.open("path.png")).copy()
h, w, _ = src.shape
x0 = y0 = None
for y in range(h):
if x0 is not None:
break
for x in range(w):
if src[y][x][0]:
x0, y0 = x, y
break
path = []
while True:
src[y0][x0][0] = 0
path.append((x0, y0))
nx = ny = None
for yy in (y0-1, y0, y0+1):
for xx in (x0-1, x0, x0+1):
if 0 <= yy < h and 0 <= xx < w and src[yy][xx][0]:
nx, ny = xx, yy
if nx is None: break
x0, y0 = nx, ny
print(path)
out = array.array('B', [128]) * (w*h)
for i, (xx, yy) in enumerate(path):
out[yy*w+xx] = i * 256 // len(path)
open("out.pgm", "wb").write(b"P5\n%i %i 255\n" % (w, h) + out.tobytes())
1条答案
按热度按时间qij5mzcb1#
你可以从第一个像素开始
1.从图像中删除像素(或标记为已使用)
1.在3x3邻域中寻找另一个未使用的像素
1.移动到那里并从1开始重复
如果路径正好是一个像素宽,则该算法遍历该路径,并且在每个中间步骤,将正好有一个像素可在步骤2中选择,除了在开始时将有两个像素(一个导致CW遍历,另一个导致CCW遍历)。
在代码中:
第一次
在第二个图像中,像素颜色表示步骤(路径沿逆时针方向)