基础光流法介绍

基于梯度的方法

Posted by iStar on June 4, 2022

本文内容原是写毕业论文相关工作时整理的内容,但发现后面并不需要在这里进行详细公式说明,又不忍直接删掉,就让它们换个形式保存在这里吧。

光流法基本假设

光流法具有两个基本假设:

  1. 相邻帧的亮度恒定不变,即物体在视频中运动时,相邻帧的亮度不发生明显变化;

  2. 时间连续或微小运动,即相邻帧之间物体的位置变化并不剧烈。

基于这两个假设,我们可以得到图像的约束方程为: \(I(x,y,t)=I(x+\delta x,y+\delta y,t+\delta t) \tag{OpticalFlowCE}\label{eq:OpticalFlowCE}\) 其中$I(x,y,t)$是$t$时刻图像在$(x,y)$像素位置的亮度。在经过$\delta t$时间后,像素在新一帧中的位置相对原位置移动了$(\delta x,\delta y)$。

将$\eqref{eq:OpticalFlowCE}$右端在$(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 + \epsilon \tag{OpticalFlowTaylor}\label{eq:OpticalFlowTaylor}\) 其中$\epsilon$表示泰勒公式的高阶无穷小项,可以近似为0。

[eq:OpticalFlowCE][eq:OpticalFlowTaylor]联立,得到: [\centering \frac{\partial I}{\partial x}\delta x + \frac{\partial I}{\partial y}\delta y + \frac{\partial I}{\partial t}\delta t = 0]

两边同除以(\delta t)得到: [\centering \label{eq:OpticalFlow} \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} = 0] 其中(\frac{\delta x}{\delta t})和(\frac{\delta y}{\delta t})分别表示像素点速度矢量沿着(x)方向和(y)方向的导数,分别记为(u,v)。再令(I_x=\frac{\partial I}{\partial x}),(I_y=\frac{\partial I}{\partial y}),(I_t=\frac{\partial I}{\partial t})分别表示像素点的灰度沿(x,y,t)方向的偏导数。

这时,[eq:OpticalFlow]可以写成: [\centering I_x u + I_y v + I_t = 0] 其中(I_x, I_y, I_t)都可以从图像数据中获得,((u, v))为未知的光流矢量。

在上述结果中,有一个约束方程,但却有两个未知数,这是不可解的,需要引入额外的约束条件。根据约束条件的不同,光流法产生了不同的分支,其中又可以分为两种实现方案:稀疏光流法和稠密光流法。

稀疏光流法

稀疏光流法指的是先从图像中选取一些关键点(一般选择角点),在之后的识别和追踪中,只关注这些关键点的像素运动,从而大大减小了计算量。

稀疏光流法的代表是Lucas Kanade算法 (LK算法),它在光流法基本假设的基础上提出了另一个假设:

  1. 空间一致性,场景中同一物体的相邻像素点具有相似的运动,且在投影到二维图像平面上的距离也比较近。

据此,我们假设在一个大小为(m\times m\ (n = m^2))的窗口内,图像的光流是一个恒定值,那么可以得到如下方程组:

[\centering \label{eq:OptivalFlowEQs} \begin{aligned} I_{x_1}u + I_{y_1}v & = -I_{t_1}
I_{x_2}u + I_{y_2}v & = -I_{t_2}
& \cdots
& \cdots
I_{x_n}u + I_{y_n}v & = -I_{t_n}
\end{aligned}]

上述方程组的矩阵形式为: [\left[ \begin{array}{cc} I_{x_1} & I_{y_1}
I_{x_2} & I_{y_2}
\cdot & \cdot
\cdot & \cdot
I_{x_n} & I_{y_n}
\end{array} \right] \left[ \begin{array}{c} u
v
\end{array} \right] = \left[ \begin{array}{c} -I_{t_1}
-I_{t_2}
\cdot
\cdot
-I_{t_n}
\end{array} \right]] 记为(\symbf{A}\symbf{v} = \symbf{b})

使用最小二乘法得到: [\symbf{A}^\mathsf{T}\symbf{A}\symbf{v} = \symbf{A}^\mathsf{T}\symbf{b}] 解得速度矢量为: [\symbf{v} = (\symbf{A}^\mathsf{T}\symbf{A})^{-1}\symbf{A}^\mathsf{T}\symbf{b}] 该速度矢量就被视为光流。

稀疏光流法的缺点也十分明显,因为只追踪根据之前帧得到的关键点,所以往往会忽视新出现在图像中的物体。 由于这一缺点,本文并不使用LK算法作为运动检测的算法,而是对其进行简化,输出两帧图像中像素运动的最大距离,以此衡量物体运动速度,并影响视频参数的配置。

稠密光流法

稠密光流法并没有像稀疏光流那样取巧,而是直接计算一帧中全部像素的光流,因此稠密光流更加精确,可以表现物体整体的运动情况,但同时也意味着对计算资源的巨大需求,速度更慢。

