scipy 如何枚举一个像素宽度的numpy二进制掩码中的像素?

htrmnn0y  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(184)

如何枚举一个像素宽度的numpy二进制掩码中的像素?枚举应该在一个方向(顺时针或相反)。掩码可以接触图像的边缘或在中心。
我想使用像素数来创建1D阵列,并使用原始图像的像素强度。
圆形遮罩:

在框缐遮罩上

qij5mzcb

qij5mzcb1#

你可以从第一个像素开始
1.从图像中删除像素(或标记为已使用)
1.在3x3邻域中寻找另一个未使用的像素
1.移动到那里并从1开始重复
如果路径正好是一个像素宽,则该算法遍历该路径,并且在每个中间步骤,将正好有一个像素可在步骤2中选择,除了在开始时将有两个像素(一个导致CW遍历,另一个导致CCW遍历)。
在代码中:

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())

第一次
在第二个图像中,像素颜色表示步骤(路径沿逆时针方向)

相关问题