Lucas–Kanade光流算法

1. 光流法

光流是一种运动模式,这种运动模式指的是一个物体、表面、边缘在一个视角下由一个观察者(比如眼睛、摄像头等)和背景之间形成的明显移动。光流技术,如运动检测和图像分割,时间碰撞,运动补偿编码,三维立体视差,都是利用了这种边缘或表面运动的技术。
二维图像的移动相对于观察者而言是三维物体移动的在图像平面的投影。有序的图像可以估计出二维图像的瞬时图像速率或离散图像转移。
光流算法评估了两幅图像的之间的变形,它的基本假设是体素和图像像素守恒。它假设一个物体的颜色在前后两帧没有巨大而明显的变化。基于这个思路,我们可以得到图像约束方程。不同的光流算法解决了假定了不同附加条件的光流问题。

2. Lucas–Kanade光流算法

在计算机视觉中,Lucas–Kanade光流算法是一种两帧差分的光流估计算法。它由Bruce D. Lucas 和 Takeo Kanade提出。

2.1 假设条件

(1)亮度恒定,就是同一点随着时间的变化,其亮度不会发生改变。这是基本光流法的假定(所有光流法变种都必须满足),用于得到光流法基本方程;

(2)小运动,这个也必须满足,就是时间的变化不会引起位置的剧烈变化,这样灰度才能对位置求偏导(换句话说,小运动情况下我们才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数),这也是光流法不可或缺的假定;

(3)空间一致,一个场景上邻近的点投影到图像上也是邻近点,且邻近点速度一致。这是Lucas-Kanade光流法特有的假定,因为光流法基本方程约束只有一个,而要求x,y方向的速度,有两个未知变量。我们假定特征点邻域内做相似运动,就可以连立n多个方程求取x,y方向的速度(n为特征点邻域总点数,包括该特征点)。

2.2 Lucas–Kanade算法原理

这个算法是最常见,最流行的。它计算两帧在时间t 到t + δt之间每个每个像素点位置的移动。 由于它是基于图像信号的泰勒级数,这种方法称为差分,这就是对于空间和时间坐标使用偏导数。

图像约束方程可以写为:
I ( x , y , z , t ) = I ( x + δ x , y + δ y , z + δ z , t + δ t ) I (x ,y ,z ,t ) = I (x + δx ,y + δy ,z + δz ,t + δt ) I(x,y,z,t)=I(x+δx,y+δy,z+δz,t+δt)
I(x, y,z, t) 为在(x,y,z)位置的体素。

我们假设移动足够的小,那么对图像约束方程使用泰勒公式,我们可以得到:
I ( x + δ x , y + δ y , z + δ z , t + δ t ) = I ( x , y , z , t ) + ∂ I ∂ x δ x + ∂ I ∂ y δ y + ∂ I ∂ z δ z + ∂ I ∂ t δ t + H . O . T . I(x+\delta x,y+\delta y,z+\delta z,t+\delta t) = I(x,y,z,t) + \frac{\partial I}{\partial x}\delta x+\frac{\partial I}{\partial y}\delta y+\frac{\partial I}{\partial z}\delta z+\frac{\partial I}{\partial t}\delta t+H.O.T. I(x+δx,y+δy,z+δz,t+δt)=I(x,y,z,t)+xIδx+yIδy+zIδz+tIδt+H.O.T.
H.O.T. 指更高阶,在移动足够小的情况下可以忽略。
从这个方程中我们可以得到:

∂ I ∂ x δ x + ∂ I ∂ y δ y + ∂ I ∂ z δ z + ∂ I ∂ t δ t = 0 \frac{\partial I}{\partial x}\delta x+\frac{\partial I}{\partial y}\delta y+\frac{\partial I}{\partial z}\delta z+\frac{\partial I}{\partial t}\delta t = 0 xIδx+yIδy+zIδz+tIδt=0

或者

