光流是环境中物体和照相机发生相对移动,物体投影在图像或者视网膜上的运动轨迹,即像素的移动。我们期望通过分析图像序列中像素变化来计算环境中物体和照相机所发生的相对运动轨迹。
光流有一个前提假设:图像采集的时间间隔很小,因此,图像中某点像素的位置变化范围较小。且该点像素位置变化前后,其像素值保持不变。即:
I(x,y,t)=I(x+Δx,y+Δy,t+Δt)
其中,
Δx和
Δy表示像素在
x和
y轴方向上的位移。
I(x+Δx,y+Δy,t+Δt)在
(x,y,t)处的泰勒展开为:
I(x+Δx,y+Δy,t+Δt)=I(x,y,t)+ΔxIx+ΔyIy+ΔtIt+H.O.T
其中,
Ix=∂x∂I,
Iy=∂y∂I,
It=∂t∂I,
H.O.T表示泰勒级数中的高阶项(
highorderterms)。结合上两式,可得:
ΔxIx+ΔyIy+ΔtIt+H.O.T=0
在精度要求不高的情况下,可以将上式中的高阶项去掉。左右除以
Δt后,得:
uIx+vIy+It=0
其中,
u=ΔtΔx,
v=ΔtΔy,分别表示像素在
x和
y轴方向上的速率。上式中,
u和
v为未知量,
Ix、
Iy和
It均可由图像序列计算出来(本文末尾会给出)。因此,对于上式单约束却含有两个未知量,我们是无法确切计算出每个像素的光流,即速度
(u,v)。为了解决这个问题,我后续会介绍Horn-Schunck光流算法和Lucas-Kanade算法,通过增加约束来计算每个像素的光流
(u,v)。
对于
Ix、
Iy和
It的计算,可以参考Horn和Schunck在1981年发表的论文
Determining Optical Flow中的计算方法。如下:
Ix≈Iy≈Ix≈41{Ii,j+1,k−Ii,j,k+Ii+1,j+1,k−Ii+1,j,k+Ii,j+1,k+1−Ii,j,k+1+Ii+1,j+1,k+1−Ii+1,j,k+1},41{Ii+1,j,k−Ii,j,k+Ii+1,j+1,k−Ii,j+1,k+Ii+1,j,k+1−Ii,j,k+1+Ii+1,j+1,k+1−Ii,j+1,k+1},41{Ii,j,k+1−Ii,j,k+Ii+1,j,k+1−Ii+1,j,k+Ii,j+1,k+1−Ii,j+1,k+Ii+1,j+1,k+1−Ii+1,j+1,k}.
其中,
i、
j和
k分别表示图像
y轴、
x轴和时序
t的方向,如下图所示。
计算光流,除了文中提到的属于梯度约束范畴的Horn-Schunck光流算法和Lucas-Kanade算法,还有包括相位相关、模版匹配等方法。