Python:多次滚动数组并将每次迭代保存为图像

Python:多次滚动数组并将每次迭代保存为图像,python,numpy,pillow,Python,Numpy,Pillow,我用for循环拍摄了多张图像。我想通过在x和y方向上滚动初始像素并每次保存滚动图像,为每个图像获得5个伪层 我正在练习一张图片,确保我能从中获得五层,但没有乐趣 我的代码在下面,但它只保存第一个图像;输出为pl_0.tif list_frames = glob.glob('*.gif') for index, fname in enumerate(list_frames): im = Image.open(fname) shift=1 imary0 = np.array(

我用for循环拍摄了多张图像。我想通过在x和y方向上滚动初始像素并每次保存滚动图像,为每个图像获得5个伪层

我正在练习一张图片,确保我能从中获得五层,但没有乐趣

我的代码在下面,但它只保存第一个图像;输出为pl_0.tif

list_frames = glob.glob('*.gif')
for index, fname in enumerate(list_frames):
    im = Image.open(fname)
    shift=1
    imary0 = np.array(im) # initial image (first layer)
    imary1x = np.roll(imary0, shift, axis=0) # shift image by one pixel to create second layer
    imary1xy = np.roll(imary1x, shift, axis=1)
    imary2x = np.roll(imary1xy, shift, axis=0) # shift previous image again to create third layer
    imary2xy = np.roll(imary2x, shift, axis=1)
    imary3x = np.roll(imary2xy, shift, axis=0) # shift previous image again to create fourth layer
    imary3xy = np.roll(imary3x, shift, axis=1)
    imary4x = np.roll(imary3xy, shift, axis=0) # shift previous image again to create fifth layer
    imary4xy = np.roll(imary4x, shift, axis=1)
    im0 = Image.fromarray(imary0)
    im0.save('pl_{}.tif'.format(index))
    im1 = Image.fromarray(imary1xy)
    im1.save('pl_{}.tif'.format(index))
    im2 = Image.fromarray(imary2xy)
    im2.save('pl_{}.tif'.format(index))
    im3 = Image.fromarray(imary3xy)
    im3.save('pl_{}.tif'.format(index))
    im4 = Image.fromarray(imary4xy)
    im4.save('pl_{}.tif'.format(index))
    im.close()

有什么建议吗?(如果这是一个简单的解决方案,请随意嘲笑我)

您将所有5个图像保存在同一个输出文件中,这意味着您只获得一个图像,
im4

im0.save('pl_{}.tif'.format(index))
im1 = Image.fromarray(imary1xy)
im1.save('pl_{}.tif'.format(index))
im2 = Image.fromarray(imary2xy)
im2.save('pl_{}.tif'.format(index))
im3 = Image.fromarray(imary3xy)
im3.save('pl_{}.tif'.format(index))
im4 = Image.fromarray(imary4xy)
im4.save('pl_{}.tif'.format(index))
(请注意,在下一个循环之前不会修改索引)

快速修复:

im0.save('pl_{}0.tif'.format(index))
im1 = Image.fromarray(imary1xy)
im1.save('pl_{}1.tif'.format(index))
im2 = Image.fromarray(imary2xy)
im2.save('pl_{}2.tif'.format(index))
im3 = Image.fromarray(imary3xy)
im3.save('pl_{}3.tif'.format(index))
im4 = Image.fromarray(imary4xy)
im4.save('pl_{}4.tif'.format(index))

您将所有5个图像保存在同一输出文件中,这意味着您只获得一个图像,
im4

im0.save('pl_{}.tif'.format(index))
im1 = Image.fromarray(imary1xy)
im1.save('pl_{}.tif'.format(index))
im2 = Image.fromarray(imary2xy)
im2.save('pl_{}.tif'.format(index))
im3 = Image.fromarray(imary3xy)
im3.save('pl_{}.tif'.format(index))
im4 = Image.fromarray(imary4xy)
im4.save('pl_{}.tif'.format(index))
(请注意,在下一个循环之前不会修改索引)

快速修复:

im0.save('pl_{}0.tif'.format(index))
im1 = Image.fromarray(imary1xy)
im1.save('pl_{}1.tif'.format(index))
im2 = Image.fromarray(imary2xy)
im2.save('pl_{}2.tif'.format(index))
im3 = Image.fromarray(imary3xy)
im3.save('pl_{}3.tif'.format(index))
im4 = Image.fromarray(imary4xy)
im4.save('pl_{}4.tif'.format(index))

未经测试,但我认为这应该符合您的目标:

添加一个
numberofshifts
变量,然后使用该变量进行迭代。然后对np.roll的调用是嵌套的,我认为这应该可以工作

list_frames = glob.glob('*.gif')
for index1, fname in enumerate(list_frames):
    im = Image.open(fname)
    shift=1
    number_of_shifts = 4
    image_list = []
    imary0 = np.array(im) # initial image (first layer)
    for _ in range(number_of_shifts):
        if not image_list:
            image_list.append(imary0)
        else:
            image_list.append(np.roll(np.roll(image_list[-1], shift, axis=0), shift, axis=1))
    for index2, img in enumerate(image_list):
        img.save("pl_{}_{}.tif".format(fname, index2))
    im.close()

未经测试,但我认为这应该符合您的目标:

添加一个
numberofshifts
变量,然后使用该变量进行迭代。然后对np.roll的调用是嵌套的,我认为这应该可以工作

list_frames = glob.glob('*.gif')
for index1, fname in enumerate(list_frames):
    im = Image.open(fname)
    shift=1
    number_of_shifts = 4
    image_list = []
    imary0 = np.array(im) # initial image (first layer)
    for _ in range(number_of_shifts):
        if not image_list:
            image_list.append(imary0)
        else:
            image_list.append(np.roll(np.roll(image_list[-1], shift, axis=0), shift, axis=1))
    for index2, img in enumerate(image_list):
        img.save("pl_{}_{}.tif".format(fname, index2))
    im.close()

是什么让你认为如果你多次调用它,
'pl{}.tif'.format(index)
会给出不同的结果?@njzk2:答案是:在没有咖啡休息的情况下,看到同一个代码的时间太长了。你应该能够将
roll
调用组合成一行,并使用for循环来编写文件,看起来这正是你想要做的,所以@Jean François Fabre!但我还在学习,所以我会接受所有和任何反馈!是什么让你认为如果你多次调用它,
'pl{}.tif'.format(index)
会给出不同的结果?@njzk2:答案是:在没有咖啡休息的情况下,看到同一个代码的时间太长了。你应该能够将
roll
调用组合成一行,并使用for循环来编写文件,看起来这正是你想要做的,所以@Jean François Fabre!但我还在学习,所以我会接受所有和任何反馈!啊,对,所以,我认为通过索引输出,我不会有这个问题。谢谢您可能还想考虑将下面我使用的文件名引用添加到倒数第二行的输出文件中,这样您的第二个循环就不会覆盖第一个
im0.save('pl{}}}{u}0.tif'.format(fname,index))
ah对了,虽然通过索引输出我不会有这个问题。谢谢您可能还想考虑将下面使用的filename引用添加到倒数第二行的输出文件中,这样您的第二个循环就不会覆盖第一个
im0.save('pl{}}{}0.tif')的结果。format(fname,index))
无法测试它,但是如果它能起作用的话,那就值得一次投票,因为它极大地改进了操作代码。我喜欢你的嵌套方式,我会尝试实现,但不会在今天实现,因为我的工作已经到了最后期限,我害怕引入更多我已经遇到的错误,谢谢!无法测试它,但如果它能工作,就应该得到一次升级投票,因为它大大改进了操作代码。我喜欢你的嵌套方式,我会尝试实现,但不会在今天实现,因为我正在工作到最后期限,我害怕引入任何我已经存在的错误,谢谢!