光流法是计算机视觉中应用较为广泛的一类算法,经常用于物体跟踪及其相关任务中,今天来介绍下光流中比较简单的一种方法:LK光流。
LK光流全称为Lucas-Kanade光流,算法原理比较好理解,首先,LK光流对应用场景提出了三个假设先验:
亮度恒定:假设像素在运动过程中亮度(灰度值)恒定,其实这是大部分计算机视觉任务都需要的一个先验像素偏移小:检测光流的两帧之间不能有过大的motion,否则LK光流会检测失败空间一致性:当前帧相邻的像素在下一帧应该也是相邻的,这样便于求解图像块的梯度进而寻找到匹配的像素给定 t t t时刻的图像上的像素点 I ( x , y ) I(x, y) I(x,y),算法的目标是找到在下一时刻该像素的在各个方向上的位移,用公式表达就是: I ( x , y , t ) = I ( x + δ x , y + δ y , t + δ t ) (1) I(x, y, t) = I(x + \delta x, y + \delta y, t + \delta t) \tag{1} I(x,y,t)=I(x+δx,y+δy,t+δt)(1) 可以对等号右边的式子采用泰勒展开: I ( x , y , t ) = I ( x + δ x , y + δ y , t + δ t ) = I ( x , y , t ) + ∂ I ∂ x δ x + ∂ I ∂ y δ y + ∂ I ∂ t δ t (2) \begin{aligned} I(x, y, t) &= I(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 \end{aligned} \tag{2} I(x,y,t)=I(x+δx,y+δy,t+δt)=I(x,y,t)+∂x∂Iδx+∂y∂Iδy+∂t∂Iδt(2) 可以看到等号后边第一项与等号左边相等可以消去, ∂ I ∂ x \frac{\partial I}{\partial x} ∂x∂I和 ∂ I ∂ y \frac{\partial I}{\partial y} ∂y∂I比较好理解,就是当前时刻图像在 x x x和 y y y方向的梯度了, ∂ I ∂ t \frac{\partial I}{\partial t} ∂t∂I表示的的是时间方向上的梯度,也就是下一帧与当前帧的差分。 δ t \delta t δt是两帧时间差也就是1,而 δ x \delta x δx和 δ y \delta y δy就是我们要求解的像素运动。由此我们可以得到: I x δ x + I y δ y = − I t (3) I_x\delta x + I_y\delta y = -I_t \tag{3} Ixδx+Iyδy=−It(3) 我们现在有两个未知数但是只有一个方程,无法求解,根据我们在最开始的第三个假设,此时我们可以使用需要求解的像素周围 3 × 3 3\times3 3×3的像素块来帮助我们得到更多的方程式: [ I x 1 I y 1 I x 2 I y 2 . . . I x 8 I y 8 I x 9 I y 9 ] [ δ x δ y ] = [ − I t 1 − I t 2 . . . − I t 8 − I t 9 ] (4) \left[ \begin{matrix} I_{x1} \ I_{y1} \\ I_{x2} \ I_{y2} \\ ... \\ I_{x8} \ I_{y8} \\ I_{x9} \ I_{y9} \end{matrix} \right] \left[ \begin{matrix} \delta x \\ \delta y \end{matrix} \right]= \left[ \begin{matrix} -I_{t1} \\ -I_{t2} \\ ... \\ -I_{t8} \\ -I_{t9} \end{matrix} \right] \tag{4} ⎣⎢⎢⎢⎢⎡Ix1 Iy1Ix2 Iy2...Ix8 Iy8Ix9 Iy9⎦⎥⎥⎥⎥⎤[δxδy]=⎣⎢⎢⎢⎢⎡−It1−It2...−It8−It9⎦⎥⎥⎥⎥⎤(4) 此时便组成了一个超定方程组,也就是方程个数大于未知数个数,这是我们可以使用最小二乘法来求解这个方程组。 A x = − b A T A x = A T ( − b ) x = ( A T A ) − 1 A T ( − b ) \begin{aligned} Ax&=-b \\ A^TAx&=A^T(-b) \\ x&=(A^TA)^{-1}A^T(-b) \end{aligned} AxATAxx=−b=AT(−b)=(ATA)−1AT(−b) 代入上面的式子便可以得到: [ δ x δ y ] = [ ∑ I x i 2 ∑ I x i I y i ∑ I x i I y i 2 ∑ I y i 2 ] [ − ∑ I x i I t i − ∑ I y i I t i ] \left[ \begin{matrix} \delta x \\ \delta y \end{matrix} \right]= \left[ \begin{matrix} \sum I_{xi}^2 \ \sum I_{xi}I_{yi} \\ \sum I_{xi}I_{yi}^2 \ \sum I_{yi}^2 \end{matrix} \right] \left[ \begin{matrix} -\sum I_{xi}I_{ti} \\ -\sum I_{yi}I_{ti} \end{matrix} \right] [δxδy]=[∑Ixi2 ∑IxiIyi∑IxiIyi2 ∑Iyi2][−∑IxiIti−∑IyiIti]
