Optical Flow

光流法

定义

光流法实际是通过检测图像像素点的强度随时间的变化进而推断出物体移动速度及方向的方法。

在 2D + t 维的情况下,假设位于 (x,y,t)(x,y,t) 的像素的亮度是 I(x,y,t)I(x,y,t)。该像素在两个像素之间移动了 Δx,Δy,Δt\Delta x,\Delta y, \Delta t,有

I(x,y,t)=I(x+Δx,y+Δy,t+Δt)I(x,y,t)=I(x + \Delta x, y + \Delta y, t + \Delta t)

假设移动很小,根据泰勒级数得出

I(x+Δx,y+Δy,t+Δt)=I(x,y,t)+∂I∂xΔx+∂I∂yΔy+∂I∂tΔt+H.O.TI(x + \Delta x, y + \Delta y, t + \Delta t)=I(x,y,t) + \frac{\partial I}{\partial x} \Delta x + \frac{\partial I}{\partial y} \Delta y + \frac{\partial I}{\partial t} \Delta t + \text{H.O.T}

因此有

∂I∂xΔx+∂I∂yΔy+∂I∂tΔt=0\frac{\partial I}{\partial x} \Delta x+ \frac{\partial I}{\partial y} \Delta y+ \frac{\partial I}{\partial t} \Delta t=0

∂I∂xΔxΔt+∂I∂yΔyΔ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 t} \frac{\Delta t}{\Delta t}=0

∂I∂xVx+∂I∂yVy+∂I∂t=0\frac{\partial I}{\partial x}V_x+ \frac{\partial I}{\partial y} V_y+ \frac{\partial I}{\partial t}=0

其中 Vx,VyV_x, V_y 是 x,yx,y 方向上的速率,或称为 I(x,y,t)I(x,y,t) 的光流。而 ∂I∂x,∂I∂y,∂I∂t\frac{\partial I}{\partial x},\frac{\partial I}{\partial y},\frac{\partial I}{\partial t} 是图像 (x,y,t)(x,y,t) 在对应方向上的偏导数,记为 Ix,Iy,ItI_x,I_y,I_t,有

IxVx+IyVy=−ItI_x V_x + I_y V_y = -I_t

或者

∇It⋅V⃗=−It\nabla I_t \cdot \vec V = -I_t

注 ∂I∂t=It=I(x,y,t+Δt)−I(x,y,t)\frac {\partial I} {\partial t} = I_t = I(x,y,t+\Delta t) - I(x,y,t)。其中 Vx,VyV_x, V_y 是未知数,用 Lucas-Kanade 方法可以求解。

Lucas-Kanade 法求解

假设一个像素周围的像素移动相似。取一个点 3×33\times3 的区域,假设他们有相同的移动。我们可以计算出九个点的 (Ix,Iy,It)(I_x,I_y,I_t) ,用这九个点的梯度值,求两个未知数 Vx,VyV_x,V_y,写成矩阵形式如下

[VxVy]=[∑iIxi2∑iIxiIyi∑iIxiIyi∑iIyi2]−1[−∑iIxiIti−∑iIyiIti]\begin{bmatrix} V_x \\ V_y \end{bmatrix} = \begin{bmatrix} \sum_i I_{x_i}^2 & \sum_i I_{x_i} I_{y_i} \\ \sum_i I_{x_i} I_{y_i} & \sum_i I_{y_i}^2 \end{bmatrix} ^{-1} \begin{bmatrix} -\sum_i I_{x_i} I_{t_i} \\ -\sum_i I_{y_i} I_{t_i} \end{bmatrix}

[1] OpenCV: Optical Flow URL

[2] Wiki 光流法 URL

本文有帮助?