光流算法简述

光流(optical flow),字面意思描述的是图像中像素强度的流动。光流法的目的是根据图像中像素点的灰度值强度变化估计出物体移动速度与方向。

光流

光流的假设

首先,光流估计指的是利用时间上相邻的两帧图像内像素强度的变化来计算点的运动。原理决定了这种方法是建立在一系列假设上的。

  • 前后两帧中点的位移不大
  • 灰度不变假设,这要求外界光强保持恒定
  • 空间相关性,每个点的运动和邻近的点类似

好像这么多假设有些不靠谱,但是其实光流的输入图像一般时间间隔极小,这使得这么短的时间内,位移,光照强度等都变化极小。这样的假设其实是可以接受的。

光流的原理

上述假设中的核心是第二条,灰度不变假设。

\[ I(x,y,t) = I(x+dx, y+dy, t+dt) \]

将上式右项进行泰勒展开,可以得到

\[ I(x+dx, y+dy, t+dt) \approx I(x,y,t) + \frac{\partial I}{\partial x}dx + \frac{\partial I}{\partial y}dy + \frac{\partial I}{\partial t}dt \]

将上式右项进行泰勒展开,可以得到由于我们假设灰度不变,所以即

\[ \frac{\partial I}{\partial x}dx + \frac{\partial I}{\partial y}dy + \frac{\partial I}{\partial t}dt \approx 0 \]

上式同时除以\(dt\)得:

\[ \frac{\partial I}{\partial x}\frac{dx}{dt} + \frac{\partial I}{\partial y}\frac{dy}{dt} = - \frac{\partial I}{\partial t} \]

  • 上式中\(\frac{dx}{dt}\)代表的是像素在x轴上的运动速度,\(\frac{dy}{dt}\)代表的是像素在y轴上的运动速度,此处我们将其分别记为\(u,v\)
  • 上式中\(\frac{\partial I}{\partial x}\)代表的是像素在x方向上的梯度,\(\frac{\partial I}{\partial y}\)代表的是像素在y方向上的梯度,我们将其记为\(I_x,I_y\)

上式可写成如下形式

\[ \begin{bmatrix} I_x & I_y \end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix} = -I_t \]

  • 其中\(I_x,I_y\)我们可以通过简单的求梯度卷积操作计算得到
  • \(I_t\)可以通过图像序列得到

由此我们可以计算出\((u,v)\),一般一幅图像中如果我们选取n个点(一般这n个点比较靠近,因为图像中不同区域中的点运动尺寸很可能不一致)进行光流跟踪,就会有n个方程。多个方程求解两个变量,我们可以迭代(直到lost,也就是\(I_t\)比上一个变大了终止)。

LK光流

LK光流指的是通过建立一个观察窗口,假设窗口内的像素点的位移是相同的。由此可以建立一个超定方程。使用最小二乘法进行求解。

需要指出的是,上述推导中添加了时间项,其实不加时间也是可以的如果不加时间,\(I_t\)其实就是前后两帧两点处的灰度差(不需要除以时间),\(u,v\)就是单纯的光流位移。

维持位移小假设

问题:上面提到光流的第一条假设是前后两帧中的点位移相差不大。这是因为位移较大时,泰勒展开近似就会不成立了。

解决方法:使用图像金字塔建立多尺度的图像空间,这样本来较大的位移在新的层级比较高的尺度空间上会变小。

此种做法也叫作\(coarse to fine\),即代表的是,首先在分辨率最小的层级上进行光流跟踪,将得到的结果带入到分辨率次低的层上作为输入,再进行光流跟踪。顺着金字塔依次执行到最低层。可以增加在位移较大情况下的稳定性。

维持光度不变假设

问题:我们知道光流三大假设中最核心的假设是光度不变假设。但是有时由于光照条件、相机曝光时间等因素,此假设很难满足。

解决方案:此时我们的解决方法有多种,比较简单的方法有图像块去均值,稍微复杂一点的方法有光度标定。

此处光度标定的原理暂且不展开讲了,之后我会专门写一篇博客讲述光度标定的原理。

维持相关性假设

问题:上面提到的三大假设的最后一项是空间相关性假设,即假设建立超定方程的点群的位移相同。此假设在相机只有位移的时候,可以大概满足。但是当相机只发生旋转的时候,我们会发现其实一个\(9*9\)方块中的点似乎不在是位移相同的了。

解决方法:使用带有6个元素的仿射变换代替只有两个元素的位移来描述窗口中每个元素的变换,由于仿射变换可以应对旋转的情况,因此会更加鲁棒。缺点是参数变多了,超定方程组需要更大点。

光流方法评价

光流方法速度很快,求解方法可以使用求解超定方程组,也可以使用高斯牛顿等迭代操作完成。

光流残差的构造方式

前向(forward)与逆向(inverse)

上面推导光流原理时提到我们需要使用图像中该点处的像素梯度,前向光流使用的目标帧的图像梯度,逆向光流使用的是当前帧的图像梯度。

这两种方法的差异是,前向光流的图像梯度随着光流位置的更新需要不断更新,逆向光流不需要如此,只需要一开始计算一次梯度一直使用就行。

叠加式(additive)与构造式(compositional)

在传统光流中估计的是点的位移,但是更鲁棒的做法可能是估计该二维点到另一个二维点的仿射变换。假设该变换函数为w,参数为p,则对于原本的二维点x,经过变换到新的位置为

\[ w(x,p) \]

叠加式与构造式指的是在优化解决光流时更新参数p的方式,其中叠加式为:

\[ w(x, p + \delta p) \]

构造式为:

\[ w( w(x, p), \delta p) \]

参考资料

  • [1] 视觉SLAM十四讲
  • [2] https://xmfbit.github.io/2017/05/03/cs131-opticalflow/

光流算法简述
http://line.com/2018/12/24/2018-12-24-optical-flow/
作者
Line
发布于
2018年12月24日
许可协议