MulinB按:最近打算好好学习一下几种图像处理和计算机视觉中常用的 global optimization (或 energy minimization) 方法,这里总结一下学习心得。分为以下几篇:
1. Discrete Optimization: Graph Cuts and Belief Propagation
2. Quadratic Optimization : Poisson Equation and Laplacian Matrix
3. Variational Methods for Optical Flow Estimation (本篇)
4. TODO: Likelihood Maximization (e.g., Blind Deconvolution)
3. Variational Methods for Optical Flow Estimation
Optical Flow(光流法)这个词乍一看很能唬住人,啥东东这么高级,是追踪光的流动轨迹吗?没这么玄乎。其实optical flow是一个很朴实的low-level vision的东西,就是每个pixel从一帧图像到另一帧图像的位置偏移(displacement)。如下图所示,
Two Input Frames Optical Flow (Vector Plot) Optical Flow (Color Plot)
上面的color plot,其实是通过一个二维的color wheel将2D的motion vector用颜色show出来,常用的color wheel如下所示(中心点表示横向和纵向的位移都为0,用白色表示):
在上面的例子中,可以看出背景中大多数pixel是往左上方偏移一点(相对于镜头),因此在optical flow中,背景呈现浅蓝色(在color wheel的第二象限)。至于计算optical flow这个东东到底有啥用途,可以说绝对是视频编辑的基石,参见这里(Art of Optical Flow,被墙的可以参看这里的英文原版)有一篇有趣的介绍optical flow在电影编辑中的作用(比如合成《黑客帝国》中的超级慢镜头)。
正是由于其重要的作用,如何计算optical flow从1980s就开始成为计算机视觉的研究热门。早期的计算主要focus在计算subpixel级的displacement,随着视频分辨率的增加,最近的很多算法开始考虑较大的displacement,通常需要先计算帧与帧之间pixel级别的correspondence,然后进行warping后再使用传统算法计算subpixel精度的optical flow结果。至于评测optical flow算法的accuracy,最经典的一个benchmark是Middlebury,但其用于排名的dataset只有12张图,比较容易overfitting,最近两年又出现两个比较popular的benchmark,Sintel和KITTI。
3.1 Classic Framework
我们先从optical flow算法的目的说起。令I(x,y,t)表示在t时刻frame上像素(x,y)处的亮度(或颜色),那么optical flow的目的就是求出在t+1时刻的frame上,该像素相对于原来(x,y)的位移量(u,v),用方程表示即:
其中u和v是未知量。这就是optical flow中著名的Brightness Constancy Model。
不过,数字图像毕竟是离散化pixel by pixel的,如果只给出两帧图像,如何计算出每个pixel的subpixel级的displacement(位移)呢?如果从correspondence的角度去考虑,在frame1中的某个pixel,只能找到其在frame2中对应的pixel整数位置,这样只能得到pixel级的displacement,而无法精确到subpixel精度。在经典的optical flow算法中,一般利用一阶泰勒展开作为工具来建立图像gradient和displacement之间的关系,这一步骤通常被称为Linearization