光流 学习笔记

本博客内容来源于网络以及其他书籍,结合自己学习的心得进行重编辑,因为看了很多文章不便一一标注引用,如图片文字等侵权,请告知删除。

传统2D计算机视觉学习笔记目录------->传送门
传统3D计算机视觉学习笔记目录------->传送门

前言

本来这篇想写HDR的,但是发现里面有光流的知识,感觉光流这一块知识挺多的,而且现在应用也蛮多的,所以就先来看一下光流吧。我第一次接触光流,大概是5年前吧,当时一个师兄用光流去做四旋翼飞机的空中稳定,时间过得好快啊。

最近发现自己的文章还都挺长的,其实能够阅读下去还是挺难的,对于想系统的学习算法的原理蛮好的,但是我自己再读起来,也难以有耐心读下去。接下来调整一下,尽量能够让自己读下去,也能够把知识都覆盖掉。我感觉很大的原因还是这是前期,需要描述的东西太多了。

路漫漫长修远兮,吾将上下而求索。

光流 学习笔记_第1张图片

光流理念简介

光流 学习笔记_第2张图片

初次见到光流这个概念,大家应该会比较陌生,光会流动?还有就是大家可以想到上图的样子,汽车灯在眼石曝光下留下的连续的光影,其实这也是光流。下面我们从几个方面,来了解一下光流。首先灵魂三问What,Where,Why?

  • 光流是什么?

我们知道当物体在运动时,它在图像上对应点也在运动,我们成图像上像素点的瞬时运动称为光流(就感觉一个光像素点在图片上流动一样)。它的概念是由 James J. Gibson于20世纪40年代首先提出的,是指时变图像中模式运动速度,即是空间运动物体在观察成像平面上的像素运动的瞬时速度。这个速度是矢量,带有大小和方向。

  • 光流是怎么产生的呢?

一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。

  • 那么光流有什么意义呢?

光流是三维空间内物体的运动在二维成像平面上的投影的瞬间速度。得到的是一个描述位置变化的二维矢量,但在运动间隔极小的情况下,我们通常将其视为一个描述该点瞬时速度的二维矢量u=(u,v),称为光流矢量。光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。

在了解了光流的基本概念后,我们引入另一个概念

  • 光流场
    在空间中,运动可以用运动场描述,而在一个图像平面上,物体的运动往往是通过图像序列中不同图像灰度分布的不同体现的,从而,空间中的运动场转移到图像上就表示为光流场。

光流场是一个二维矢量场,它反映了图像上每一点灰度的变化趋势,可看成是带有灰度的像素点在图像平面上运动而产生的瞬时速度场。它包含的信息即是各像点的瞬时运动速度矢量信息,是图像上所有像素点光流的有序集合。

研究光流场的目的就是为了从序列图像中近似计算不能直接得到的运动场。光流场在理想情况下,光流场对应于运动场。

这也是就为什么我的师兄要用光流来稳定四旋翼飞行器了,因为通过光流计算可以得到一个近似的运动,但是我也不知道最后那个项目的效果怎么样。

我们介绍完了,基础的概念以及定义,其实很简单也很容易懂,下面我们介绍一些怎么计算光流。

常见光流计算方法

光流的计算方法有很多种,但是基本的思想就是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息。我们先列举一些基础的计算方法,不详细解释:

1. 基于梯度的方法:

基于梯度的方法又称为微分法,它是利用时变图像灰度的时空微分来计算像素的速度矢量,例如Horn-Schunck算法与Lucas-Kanade(LK)算法,由于计算简单和较好的结果,该方法应用较多。

2. 基于匹配的方法:

基于匹配的方法包括特征和区域匹配。基于特征的方法不断地对目标主要特征进行定位和跟踪,对目标大的运动和亮度变化具有鲁棒性。存在的问题是光流通常很稀疏,而且特征提取和精确匹配也十分困难。基于区域的方法先对类似的区域进行定位,然后通过相似区域的位移计算光流,其光流也比较稀疏,而且计算量也比较大。

3. 基于能量的方法

基于能量的方法又称为基于频率的方法,在使用该类方法的过程中,要获得均匀流场的准确的速度估计,就必须对输入的图像进行时空滤波处理,即对时间和空间的整合,但是这样会降低光流的时间和空间分辨率,而且计算量也比较大,另外,要进行可靠性评价也比较困难。

