在前面的章节中,我讲了很多图像变换中的基本操作:图像滤波,包括空域滤波和频域的滤波。今天来给大家分享一个非常有意思的图像滤波的应用:运动滤波。这里我们会看到计算摄影中图像的像素操作的新奇的应用,而且由于今天所讲述的操作对象是视频,因此我还会学习到图像的时域操作。我相信随着5G时代的到来,视频处理会越来越重要,这一篇文章能够给大家带来一些视频处理的灵感。
一、延时摄影
人们通常用摄影设备来捕捉真实的世界,而真实的世界中每时每刻都在上演千变万化的事件。从图像所记录的事件的时间尺度上来区分,我们既能记录发生在毫秒级别的事件,例如子弹离开枪口的瞬间,也能够记录长达数月甚至数年的变化,例如城市的卫星图像的变化,地球表面的变化,也有一些常规的事件发生在数秒钟或者数分钟内,例如脉搏的跳动,人的呼吸,等等。下图总结了一些常见的时间尺度中发生的事件:
对一个场景进行长时间的定时拍摄,这种方式叫做延时摄影(Time-Lapse Video)。一般来说,会间隔数分钟或者数小时拍摄一帧,并延续很长时间,例如数周,数月。而拍摄的帧通常会合成为一个视频,用于展现出场景的长期变化。人们使用延时摄影的场景丰富多样,例如建筑物的变化,人随着年龄的变化,或者是地理变化,等等。随着消费电子技术的发展,现在普通人凭着自己手上的设备也能够拍摄延时摄影作品了。
然而,不管是什么场景,什么设备拍摄的延时视频,通常都有同样的特征:场景的长期变化和短期的变化(例如光线变化、摄像机的抖动等)混杂在一起,而短期的变化又表现为视频的震颤抖动,经常会干扰人们对最感兴趣的变化的关注。
下面大家可以看到一些例子视频,可以看到画面充满着抖动,这样的视频看起来让人很不舒服。
延时摄影画面充满抖动,例1
二、运动去噪
很多时候,场景的长期的变化对我们来说才是最有用的,此时人们会很想从录制的视频或图片组中过滤掉短期的、无用的变化,保留甚至增强长期的变化,以观察出该场景的变化趋势。这时候,一种叫做运动去噪(Motion Denoise),我也称之为运动滤波的技术也就应运而生了。
来看看一个演示Demo, 左边是原始视频,右边是去除短时变化后的视频
运动滤波示例
这是如何做到的呢?这就是我今天提到的运动滤波技术的作用。
我们先来看一个延时拍摄的视频,可以明显看到植物逐渐的生长的过程,但是也能明显看到短期内叶片等在剧烈的晃动,这使得我们无法集中精力在植物的生长上。
植物生长的原始视频
联想到我们之前学过的图像滤波的知识,你会怎么做来去除这些短期的晃动呢?我想你肯定想到了之前提到的一些图像滤波技术,例如高斯滤波,或者Box滤波。是的,传统上进行动作滤波的方式是逐像素的进行时域上的低通滤波,一般会采用时间域上的滑动窗口来进行,这样就会滤除掉时域上的短期的、高速的变化。
我们的输入是一个M x N x T的视频I(x,y,t),输出也是一个M x N x T的视频J(x,y,t)。可以将单纯的时域滤波表示为如下公式,其中f是滤波操作
这种方式有一点点平滑的作用,但它也会带来明显的问题,即不同物体的像素也被平均掉了,因此结果很难看:
naive的时域滤波带来的问题
也有人提出,对图像的特征点进行跟踪,观察它在每一帧的变换,获取到图像每个局部的变换模式,并利用这种模式进行平滑。然而,在实际场景中跟踪大量的特征点几乎是不可能的,因为不同帧之间亮度可能会有变换,特征点的动作也是不连续的,你可以通过下面的视频看的特征点的运动是非常杂乱无章的。
大量特征点的跟踪很难做到
因此,有很多人在研究这个领域,希望找出更好的方式来进行运动滤波。而今天我讲的是Michael Rubinstein等人在2011 CVPR中发表的文章:Motion Denoising with Applicaition to Time-Lapse Photography
这篇文章对上述问题的处理方式为:
- 将图像中的动作分解为短时间的变动,以及长时间的变动。
- 滤除短时间的变动,增强长时间的变动。
这篇文章的效果非常惊人,大家可以看看下面的视频:
运动滤波示例
这篇文章有一个基本的假设,即
场景是缓慢变化的,有时候会被随机的动作变换所干扰
因此,作者提出可以在时间和空间上构成滑动窗口,并在窗口内对图像中进行平滑,下图是作者提到的“时空窗口”示意,黑色点是需要计算的像素点,计算是在一个时间帧和空间区域构成的立方体上进行的。
作者认为视频在空间和时间上都有高度的冗余性,因此输出视频中的每一个像素其实都是从输入视频中的不同帧和不同空间位置的领域上获取的。
作者还认为输出的帧帧和输入的原始帧之间,以及输出的视频帧之间具有高度的平滑性,这种平滑性可以表示为一个能量函数,如果我们最优化这个能量函数,就可以求得输出的视频帧。可以用一个公式来定义上面的想法:
这个式子的第一项表征时空窗口中输出帧和输入帧之间的相似性,第二个式子则表征输出帧与帧之间的平滑性。
正如前面所讲,输出视频中的每一个像素都能够从输入视频的不同帧不同空间位置中找到,因此将输出视频表达为:
其中,w是作者称为的displacement field(位移场),它的三个分量分别表示位于(x,y,t)的像素点在x,y方向以及时间帧方向上的位移。
作者认为输出视频是输入视频通过其位移场变换而来,例如如果某个时刻t有一个像素点p=(x, y, t), 且这个像素对应的位移场是w(p),那么可以通过I(p w(p))得到其输出像素。
作者进一步展开E的表达式并进行一些变量替换,得到如下的能量E的表达式:
这个式子的每一项解释如下:
- 第1项表征保真度,说明输出视频是通过输入视频位移而来,要求输出视频和输入视频高度相似
- 第2项表征时域相似性,说明输出的帧在时空窗口内具有局部平滑性
- 第3项是正则项,说明像素的位移场具有局部平滑性
为了得到输出视频,就需要求得输入视频所对应的位移场w。而要求得w,则需要最小化E(w), 这样这个问题就被转换为了一个最优化的问题。这里,由于每个像素在空间和时间上都有相关关系,所以作者在3D MRF空间上进行了最优化:
下面我们比较了输入视频和输出视频,可以看到当前这种方法在空域和频域上都对像素做了位移。下面视频中,可以看到每个像素都有不同的空间位移量和时间位移量。
运动滤波:时空位移场
将这种方法与传统的其他方法做对比,可以很明显看到它的优势:
运动滤波 vs Naive时域滤波
如果在XT方向截取一个平面,我们期望的滤波结果是某个物体的位置经过运动滤波后其在X轴上的位置随时间t保持不变,或仅仅做轻微的变化。下图比较了Motion Denoise和基本的时域均值滤波、时域中值滤波的效果差别。
运动滤波 vs Naive时域滤波
运动滤波 vs Naive时域滤波
作者还给出了更多的例子,说明此方法能够很好的分离延时摄影视频中的短时抖动与长期变化。由于知乎这里仅仅能上传10个视频,我只能再列出一个例子。大家感兴趣可以从我后面列出的参考链接中去看。
分离短期抖动与长期变化
关于计算性能
我想有的朋友看到现在已经非常兴奋了,甚至想将此算法开发成实际的应用了。
这里我将原文作者的实验过程中的一些性能数据罗列如下,让大家知道将这个算法转换为实际的工程应用还需要很多努力才行。
作者所用的机器配置:
- 四核Intel Xeon 2.66GHz
- 28GB RAM
- 硬盘为Intel X-25M SSD
软件实现方式:CPU 版本 C 代码
作者处理的原始视频尺寸为
,搜索窗口为
实际消耗资源约:
- 内存:1GB
- 硬盘:不超过50GB
- 时间:50小时
三、总结
今天通过这篇文章我们粗浅的了解了“运动滤波”,这是计算摄影学这个领域里面图像的像素处理的一个有趣而且重要的应用。我们知道了图像处理不仅仅可以在二维空间中进行,而且还可以对时域进行,甚至可以对XYT三维空间进行。
我想原论文作者的CVPR Poster已经非常清晰的总结了该研究的精髓,因此我将Poster中最核心的部分罗列如下:
- 要解决的问题:延时摄影的抖动问题
解决方案的特点:
- 不需进行任何运动分析
- 能够分离长时间的运动变化和短时间的视频抖动,并通过去除短时间的抖动和增强长期的变化,从而平滑视频
- 问题建模:假设输出视频中的每个像素通过其对应的输入视频在位移场中位移得到,并且假设长时间的运动变化使得位移场所影响的视频帧间具备某种平滑性
- 视频重合成:该方法通过最优化思想求得位移场后,对输入帧用位移场进行位移获取到对应的输出帧,并将输出帧进行合成,从而得到新的视频。这种方法能得到远好于最基础的时域图像滤波技术处理的视频。
参考资料:
这一篇文章的绝大部分素材来自于以下几份资料:
- Michael Rubinstein: Thesis Defense for Analysis and Visualization of Temporal Variations in Video
- Michael Rubistein: Analysis and Visualization of Temporal Variations in Video(PDF)
- CVPR2011 Poster: Motion Denoising with Application to Time-lapse Photography
- Analysis and Visualization of Temporal Variations in Video (Author Homework)