动的图


这几天,看到很多留言中的提问,都是关于推文中显示数据“动图”是如何制作的:


希望卓老师可以发一个制作这些动图的推文(可能要求有点过分)


实际上,制作动图(GIF)文件很并不复杂,使用Photoshop, GifGear等软件便可以制作,也有很多在线生成GIF文件的网站,也可以使用Python中的PIL软件包生成GIF文件。


前面推文中的GIF文件使用了GIFGear软件,将序列图片转换成动图。该软件具有很多的编辑功能,优化功能,使用起来比较灵活。


使用PYTHON生成数据曲线,然后存盘得到图片序列


在之前“动图是如何做成的?”推文中已经介绍了相关的动图制作方法。制作推文中的动图,除了有相应的制作工具之外,还需要考虑到两个因素:

(1)动图所需要的图片如何生成?

(2)如何有效压缩GIF文件的大小。在微信推文中,所能使用的GIF文件大小小于2M字节,图片序列个数小于300。


生成动图所需要的图片,可以通过MATLAB,PYTHON对绘制的数据曲线图片直接存盘即可。也可使用抓屏软件对屏幕上任意区域切割存盘,抓屏软件可以利用屏幕上的录像生成对应的图片序列。



以前推文中的图片是通过TEASOFT软件完成对屏幕中多个区域进行动态存盘实现的。


对于有效减少GIF文件大小,则决定了是否可以用于推文中的关键。在下面介绍减少GIF文件的主要技术:减少文件尺寸、减少颜色版颜色数量、使用帧间差


下面通过一个实际动图例子来介绍。通过TEASOFT进行抓屏获得实验录像的85帧序列图片。使用GIFGear软件将其转换成动图。



实验内容是测试车模在新的信标灯结构下是否可以安全通过,而不撞坏信标灯。


如果直接使用GIFGear将采集到的85帧图片,大小为944×471,生成GIf文件,大小为3.83M,超出了推文所允许的文件大小。


可以通过减少动图的颜色来缩小文件的大小。下面是不同调色板中颜色的数量对应文件的大小。



只有当颜色减少到8色的时候,文件大小才降到1.7M。此时图像的彩色信息丢失很多了。


只有8个颜色的GIF图


第二种方法,是将图片的尺寸减少。比如上图缩小到480×239文件大小为1.4M。这个尺寸的动图适合在手机上阅览。


尺寸缩小到480*239的GIF图


对于动图的另外一种合适压缩的方法,就是采用帧差方法,它利用了序列图片之间的相似冗余性来压缩文件。在GIFGear中提供了优化的方式。它是将相邻两帧图片进行相减,如果相邻两帧图片比较接近,则相减之后,图片大部分为0,再进行游程压缩编码时就可以大大提高压缩的效果。


下面显示了前面动图的原图和相减之后的帧差图。


原图和帧差图


对于使用MATLAB,PYTHON绘制的数据曲线图,使用帧差方法进行图片压缩可以取得非常好的效果。这些图大部分的区域都是白色,相对静止。使用帧差方法可以获得10倍以上的压缩效果。


对于前面采集到的实际录像图片,使用帧差方法则会遇到困难。一是镜头可能会抖动,二是摄像头拍摄到的图片有噪声。


为此,需要对采集到的图片进行消抖处理,使得图片背景相对固定,达到固定摄像头拍摄的效果。下图是对前面的图片进行消抖之后的效果。


消抖后的GIF,文件大小为1.932M


为了消除图片中的噪声,还需要对相邻两张图片进行像素冻结。设定一个阈值,比如55, 当前后两帧图片在同一位置处的像素差值小于该阈值,就将前帧图片像素拷贝到后一帧。这样可以将图片中的噪声滤除。


通过上述两种方法处理之后,在使用帧差方法进行压缩。下图的文件大小仅仅有680k字节。比起仅仅之前的3.8M文件缩小了6倍。


消抖,冻结后的GIF。文件大小为680k


对于图片序列进行消抖和冻结使用了TEASOFT软件的编辑功能实现的。


另外,上文中的动图内容显示了新款的信标灯允许车模越过的情况。