∂ I ∂ x δ x δ t + ∂ I ∂ y δ y δ t + ∂ I ∂ z δ z δ t + ∂ I ∂ t δ t δ t = 0 \frac{\partial I}{\partial x}\frac{\delta x}{\delta t}+\frac{\partial I}{\partial y}\frac{\delta y}{\delta t}+\frac{\partial I}{\partial z}\frac{\delta z}{\delta t}+\frac{\partial I}{\partial t}\frac{\delta t}{\delta t} = 0 xIδtδx+yIδtδy+zIδtδz+tIδtδt=0

进而得到

∂ I ∂ x V x + ∂ I ∂ y V y + ∂ I ∂ z V z + ∂ I ∂ t = 0 \frac{\partial I}{\partial x}V_x+\frac{\partial I}{\partial y}V_y+\frac{\partial I}{\partial z}V_z+\frac{\partial I}{\partial t} = 0 xIVx+yIVy+zIVz+tI=0

Vx,Vy,Vz分别是I(x,y,z,t)的光流向量中x,y,z的组成。 ∂ I ∂ x \frac{\partial I}{\partial x} xI, ∂ I ∂ y \frac{\partial I}{\partial y} yI, ∂ I ∂ z \frac{\partial I}{\partial z} zI ∂ I ∂ t \frac{\partial I}{\partial t} tI则是图像在(x,y,z,t)这一点向相应方向的差分。
所以:

I x V x + I y V y + I z V z = − I t I_xV_x + I_yV_y + I_zV_z= − I_t IxVx+IyVy+IzVz=It

写做:

∇ I T ⋅ V ⃗ = − I t \nabla I^T\cdot\vec{V} = -I_t ITV =It

这个方程有三个未知量,尚不能被解决,这也就是所谓光流算法的光圈问题。那么要找到光流向量则需要另一套解决的方案。而Lucas-Kanade算法是一个非迭代的算法:

假设流(Vx,Vy,Vz)在一个大小为mmm(m>1)的小窗中是一个常数,那么从像素1…n, n = m 3 n = m^3 n=m3中可以得到下列一组方程

I x 1 V x + I y 1 V y + I z 1 V z = − I t 1 I_{x_1} V_x + I_{y_1} V_y + I_{z_1} V_z = -I_{t_1} Ix1Vx+Iy1Vy+Iz1Vz=It1
I x 2 V x + I y 2 V y + I z 2 V z = − I t 2 I_{x_2} V_x + I_{y_2} V_y + I_{z_2} V_z = -I_{t_2} Ix2Vx+Iy2Vy+Iz2Vz=It2
⋮ \vdots
I x n V x + I y n V y + I z n V z = − I t n I_{x_n} V_x + I_{y_n} V_y + I_{z_n} V_z = -I_{t_n} IxnVx+IynVy+IznVz=Itn

三个未知数但是有多于三个的方程,这个方程组自然是个超定方程,也就是说方程组内有冗余,方程组可以表示为:

[ I x 1 I y 1 I z 1 I x 2 I y 2 I z 2 ⋮ ⋮ ⋮ I x n I y n I z n ] [ V x V y V z ] = [ − I t 1 − I t 2 ⋮ − I t n ] \begin{bmatrix}I_{x_1} & I_{y_1} & I_{z_1}\\I_{x_2} & I_{y_2} & I_{z_2}\\\vdots & \vdots & \vdots\\I_{x_n} & I_{y_n} & I_{z_n}\end{bmatrix} \begin{bmatrix}V_x\\V_y\\V_z \end{bmatrix}= \begin{bmatrix}-I_{t_1}\\ -I_{t_2}\\ \vdots \\-I_{t_n}\end{bmatrix} Ix1Ix2IxnIy1Iy2IynIz1Iz2IznVxVyVz=It1It2Itn

记作: A v ⃗ = − b A\vec{v}=-b Av =b

为了解决这个超定问题,我们采用最小二乘法:

A T A v ⃗ = A T ( − b ) A^TA\vec{v}=A^T(-b) ATAv =AT(b)

v ⃗ = ( A T A ) − 1 A T ( − b ) \vec{v}=(A^TA)^{-1}A^T(-b) v =(ATA)1AT(b)

得到:

