光流法是一种根据时域上连续图像间的相关性来描述像素在前后两帧中的瞬时速度的方法,可用来完成特征点的追踪。稀疏(Lucas–Kanade,LK)光流算法是计算机视觉中常用的一种两帧间差分的光流估计算法。
LK光流法不是没有条件限制的,它的应用必须基于以下三个假设:
1.灰度不变假设:在不同图像的重叠区域中,重叠像素点的灰度值是恒定不变的。这是光流法进行数学原理推导的基本。
2.小运动:运动比较轻微时,像素位置随时间的变化不会过于剧烈。此时,前后两帧间位置的变化导致的灰度值变化可以近似为灰度对位置的偏导数。
3.空间一致性:真实场景中相邻的区域即使投影到二维图像中,仍然是相邻的图像区域。此区域中,邻近点的速度是相同的。这个假设是很有必要的,因为LK光流法要求取x,y(x和y都是未知数)方向上的速度。一个方程无法求解两个未知数,所以可以根据空间一致性假设,利用n个临近像素点联立n方程,通过最小二乘法给出最终结果。
假设获取上一帧和下一帧图像的时间分别为 t t t 和 t + d t t+dt t+dt,某像素点在上一帧和下一帧的位置分别为 I ( x , y , z , t ) I(x,y,z,t) I(x,y,z,t)和 I ( x + d x , y + d y , z + d z , t + d t ) I(x+dx,y+dy,z+dz,t+dt) I(x+dx,y+dy,z+dz,t+dt)。
根据灰度不变假设得,
I ( x , y , z , t ) = I ( x + d x , y + d y , z + d z , t + d t ) I(x,y,z,t)=I(x+dx,y+dy,z+dz,t+dt) I(x,y,z,t)=I(x+dx,y+dy,z+dz,t+dt)
根据小运动假设,对上式进右侧行泰勒级数展开,
I ( x + d x , y + d y , z + d z , t + d t ) = I ( x , y , z , t ) + ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ z d z + ∂ I ∂ t d t I(x+dx,y+dy,z+dz,t+dt)=I(x,y,z,t)+\frac{\partial I}{\partial x}dx+\frac{\partial I}{\partial y}dy+\frac{\partial I}{\partial z}dz+\frac{\partial I}{\partial t}dt I(x+dx,y+dy,z+dz,t+dt)=I(x,y,z,t)+∂x∂Idx+∂y∂Idy+∂z∂Idz+∂t∂Idt
根据以上两式可得,
∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ z d z + ∂ I ∂ t d t = 0 \frac{\partial I}{\partial x}dx+\frac{\partial I}{\partial y}dy+\frac{\partial I}{\partial z}dz+\frac{\partial I}{\partial t}dt=0 ∂x∂Idx+∂y∂Idy+∂z∂Idz+∂t∂Idt=0
上式两边同时除以 d t dt dt,且令 d x d t = V x \frac {dx}{dt}=V_x dtdx=Vx , d y d t = V y \frac {dy}{dt}=V_y dtdy=Vy, d z d t = V z \frac {dz}{dt}=V_z dtdz=Vz得,
∂ 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 ∂x∂IVx+∂y∂IVy+∂z∂IVz+∂t∂I=0
在二维图像中,可以忽略 z z z,只需保留 x , y , t x, y, t x,y,t 即可,其中 ∂ I ∂ x \frac{\partial I}{\partial x} ∂x∂I , ∂ I ∂ y \frac{\partial I}{\partial y} ∂y∂I , ∂ I ∂ t \frac{\partial I}{\partial t} ∂t∂I 可表示为图像在 ( x , y , t ) (x, y, t) (x,y,t)方向的差分,令 ∂ I ∂ x = I x \frac{\partial I}{\partial x}=I_x ∂x∂I=Ix, ∂ I ∂ y = I y \frac{\partial I}{\partial y}=I_y ∂y∂I=Iy, ∂ I ∂ t = I t \frac{\partial I}{\partial t}=I_t ∂t∂I=It,上式可写为如下形式:
I x V x + I y V y = − I t I_xV_x+I_yV_y=-I_t IxVx+IyVy=−It
现在有两个未知数,却只有一个方程,所以根据空间一致性假设,选取 3 × 3 3\times3 3×3窗口内的9个像素点联立,建立方程式,如下,
[ I x 1 I y 1 I x 2 I y 2 ⋮ ⋮ I x 9 I y 9 ] [ V x V y ] = [ − I t 1 − I t 2 ⋮ − I t 9 ] \left[\begin{matrix}I_{x1} & I_{y1}\\I_{x2} & I_{y2}\\\vdots & \vdots\\I_{x9} & I_{y9}\end{matrix}\right]\left[\begin{matrix}V_x\\V_y\end{matrix}\right]=\left[\begin{matrix}-I_{t1}\\-I_{t2}\\\vdots\\-I_{t9}\end{matrix}\right] ⎣⎢⎢⎢⎡Ix1Ix2⋮Ix9Iy1Iy2⋮Iy9⎦⎥⎥⎥⎤[VxVy]=⎣⎢⎢⎢⎡−It1−It2⋮−It9⎦⎥⎥⎥⎤
令 A = [ I x 1 I y 1 I x 2 I y 2 ⋮ ⋮ I x 9 I y 9 ] A=\left[\begin{matrix}I_{x1} & I_{y1}\\I_{x2} & I_{y2}\\\vdots & \vdots\\I_{x9} & I_{y9}\end{matrix}\right] A=⎣⎢⎢⎢⎡Ix1Ix2⋮Ix9Iy1Iy2⋮Iy9⎦⎥⎥⎥⎤, V = [ V x V y ] V=\left[\begin{matrix}V_x\\V_y\end{matrix}\right] V=[VxVy], b = [ − I t 1 − I t 2 ⋮ − I t 9 ] b=\left[\begin{matrix}-I_{t1}\\-I_{t2}\\\vdots\\-I_{t9}\end{matrix}\right] b=⎣⎢⎢⎢⎡−It1−It2⋮−It9⎦⎥⎥⎥⎤,所以,这是超定方程,采用最小二乘法得,
A T A V = A T b A^TAV=A^Tb ATAV=ATb
V = ( A T A ) − 1 A T b V=(A^TA)^{-1}A^Tb V=(ATA)−1ATb
[ V x V y ] = [ ∑ I x i 2 ∑ I x i I y i ∑ I x i I y i ∑ I y i 2 ] − 1 [ ∑ I x i I t i ∑ I y i I t i ] \left[\begin{matrix}V_x\\V_y\end{matrix}\right]=\left[\begin{matrix}\sum I^2_{xi} & \sum I_{xi}I_{yi}\\ \\\sum I_{xi}I_{yi} & \sum I^2_{yi}\end{matrix}\right]^{-1}\left[\begin{matrix}\sum I_{xi}I_{ti}\\ \\\sum I_{yi}I_{ti}\end{matrix}\right] [VxVy]=⎣⎡∑Ixi2∑IxiIyi∑IxiIyi∑Iyi2⎦⎤−1⎣⎡∑IxiIti∑IyiIti⎦⎤
至此,该点的光流解算完毕。
LK光流法第二条假设针对的是小运动,如果运动速度较快时,该算法误差较大,而基于金字塔分层的LK光流法很好的解决了这一问题。
有两帧灰度图像 I I I和 J J J, I ( x , y ) I(x,y) I(x,y)和 J ( x , y ) J(x,y) J(x,y)分别为图像 I I I和 J J J上 [ x , y ] [x,y] [x,y]位置处的灰度值。设图像 I I I的像素点 u = [ u x , u y ] T u=[u_x,u_y]^T u=[ux,uy]T匹配到图像 J J J上的像素点 v = u + d = [ u x + d x , u y + d y ] T v=u+d=[u_x+d_x,u_y+d_y]^T v=u+d=[ux+dx,uy+dy]T,可使得 I ( u x , u y ) I(u_x,u_y) I(ux,uy)和 J ( u x + d x , u y + d y ) J(u_x+d_x,u_y+d_y) J(ux+dx,uy+dy)误差最小。位移 d = [ d x , d y ] T d=[d_x,d_y]^T d=[dx,dy]T被称为 u u u和 v v v的光流。通常在以点 u u u为中心的图像区域 [ 2 w x + 1 , 2 w x + 1 ] [2w_x+1,2w_x+1] [2wx+1,2wx+1]内,通过最小化灰度匹配误差的平方和来求解 d d d。此损失函数为,
e ( d ) = e ( d x , d y ) = ∑ x = u x − w x u x + w x ∑ y = u y − w y u y + w y ( I ( x , y ) − J ( x + d x , y + d y ) ) 2 e(d)=e(d_x,d_y)=\sum_{x=u_x-w_x}^{u_x+w_x}\sum_{y=u_y-w_y}^{u_y+w_y}(I(x,y)-J(x+d_x,y+d_y))^2 e(d)=e(dx,dy)=x=ux−wx∑ux+wxy=uy−wy∑uy+wy(I(x,y)−J(x+dx,y+dy))2
具体操作流程是先对图像进行金字塔分层,下层每次缩放为上层的一半,将分辨率低的图像分配在最顶层,原始图像分配在最底层。从顶层也就是分辨率最低的图片开始,递归求解到原始图片为止。设第L层的损失函数为,
e L ( d L ) = e L ( d x L , d y L ) = ∑ x = u x L − w x u x L + w x ∑ y = u y L − w y u y L + w y ( I L ( x , y ) − J L ( x + g x L + d x L , y + g y L + d y L ) ) 2 e^L(d^L)=e^L(d^L_x,d^L_y)=\sum_{x=u^L_x-w_x}^{u^L_x+w_x}\sum_{y=u^L_y-w_y}^{u^L_y+w_y}(I^L(x,y)-J^L(x+g^L_x+d^L_x,y+g^L_y+d^L_y))^2 eL(dL)=eL(dxL,dyL)=x=uxL−wx∑uxL+wxy=uyL−wy∑uyL+wy(IL(x,y)−JL(x+gxL+dxL,y+gyL+dyL))2
其中, g L g^L gL代表的是像素点在第L层迭代运算中的光流初值, d L d^L dL代表的是像素点在第L层迭代运算中的光流误差。 d L = [ d x L , d y L ] d^L=[d^L_x,d^L_y] dL=[dxL,dyL]通过标准的LK算法得到, g L = [ g x L , g y L ] g^L=[g^L_x,g^L_y] gL=[gxL,gyL]通过下式求得,该公式是递归推导。另外,设顶层的光流初值 g = [ 0 , 0 ] T g=[0,0]^T g=[0,0]T,
g L − 1 = 2 ( g L + d L ) g^{L-1}=2(g^L+d^L) gL−1=2(gL+dL)
重新定义 A ( x , y ) = I L ( x , y ) A(x,y)=I^L(x,y) A(x,y)=IL(x,y), B ( x , y ) = J L ( x + g x L , y + g y L ) B(x,y)=J^L(x+g^L_x,y+g^L_y) B(x,y)=JL(x+gxL,y+gyL), [ p x , p y ] T = [ u x L , u y L ] T [p_x,p_y]^T=[u^L_x,u^L_y]^T [px,py]T=[uxL,uyL]T, v ‾ = [ v x , v y ] T = d L \overline v=[v_x,v_y]^T=d^L v=[vx,vy]T=dL,
e ( v ‾ ) = e ( v x , v y ) = ∑ x = p x − w x p x + w x ∑ y = p y − w y p y + w y ( A ( x , y ) − B ( x + v x , y + v y ) ) 2 e(\overline v)=e(v_x,v_y)=\sum_{x=p_x-w_x}^{p_x+w_x}\sum_{y=p_y-w_y}^{p_y+w_y}(A(x,y)-B(x+v_x,y+v_y))^2 e(v)=e(vx,vy)=x=px−wx∑px+wxy=py−wy∑py+wy(A(x,y)−B(x+vx,y+vy))2
∂ e ( v ‾ ) ∂ v ‾ = − 2 ∑ x = p x − w x p x + w x ∑ y = p y − w y p y + w y ( A ( x , y ) − B ( x + v x , y + v y ) ) ∙ [ ∂ B ∂ x ∂ B ∂ y ] \frac{\partial e(\overline v)}{\partial \overline v}=-2\sum_{x=p_x-w_x}^{p_x+w_x}\sum_{y=p_y-w_y}^{p_y+w_y}(A(x,y)-B(x+v_x,y+v_y))\bullet \left[\begin{matrix}\frac{\partial B}{\partial x} &\frac{\partial B}{\partial y}\end{matrix}\right] ∂v∂e(v)=−2x=px−wx∑px+wxy=py−wy∑py+wy(A(x,y)−B(x+vx,y+vy))∙[∂x∂B∂y∂B]
对 B ( x + v x , y + v y ) B(x+v_x,y+v_y) B(x+vx,y+vy)进行泰勒展开,
B ( x + v x , y + v y ) = B ( x , y ) + [ ∂ B ∂ x ∂ B ∂ y ] v ‾ B(x+v_x,y+v_y)=B(x,y)+\left[\begin{matrix}\frac{\partial B}{\partial x} &\frac{\partial B}{\partial y}\end{matrix}\right]\overline v B(x+vx,y+vy)=B(x,y)+[∂x∂B∂y∂B]v
∂ e ( v ‾ ) ∂ v ‾ ≈ − 2 ∑ x = p x − w x p x + w x ∑ y = p y − w y p y + w y ( A ( x , y ) − B ( x , y ) − [ ∂ B ∂ x ∂ B ∂ y ] v ‾ ) ∙ [ ∂ B ∂ x ∂ B ∂ y ] \frac{\partial e(\overline v)}{\partial \overline v}\approx-2\sum_{x=p_x-w_x}^{p_x+w_x}\sum_{y=p_y-w_y}^{p_y+w_y}(A(x,y)-B(x,y)-\left[\begin{matrix}\frac{\partial B}{\partial x} &\frac{\partial B}{\partial y}\end{matrix}\right]\overline v)\bullet \left[\begin{matrix}\frac{\partial B}{\partial x} &\frac{\partial B}{\partial y}\end{matrix}\right] ∂v∂e(v)≈−2x=px−wx∑px+wxy=py−wy∑py+wy(A(x,y)−B(x,y)−[∂x∂B∂y∂B]v)∙[∂x∂B∂y∂B]
同时令,
δ I = A ( x , y ) − B ( x , y ) \delta I=A(x,y)-B(x,y) δI=A(x,y)−B(x,y)
∇ I = [ I x I y ] = [ ∂ B ∂ x ∂ B ∂ y ] T \nabla I=\left[\begin{matrix}I_x\\I_y\end{matrix}\right]=\left[\begin{matrix}\frac{\partial B}{\partial x} &\frac{\partial B}{\partial y}\end{matrix}\right]^T ∇I=[IxIy]=[∂x∂B∂y∂B]T
I x ( x , y ) = ∂ A ( x , y ) ∂ x = A ( x + 1 , y ) − A ( x − 1 , y ) 2 I_x(x,y)=\frac{\partial A(x,y)}{\partial x}=\frac{A(x+1,y)-A(x-1,y)}2 Ix(x,y)=∂x∂A(x,y)=2A(x+1,y)−A(x−1,y)
I y ( x , y ) = ∂ A ( x , y ) ∂ y = A ( x , y + 1 ) − A ( x , y − 1 ) 2 I_y(x,y)=\frac{\partial A(x,y)}{\partial y}=\frac{A(x,y+1)-A(x,y-1)}2 Iy(x,y)=∂y∂A(x,y)=2A(x,y+1)−A(x,y−1)
得,
1 2 ∂ e ( v ‾ ) ∂ v ‾ ≈ ∑ x = p x − w x p x + w x ∑ y = p y − w y p y + w y ( ∇ I T v ‾ − δ I ) ∇ I T \frac12\frac{\partial e(\overline v)}{\partial \overline v}\approx\sum_{x=p_x-w_x}^{p_x+w_x}\sum_{y=p_y-w_y}^{p_y+w_y}(\nabla I^T\overline v-\delta I)\nabla I^T 21∂v∂e(v)≈x=px−wx∑px+wxy=py−wy∑py+wy(∇ITv−δI)∇IT
1 2 [ ∂ e ( v ‾ ) ∂ v ‾ ] T ≈ ∑ x = p x − w x p x + w x ∑ y = p y − w y p y + w y ( [ I x 2 I x I y I x I y I y 2 ] v ‾ − [ δ I I x δ I I y ] ) \frac12[\frac{\partial e(\overline v)}{\partial \overline v}]^T\approx\sum_{x=p_x-w_x}^{p_x+w_x}\sum_{y=p_y-w_y}^{p_y+w_y}\left(\left[\begin{matrix}I^2_x &I_xI_y\\ \\ I_xI_y& I^2_y\end{matrix}\right]\overline v-\left[\begin{matrix}\delta II_x\\\\\delta II_y\end{matrix}\right]\right) 21[∂v∂e(v)]T≈x=px−wx∑px+wxy=py−wy∑py+wy⎝⎛⎣⎡Ix2IxIyIxIyIy2⎦⎤v−⎣⎡δIIxδIIy⎦⎤⎠⎞
G = ∑ x = p x − w x p x + w x ∑ y = p y − w y p y + w y [ I x 2 I x I y I x I y I y 2 ] G=\sum_{x=p_x-w_x}^{p_x+w_x}\sum_{y=p_y-w_y}^{p_y+w_y}\left[\begin{matrix}I^2_x &I_xI_y\\ \\ I_xI_y& I^2_y\end{matrix}\right] G=x=px−wx∑px+wxy=py−wy∑py+wy⎣⎡Ix2IxIyIxIyIy2⎦⎤
b ‾ = ∑ x = p x − w x p x + w x ∑ y = p y − w y p y + w y [ δ I I x δ I I y ] \overline b=\sum_{x=p_x-w_x}^{p_x+w_x}\sum_{y=p_y-w_y}^{p_y+w_y}\left[\begin{matrix}\delta II_x\\\\\delta II_y\end{matrix}\right] b=x=px−wx∑px+wxy=py−wy∑py+wy⎣⎡δIIxδIIy⎦⎤
1 2 [ ∂ e ( v ‾ ) ∂ v ‾ ] T ≈ G v ‾ − b ‾ \frac12[\frac{\partial e(\overline v)}{\partial \overline v}]^T\approx G\overline v-\overline b 21[∂v∂e(v)]T≈Gv−b
当 ∂ e ( v ‾ ) ∂ v ‾ ∣ v ‾ = v ‾ o p t = 0 \frac{\partial e(\overline v)}{\partial \overline v}|_{\overline v=\overline v_{opt} }=0 ∂v∂e(v)∣v=vopt=0时得,
v ‾ o p t = G − 1 b ‾ \overline v_{opt}=G^{-1}\overline b vopt=G−1b迭代初值 v ‾ = [ 0 , 0 ] T \overline v=[0,0]^T v=[0,0]T,迭代一定次数或者光流误差小于一个设定阈值后,得到最终的 v ‾ \overline v v,即 d L d^L dL,第L层图像的光流为 g L + d L g^L+d^L gL+dL。最终,原始图像的光流为,
d = g 0 + d 0 d=g^0+d^0 d=g0+d0附上一张论文中的流程,
参考:
1.总结:光流–LK光流–基于金字塔分层的LK光流–中值流
2.《Pyramidal Implementation of the Lucas Kanade Feature Tracker Description of the algorithm》