from PIL import Image, ImageSequence
import numpy as np
def load_frames(image: Image, mode='RGBA'):
return np.array([
np.array(frame.convert(mode))
for frame in ImageSequence.Iterator(image)
])
with Image.open('animated.gif') as im:
frames = load_frames(im)
2条答案
按热度按时间csbfibhn1#
使用Pillow的代码效率非常低!
Image
与Numpy's array interface兼容,因此转换代码会使事情变得复杂。我将使用下面的帮助器将帧放入Numpy数组中:
这和其他的运行时间基本上是一样的。例如,我有一个400 X400像素,21帧,GIF,它需要MimRead ~ 140 ms,而枕头需要~ 130 ms。
更新:我刚刚玩过CV 2,注意到它的“挂钟”时间更好(即您所测量的时间),因为它在其他线程中工作。例如,如果我使用Jupyter
%time
magic运行,我会得到以下输出:图像IO
脉冲激光
CV 2型
也就是说,虽然它在90毫秒内完成了循环,但它总共使用了大约4.5倍的CPU时间。
因此,如果您对完成单个大图像所需的时间感兴趣,您可能希望使用CV 2。但如果您要批处理大量图像,我建议在多处理
Pool
中使用Pillow。o2gm4chl2#
这似乎是在每个库中加载GIF的标准方式:
超过250个GIF,结果如下:
OpenCV的速度是imageio的两倍,imageio比PIL快15倍(无论如何,使用我的方法)。