如何使用数组制作GIF

3

需要帮助

我正在使用“moving_mnist”数据集进行工作。使用tfds.load(“moving_mnist”)加载此数据,然后使用tfds.as_numpy()将其转换为数组,它将返回形状为(20,64,64,1)的图像序列数组,其中20是帧数。现在我想要的是在我的jupyter笔记本中将这些数组显示为GIF,请参见下面我尝试过的代码,但它只会为最后一帧生成简单的图像。

import tensorflow_datasets as tfds
ds, ds_info = tfds.load("moving_mnist", with_info = True,split="test")

num_examples = 3
examples = list(dataset_utils.as_numpy(ds.take(num_examples)))
fig = plt.figure(figsize=(3*3, 3*3))
fig.subplots_adjust(hspace=1/3, wspace=1/3)
for i, ex in enumerate(examples):
   video = ex["image-sequence"]
   frame,height, width, c = video.shape

   if c == 1:
       video = video.reshape(video.shape[:3])

       for i in range(0,frame):
       ax.imshow(video[i,:,:], animated=True)

这里是我得到的结果,但我想要它作为GIF格式

2个回答

2

使用moviepy库可以轻松实现此功能:

import numpy as np
frames = np.random.randint(256, size=[20, 64, 64, 1], dtype=np.uint8)  # YOUR DATA HERE

# save it as a gif
from moviepy.editor import ImageSequenceClip
clip = ImageSequenceClip(list(frames), fps=20)
clip.write_gif('test.gif', fps=20)

如果您想在Jupyter笔记本中显示该gif图像,则可以在下一个单元格中输入以下内容:

from IPython.display import display, Image
Image('test.gif')

1
你可以使用数组转GIF库array2gif。
这是从文档中提取的示例:
import numpy as np
from array2gif import write_gif

dataset = [
    np.array([
        [[255, 0, 0], [255, 0, 0]],  # red intensities
        [[0, 255, 0], [0, 255, 0]],  # green intensities
        [[0, 0, 255], [0, 0, 255]]   # blue intensities
    ]),
    np.array([
        [[0, 0, 255], [0, 0, 255]],
        [[0, 255, 0], [0, 255, 0]],
        [[255, 0, 0], [255, 0, 0]]
    ])
]
write_gif(dataset, 'rgbbgr.gif', fps=5)

非常感谢,我只想确认一下,它是直接在Jupyter笔记本上显示结果,就像我在上面的图片链接中展示的那样,还是将其保存为GIF? - Eshan Agarwal
它没有显示GIF结果,而是保存在我的本地目录中,您能否提供一些方法直接将其显示为GIF或作为帧包而不是单独的帧? - Eshan Agarwal
我自己不使用Jupyter笔记本,但我看到了这个链接,也许它可以帮助你:https://github.com/ipython/ipython/issues/10045 - Hendrik Evert
是的,我也考虑过这个问题,但我想直接展示结果而不是保存它,无论如何感谢您关注此事。 - Eshan Agarwal
我不知道立即加载的方法,但将其存储在文件中,然后在Jupyter笔记本中加载以显示它应该可以解决。您不想保存文件的原因是什么?否则,我认为这是您最简单的选择。 - Hendrik Evert
是的,你说得对,保存和加载很简单,但是当我调用我的方法时,总是先保存它,然后再读取它,最后才显示出来,这是不必要的。我认为这会占用更多的内存和时间。正如你所看到的,在moving_mnist数据集中有10000个例子。 - Eshan Agarwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接