稠密光流法的代表是由Gunner Farneback提出的Farnback算法,该算法的假设与LK算法的相同。

Farnback算法将输入图像灰度化,并对图像进行二次多项式建模,对于每一个像素位置(\symbf{x} = (x\ y)^\mathsf{T}),其灰度值是一个关于(\symbf{x})的函数(f(\symbf{x}))。在以待求像素点为中心的局部坐标系中,对函数进行二项展开,可以近似为:

[\begin{aligned} f(\symbf{x}) & = f(x, y)
& \approx r_1 + r_2 x + r_3 y + r_4 x^2 + r_5 y^2 + r_6 xy
& = (x\ y)^\mathsf{T} \begin{pmatrix} r_4 & r_6/2
r_6/2 & r_5 \end{pmatrix} \begin{pmatrix} x
y \end{pmatrix} + (r_2\ r_3) \begin{pmatrix} x
y \end{pmatrix} + r_1
& = \symbf{x}^\mathsf{T}\symbf{A}\symbf{x} + \symbf{b}^\mathsf{T}\symbf{x} + c \end{aligned}]

其中(r_1 \sim r_6)是只针对于这一个像素点的参数,可以在该像素点的邻域内使用加权最小二乘法进行计算,距离该像素点越近的点赋予更大的权重。

设像素初始位置的多项式为(f_1(\symbf{x})=\symbf{x}^\mathsf{T}\symbf{A}_1\symbf{x} + \symbf{b}_1^\mathsf{T}\symbf{x}+c_1),根据上面提到的假设2,像素发生微小移动(\symbf{d})后,得到新的多项式:

[\begin{aligned} f_2(\symbf{x}) & = f_1(\symbf{x} - \symbf{d})
& = (\symbf{x} - \symbf{d})^\mathsf{T}\symbf{A}_1(\symbf{x}-\symbf{d}) + \symbf{b}_1^\mathsf{T}(\symbf{x}-\symbf{d}) + c_1
& = \symbf{x}^\mathsf{T}\symbf{A}_1\symbf{x}+(\symbf{b}_1-2\symbf{A}_1\symbf{d})^\mathsf{T}\symbf{x}+\symbf{d}^\mathsf{T}\symbf{A}_1\symbf{d} - \symbf{b}_1^\mathsf{T}\symbf{d} + c_1
& =\symbf{x}^\mathsf{T}\symbf{A}_2\symbf{x}+\symbf{b}_2^\mathsf{T}\symbf{x}+c_2 \end{aligned}]

其中满足

[\begin{aligned} \symbf{A}_2 & = \symbf{A}_1
\symbf{b}_2 & = \symbf{b}_1 - 2\symbf{A}_1\symbf{d}
c_2 & = \symbf{d}^\mathsf{T}\symbf{A}_1\symbf{d}-\symbf{b}_1^T\symbf{d} + c_1 \end{aligned}]

如果(\symbf{A}_1)非奇异,则可以得到(\symbf{d}=-\frac{1}{2}\symbf{A}_1^{-1}(\symbf{b}_2-\symbf{b}_1))

虽然我们可以从数学推导中得到(\symbf{A}_2=\symbf{A}_1),但在实际中该式未必满足。使用局部多项式对理论值进行逼近,然后通过平均值来近似,设第一帧图像对应的系数为(\symbf{A}_1(\symbf{x}),\symbf{b}_1(\symbf{x}),c_1(\symbf{x})),第二帧图像同理,则

[\begin{aligned} \symbf{A}(\symbf{x}) & = \frac{\symbf{A}_1(\symbf{x})+\symbf{A}_2(\symbf{x})}{2}
\Delta\symbf{b}(\symbf{x}) & = -\frac{1}{2}(\symbf{b}_2(\symbf{x}) - \symbf{b}_1(\symbf{x})) \end{aligned}]

因此

[\symbf{A}(\symbf{x})\symbf{d}(\symbf{x}) = \Delta\symbf{b}(\symbf{x}) \label{eq:Farneback}]

使用[eq:Farneback]可以对一帧图像的每个像素点进行运算,但这样是不现实的,可以尽可能地缩小(\symbf{x})的邻域(I)的范围,并找到符合的(\symbf{d}(\symbf{x})): [\sum_{\Delta \symbf{x}\in I} \omega(\Delta \symbf{x})\left | \symbf{A}(\symbf{x} + \Delta \symbf{x})\symbf{d}(\symbf{x}) - \Delta \symbf{b}(\symbf{x} + \Delta \symbf{x}) \right|^{2}]

其中(\omega(\Delta \symbf{x}))是像素点对应的权重函数,使用最小二乘法可以求得

[\symbf{d}(\symbf{x}) = (\sum \omega\symbf{A}^\mathsf{T}\symbf{A})^{-1}\sum \omega \symbf{A}^\mathsf{T}\Delta \symbf{b}]