python - 如何为按时间排序的 matplotlib 图序列制作动画

标签 python image animation image-processing matplotlib

我想在 matplotlib 中绘制一系列 .png 图像。目标是快速绘制它们以模拟电影的效果,但我还有其他原因想要避免实际创建 .avi 文件或保存 matplotlib 图形,然后在 Python 之外按顺序查看它们。

我特别尝试在 Python 的 for 循环内按顺序查看图像文件。假设我已经正确导入了 matplotlib,并且我有自己的函数“new_image()”和“new_rect()”,这里有一些示例代码由于 show() 函数调用 GUI 主循环的阻塞效应而无法工作:

 for index in index_list:
     img = new_image(index)
     rect = new_rect(index)

     plt.imshow(img)
     plt.gca().add_patch(rect)
     plt.show()

     #I also tried pausing briefly and then closing, but this doesn't
     #get executed due to the GUI mainloop from show()
     time.sleep(0.25)
     plt.close()

上面的代码只显示第一张图片,但随后程序挂起并等待我手动关闭生成的图形窗口。一旦我关闭它,程序就会挂起并且不会使用新的图像数据重新绘制。我应该做什么?另请注意,我尝试用 plt.draw() 命令替换 plt.show() 命令,然后在 for 循环之外添加 plt.show()。这不会显示任何内容,只是挂起。

最佳答案

基于 http://matplotlib.sourceforge.net/examples/animation/simple_anim_tkagg.html :

import time
import numpy as np
import matplotlib
matplotlib.use('TkAgg') # do this before importing pylab

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)

def animate():
    tstart = time.time()                   # for profiling
    data=np.random.randn(10,10)
    im=plt.imshow(data)

    for i in np.arange(1,200):
        data=np.random.randn(10,10)
        im.set_data(data)
        fig.canvas.draw()                         # redraw the canvas
    print 'FPS:' , 200/(time.time()-tstart)

win = fig.canvas.manager.window
fig.canvas.manager.window.after(100, animate)
plt.show()

plt.imshow 可以接受 float 组、uint8 数组或 PIL 图像。 因此,如果您有一个 PNG 文件目录,您可以将它们作为 PIL 图像打开并像这样制作动画:

import matplotlib
matplotlib.use('TkAgg') # do this before importing pylab
import matplotlib.pyplot as plt
import Image
import glob

fig = plt.figure()
ax = fig.add_subplot(111)

def animate():
    filenames=sorted(glob.glob('*.png'))
    im=plt.imshow(Image.open(filenames[0]))
    for filename in filenames[1:]:
        image=Image.open(filename)
        im.set_data(image)
        fig.canvas.draw() 

win = fig.canvas.manager.window
fig.canvas.manager.window.after(100, animate)
plt.show()

关于python - 如何为按时间排序的 matplotlib 图序列制作动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686550/

相关文章:

Python 列表分组和求和

animation - 如何为零时间 pyplot pause()?

iPhone 添加惯性/动量物理来为 "wheel of fortune"设置动画,如旋转控制

python - Python 中的反修饰导出函数

python - 使用Python从nltk树结构中提取特定的叶子值

python - 如何解析嵌套json对象的元素?

c++ - Vector<Vec3b> 与 Vector<int> 在 OpenCV 中的区别

image - 如何防止 ImageMagick Convert 放大图像*?

python - scikit-image (io.imread) 返回 float 组,这已经标准化了吗?

ios - 使滑动手势动画化