[ V x V y V z ] = [ ∑ I x i 2 ∑ I x i I y i ∑ I x i I z i ∑ I x i I y i ∑ I y i 2 ∑ I y i I z i ∑ I x i I z i ∑ I y i I z i ∑ I z i 2 ] − 1 [ − ∑ I x i I t i − ∑ I y i I t i − ∑ I z i I t i ] \begin{bmatrix}V_x\\V_y\\V_z \end{bmatrix} =\begin{bmatrix}\sum I_{x_i}^2 &\sum I_{x_i}I_{y_i} & \sum I_{x_i}I_{z_i} \\\sum I_{x_i}I_{y_i} & \sum I_{y_i}^2 & \sum I_{y_i}I_{z_i} \\\sum I_{x_i}I_{z_i} & \sum I_{y_i}I_{z_i} & \sum I_{z_i}^2 \\\end{bmatrix}^{-1}\begin{bmatrix}-\sum I_{x_i}I_{t_i} \\-\sum I_{y_i}I_{t_i} \\-\sum I_{z_i}I_{t_i}\end{bmatrix} VxVyVz=Ixi2IxiIyiIxiIziIxiIyiIyi2IyiIziIxiIziIyiIziIzi21IxiItiIyiItiIziIti

其中的求和是从1到n。

这也就是说寻找光流可以通过在四维上图像导数的分别累加得出。我们还需要一个权重函数 W ( i , j , k ) W(i, j,k) W(i,j,k) i , j , k ∈ [ 1 , m ] i,j,k \in [1,m] i,j,k[1,m]来突出窗口中心点的坐标。

这个算法的不足在于它不能产生一个密度很高的流向量,例如在运动的边缘和黑大的同质区域中的微小移动方面流信息会很快的褪去。它的优点在于有噪声存在的鲁棒性还是可以的。

参考文献:Lucas B and Kanade T. An Iterative Image RegistrationTechnique with an Application to Stereo Vision. Proc. Of 7th InternationalJoint Conference on Artificial Intelligence (IJCAI), pp.674-679.是81年发表的。

opencv中实现的是84年发表的算法,

参考文献:Bruce D. Lucas,“Generalized Image Matching by the Method of Differences,” doctoraldissertation, tech. report , Robotics Institute, Carnegie Mellon University,July, 1984

2.3 算法改进

2.3.1 构建图像金字塔

Jean-Yves Bouguet提出一种基于金字塔分层,针对仿射变换的改进Lucas-Kanade算法。

为什么要用金字塔?因为LK算法的约束条件即:小速度,亮度不变以及区域一致性都是较强的假设,并不很容易得到满足。如当物体运动速度较快时,假设不成立,那么后续的假设就会有较大的偏差,使得最终求出的光流值有较大的误差。构建图像金字塔可以解决大运动目标跟踪,也可以一定程度上解决孔径问题(相同大小的窗口能覆盖大尺度图片上尽量多的角点,而这些角点无法在原始图片上被覆盖)。
考虑物体的运动速度较大时,算法会出现较大的误差。那么就希望能减少图像中物体的运动速度。一个直观的方法就是,缩小图像的尺寸。假设当图像为400×400时,物体速度为[16 16],那么图像缩小为200×200时,速度变为[8,8]。缩小为100*100时,速度减少到[4,4]。所以光流可以通过生成 原图像的金字塔图像,逐层求解,不断精确来求得。简单来说上层金字塔(低分辨率)中的一个像素可以代表下层的两个。

假设I和J是两幅2D的灰度图像,对于图像上每个像素点的灰度值定义为:
I ( x ) = I ( x , y ) I(x)=I(x,y) I(x)=I(x,y) J ( x ) = j ( x , y ) J(x)=j(x,y) J(x)=j(x,y)
其中 x = ( x , y ) x=(x,y) x=(x,y)是图像上像素点的图像坐标。
在实际场景中图像I和图像J可以代表前后两帧图像。对于图像特征点金字塔跟踪来说的目的是:对于前一帧的图像I上一点 u ( u x , u y ) u(u_x,u_y) u(ux,uy),要在后一帧图像J上找到一点 v ( u x + d x , u y + d y ) v(u_x+d_x,u_y+d_y) v(ux+dx,uy+dy)与之相匹配,即灰度值最接近。那么向量 d = [ d x , d y ] d=[d_x,d_y] d=[dx,dy]就是图像在点u处的运动速度,也就是所说像素点u的光流。
对于Lucas-Kanade改进算法来说,主要的步骤有三步:建立金字塔,基于金字塔跟踪,迭代过程。

