基于Python的GIF动图制作
- 前言
- 基于imageio的GIF生成
- 关于imageio
- 基于imageio生成GIF实战
- 椭圆形方程数值解法
- GIF生成
前言
前一段时间在做神经网络训练时最终的拟合训练过程想用GIF表示出来,但是网上的GIF MAKER比较麻烦不想用,手里只有上百张图片,这要怎么办呢,总不能PPT一张一张拖进去吧,因此想要用我们熟悉的Python来完成这个任务。
基于imageio的GIF生成
关于imageio
我们大多数时间使用Python其实只需要最终的图片结果,因此对matplotlib库的接触了解比较多,很少听过imageio库,那么imageio库是用来干嘛的呢:
- Python专门用来处理图片的第三方库,在matplotlib用来产生图片的同时,imageio用来高效处理图片。
- 可以有效处理各种静态格式,BMP、JPG、PNG,甚至占据存储空间极大的PPM也可以轻松处理。
- 我们最期待的GIF动图模式也可以轻松拿捏,作为编程语言,相较于百度而来的软件,自己用着放心。
- 命令极其简单,上手仅需十分钟。
基于imageio生成GIF实战
之前的博客中我详细讲解了椭圆形偏微分方程从离散到算法的数值解法过程,最终也给出了源码,大家可以很直观的感受到最终得到了板凳形的稳态形状,但这样就够了吗,我们是不是还要了解一下它的动态过程,在给定初始条件下,这个物理过程是怎么演化的呢,以下给出答案:
椭圆形方程数值解法
我们先把偏微分方程数值解简单过一下:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
for iteration in range(100):
for i in range(1,100):
for j in range(1,100):
u[i,j] = w/4 * (u[i-1,j] + u[i+1,j] + u[i,j-1] + u[i,j+1]) + (1-w) * u[i,j]
xl = np.linspace(0, 1, 101)
yl = np.linspace(0, 1, 101)
X, Y = np.meshgrid(xl, yl)
fig = plt.figure(iteration)
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, u, cmap=plt.cm.Blues)
fig.colorbar(surf, shrink=0.5)
plt.savefig(str(iteration) + '.png')
相较于之前博客中所描述的不同之处在于,我们每一时间步长都要生成一次结果图,并通过plt.savefig
命令将其保存,这样我们就得到了想要被合称为GIF的原始静态图片。
GIF生成
下面就是最重要而且简便的GIF生成阶段:
import imageio
先引入第三方库,安装直接cmd命令行
输入pip install imageio
即可。
def compose_gif():
img_paths = [str(i) + '.png' for i in range(100)] #+ ['0'+str(j)+'.png' for j in range(10,50)]
gif_images = []
for path in img_paths:
gif_images.append(imageio.imread(path))
imageio.mimsave("process.gif",gif_images,fps=10)
之后直接构造一个GIF生成函数compose_gif()
,首先引入图片地址,按照之前生成的PNG格式与命名方式引入即可,之后生成包含所有静态图片的gif_images
列表,最终通过.mimsave
命令将图片列表生成名为process.gif
的动态图,其中fps
表示的是我们所想要的GIF帧率。
compose_gif()
最终直接调用该函数,完成GIF生成过程,下面上结果:
(由于单张图片上传有大小限制,只能将图片处理成上述情况,有点小但也可以看清)。
由此我们即完成了显示由初始时刻到终止时刻偏微分方程解的变化情况。