光流(Optical Flow)介绍

绝大部分摘自光流Optical Flow介绍与OpenCV实现光流法介绍

光流是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。

1981年,Horn和Schunck创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法。人们基于不同的理论基础提出各种光流计算方法,算法性能各有不同。Barron等人对多种光流计算技术进行了总结,按照理论基础与数学方法的区别把它们分成四种:基于梯度的方法、基于匹配的方法、基于能量的方法、基于相位的方法。近年来神经动力学方法也颇受学者重视。

在比较理想的情况下,它能够检测独立运动的对象,不需要预先知道场景的任何信息,可以很精确地计算出运动物体的速度,并且可用于摄像机运动的情况。

但光流法存在下面的缺点:有时即使没有发生运动,在外部照明发生变化时,也可以观测到光流;另外,在缺乏足够的灰度等级变化的区域,实际运动也往往观测不到。三维物体的运动投影到二维图像的亮度变化,本身由于部分信息的丢失而使光流法存在孔径问题和遮挡问题,用光流法估算二维运动场是不确定的,需要附加的假设模型来模拟二维运动场的结构;在准确分割时,光流法还需要利用颜色、灰度、边缘等空域特征来提高分割精度;同时由于光流法采用迭代的方法,计算复杂耗时,如果没有特殊的硬件支持,很难应用于视频序列的实时检测。

光流方程

假设$E(x,y,t)$为$(x,y)$点在时刻t的灰度(照度)。设$t+dt$时刻该点运动到$(x+dx,y+dy)$点,他的照度为$E(x+dx,y+dy,t+dt)$。我们认为,由于对应同一个点,所以
$$E(x,y,t) = E(x+dx,y+dy,t+dt) \,\,\,\,\,\,\,(光流约束方程)$$
将上式右边做泰勒展开,并令$dt->0$,则得到 $Exu+Eyv+Et = 0$,其中:
$$Ex = \dfrac{dE}{dx} \,\,\,\, Ey = \dfrac{dE}{dy} \,\,\,\, Et = \dfrac{dE}{dt} \,\,\,\, u = \dfrac{dx}{dt} \,\,\,\, v = \dfrac{dy}{dt} $$
上面的Ex,Ey,Et的计算都很简单,用离散的差分代替导数就可以了。光流法的主要任务就是通过求解光流约束方程求出u,v。如果用于摄像机固定的这一特定情况,问题可以大大简化。

摄像机固定的情形

在摄像机固定的情形下,运动物体的检测其实就是分离前景和背景的问题。对于背景,理想情况下,其光流应当为0,只有前景才有光流。所以并不要求通过求解光流约束方程求出u,v。只要求出亮度梯度方向的速率$sqrt(u*u+v*v)$即可。
由光流约束方程得到到梯度方向的光流速率为 $V = abs(\dfrac{Et}{sqrt(Ex*Ex+Ey*Ey)})$。
设定一个阈值T,若$V(x,y) > T$ 则$(x,y)$是前景 ,反之是背景。

Munsell颜色系统

光流场是图片中每个像素都有一个x方向和y方向的位移,所以在上面那些光流计算结束后得到的光流flow是个和原来图像大小相等的双通道图像。可以用Munsell颜色系统来显示。

孟塞尔颜色系统的空间大致成一个圆柱形:

南北轴=明度(value),从全黑(1)到全白(10)。
经度=色相(hue)。把一周均分成五种主色调和五种中间色:红(R)、红黄(YR)、黄(Y)、黄绿(GY)、绿(G)、绿蓝(BG)、蓝(B)、蓝紫(PB)、紫(P)、紫红(RP)。相邻的两个位置之间再均分10份,共100份。
距轴的距离=色度(chroma),表示色调的纯度。其数值从中间(0)向外随着色调的纯度增加,没有理论上的上限(普通的颜色实际上限为10左右,反光、荧光等材料可高达30)。由于人眼对各种颜色的的敏感度不同,色度不一定与每个色调和明度组合相匹配。

具体颜色的标识形式为:色相+明度+色度。

参考文献

[1]Pyramidal Implementation of the Lucas Kanade Feature TrackerDescription of the algorithm
通过金字塔Lucas-Kanade 光流方法计算某些点集的光流(稀疏光流)。

[2]Two-Frame Motion Estimation Based on PolynomialExpansion”
用Gunnar Farneback 的算法计算稠密光流(即图像上所有像素点的光流都计算出来)。

[3]通过块匹配的方法来计算光流。

[4]Determining Optical Flow
用Horn-Schunck 的算法计算稠密光流。

SimpleFlow: A Non-iterative, Sublinear Optical FlowAlgorithm
这一个是2012年欧洲视觉会议的一篇文章的实现

IJCV2011有一篇文章,《A Database and Evaluation Methodology for Optical Flow》里面对主流的光流算法做了简要的介绍和对不同算法进行了评估。