金字塔的建立

令I0 = I 是第 0 层的图像,它是金字塔图像中分辨率最高的图像,图像的宽度和高度分别定义为nx0 = nx 和 ny0 = ny 。以一种递归的方式建立金字塔:从I0中计算I1,从I1中计算I2 ,···。用一个[0.25 0.5 0.25]的低通滤波器对 I L − 1 I_{L-1} IL1进行卷积。

金字塔跟踪

总体来讲,金字塔特征跟踪算法描述如下:首先,光流和仿射变换矩阵在最高一层的图像上计算出;将上一层的计算结果作为初始值传递给下一层图像,这一层的图像在这个初始值的基础上,计算这一层的光流和仿射变化矩阵;再将这一层的光流和仿射矩阵作为初始值传递给下一层图像,直到传递给最后一层,即原始图像层,这一层计算出来的光流和仿射变换矩阵作为最后的光流和仿射变换矩阵的结果。

用L+1层得到的最初估计gL对L层作预平移,L层在gL的基础上求该层的光流dL,这样求得的残余光流向量 d L = [ d L x , d L y ] T dL= [d_{Lx}, d_{Ly}]^T dL=[dLx,dLy]T就足够小,因此能够通过标准的光流法来求出这个运动矢量。然后得到的dL结合gL又可以对L-1层的gL-1做估计。最终的光流和就是在所有层的分段光流d的叠加。使用金字塔图像计算光流的一个明显的好处是,对于一个有着较大的像素偏移的矢量d,可以通过计算几个比较小的残余光流来得到。这里就是金字塔跟踪算法的核心。

这种算法最明显的优势在于对于每一层的光流都会保持很小,但是最终计算来的光流可以进行累积,便于有效地跟踪特征点。

迭代过程

在金字塔的每一层,通过迭代计算出光流dL和仿射变换矩阵AL从而使误差ξL最小。

2.3.2 引入权重

在一个小的邻域内,我们通过对下式的加权平方和最小化来估计V:

Lucas–Kanade光流算法_第1张图片
Lucas–Kanade光流算法_第2张图片
Lucas–Kanade光流算法_第3张图片

2.3.3 特征点选择
为了使得$(ATA){-1} $稳定,需要该矩阵的两个特征值不能太小,所以在构建KL方程时可以只挑选合适的特征点(角点)进行计算:

1、计算图像 I 中每一个像素的矩阵G和最小特征值λm。
2、寻找整副图像中最小特征值 λm 中的最大特征值λmax。
3、保留最小特征值 λm 大于给定阈值的像素点。阈值通常取 0.05 λ m a x − 0.01 λ m a x 0.05λ_{max} - 0.01 λ_{max} 0.05λmax0.01λmax
4、保留 λm 局部最大值的像素:像素特征值 λm 大于其33 邻域中其他像素的特征值 λm 。
5、剔除像素密集区域中的一些像素,确保图像中相邻像素的距离都大于给定的阈值(常取5~10 pixels)。
上述操作完成后,图像 I 中剩下的像素即为选择的特征点,并作为跟踪特征点。特征点选择算法的步骤5 确保了特征点间的最小距离。
没有必要取一个大的综合窗口选择特征点(或计算矩阵G)。大量实验证明,wx = wy =1的 3
3 大小的综合窗口能够取得满意的效果。

参考博文:

Lucas-Kanade光流法

目标跟踪之Lukas-Kanade光流法

Lucas–Kanade光流算法_第4张图片
Lucas–Kanade光流算法_第5张图片

你可能感兴趣的:(图像处理)