4. 基于相位的方法

基于相位的方法是由Fleet和Jepson提出的,Fleet和Jepson最先提出将相位信息用于光流计算的思想。当我们计算光流的时候,相比亮度信息,图像的相位信息更加可靠,所以利用相位信息获得的光流场具有更好的鲁棒性。基于相位的光流算法的优点是:对图像序列的适用范围较宽,而且速度估计比较精确,但也存在着一些问题:第一,基于相位的模型有一定的合理性,但是有较高的时间复杂性;第二,基于相位的方法通过两帧图像就可以计算出光流,但如果要提高估计精度,就需要花费一定的时间;第三,基于相位的光流计算法对图像序列的时间混叠是比较敏感的。

5. 基于深度学习的方法

基于深度学习的方法,通过神经网络,学习出相邻帧之间的光流场。神经网络方法是光流技术的一个发展方向。

以上是从5个不同的研究路径区分的方法,除此,我们还可以将其方法根据得出的光流场的密度,可以分为稠密光流法与洗漱光流法。
那为什么有这么多的方法呢,他们有什么差异以及有什么共同点呢?我们一起来看一下,光流的基本原理。

  • 光流的基本假设:

  1. 亮度恒定不变。即同一目标在不同帧间运动时,其亮度不会发生改变。这是基本光流法的假定(所有光流法变种都必须满足),用于得到光流法基本方程;

  2. 时间连续或运动是“小运动”。即时间的变化不会引起目标位置的剧烈变化,相邻帧之间位移要比较小。同样也是光流法不可或缺的假定。

根据光流的基本假设,我们得出了光流的约束方程。

假设第一帧图像中的像素 I(x, y, t) 在时间 dt 后移动到第二帧图像的 (x+dx, y+dy) 处。根据上述第一条假设:灰度值不变,我们可以得到:

对上式右边,进行泰勒展开可得到:

其中ε代表二阶无穷小项,可忽略不计,对上式进行化简得(f和I是一样的,公式摘抄自其他地方):

其中:
光流 学习笔记_第3张图片

其中,fx,fy,ft均可由图像数据求得,而(u,v)即为所求光流矢量。
但是约束方程只有一个,而方程的未知量有两个,这种情况下无法求得u和v的确切值。这种不确定性称为“孔径问题”。所以要想接触方程则至少还需要一个约束方程,而上文中提到的方法,都是在基础原理的约束方程上,在增加一个从不同角度考虑的约束方程,来求解。

其他的方法,我们再通过文章来解释。

光流的应用

光流作为计算机视觉里面的一个独特的方法,在很多方面都有涉及,比如目标检测,目标跟踪,背景去除,3D结构恢复,视频流丰富以及运动估计等,属于应用比较广泛的算法理念。

通过光流法与其他算法相结合,可以很明显的提高算法的速度,以及适应度。

我会在其他文章中来具体展示其应用效果。

总结

这篇文章因为感冒写了四天,本来打算把光流的每个方法都解释一遍,感觉还是太长,不方便读。这篇文章主要还是基础简要的描述一下光流以及光流法,可以看出来光流法的原理还是比较简单的,但是使用的场景也比较单一,就是在高速采集的视频流里面会比较有效。


重要的事情说三遍:

如果我的文章对您有所帮助,那就点赞加个关注呗 ( * ^ __ ^ * )

如果我的文章对您有所帮助,那就点赞加个关注呗 ( * ^ __ ^ * )

如果我的文章对您有所帮助,那就点赞加个关注呗 ( * ^ __ ^ * )

传统2D计算机视觉学习笔记目录------->传送门
传统3D计算机视觉学习笔记目录------->传送门

任何人或团体、机构全部转载或者部分转载、摘录,请保留本博客链接或标注来源。博客地址:开飞机的乔巴

作者简介:开飞机的乔巴(WeChat:zhangzheng-thu),现主要从事机器人抓取视觉系统以及三维重建等3D视觉相关方面,另外对slam以及深度学习技术也颇感兴趣,欢迎加我微信或留言交流相关工作。

你可能感兴趣的:(光流 学习笔记)