光流的概念
- 光流是空间运动物体在观察成像平面上的像素运动的瞬时速度
- 光流是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。
- 光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。
通常将二维图像平面特定坐标点上的灰度瞬时变化率定义为光流矢量。
也可以说所谓光流就是瞬时速率,在时间间隔很小(比如视频的连续前后两帧之间)时,也等同于目标点的位移
我们可以这样理解:当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,这一系列连续变化的信息不断“流过”视网膜(即图像平面),好像一种光的“流”,故称之为光流(optical flow)。光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。
光流用来描述像素随时间在图像之间运动的方法,下图是随着时间的流逝,同一个像素在图像中运动,使用光流法的目的是追踪它的运动过程。
- 计算部分像素运动的为稀疏光流—>Lucas-Kanade光流法
- 计算所有像素的为稠密光流
当前主流的几种光流估计法:
1 基于梯度的方法
基于梯度的方法又称为微分法,它是利用时变图像灰度(或其滤波形式)的时空微分(即时空梯度函数)来计算像素的速度矢量。
由于计算简单和较好的结果,该方法得到了广泛应用和研究。典型的代表是Horn-Schunck算法与Lucas-Kanade(LK)算法。
Horn-Schunck算法在光流基本约束方程的基础上附加了全局平滑假设,假设在整个图像上光流的变化是光滑的,即物体运动矢量是平滑的或只是缓慢变化的。
基于此思想,大量的改进算法不断提出。Nagel采用有条件的平滑约束,即通过加权矩阵的控制对梯度进行不同平滑处理;Black和Anandan针对多运动的估计问题,提出了分段平滑的方法。
2 基于匹配的方法
基于匹配的光流计算方法包括基于特征和区域的两种。
基于特征的方法不断地对目标主要特征进行定位和跟踪,对目标大的运动和亮度变化具有鲁棒性。存在的问题是光流通常很稀疏,而且特征提取和精确匹配也十分困难。
基于区域的方法先对类似的区域进行定位,然后通过相似区域的位移计算光流。这种方法在视频编码中得到了广泛的应用。然而,它计算的光流仍不稠密。另外,这两种方法估计亚像素精度的光流也有困难,计算量很大。
3 基于能量的方法
基于能量的方法又称为基于频率的方法,在使用该类方法的过程中,要获得均匀流场的准确的速度估计,就必须对输入的图像进行时空滤波处理,即对时间和空间的整合,但是这样会降低光流的时间和空间分辨率。基于频率的方法往往会涉及大量的计算,另外,要进行可靠性评价也比较困难。
4 基于相位的方法
基于相位的方法是由Fleet和Jepson提出的,Fleet和Jepson最先提出将相位信息用于光流计算的思想。当我们计算光流的时候,相比亮度信息,图像的相位信息更加可靠,所以利用相位信息获得的光流场具有更好的鲁棒性。基于相位的光流算法的优点是:对图像序列的适用范围较宽,而且速度估计比较精确,但也存在着一些问题:第一,基于相位的模型有一定的合理性,但是有较高的时间复杂性;第二,基于相位的方法通过两帧图像就可以计算出光流,但如果要提高估计精度,就需要花费一定的时间;第三,基于相位的光流计算法对图像序列的时间混叠是比较敏感的。
5 神经动力学方法
神经动力学方法是利用神经网络建立的视觉运动感知的神经动力学模型,它是对生物视觉系统功能与结构比较直接的模拟。
尽管光流计算的神经动力学方法还很不成熟,然而对它的研究却具有极其深远的意义。随着生物视觉研究的不断深入,神经方法无疑会不断完善,也许光流计算乃至计算机视觉的根本出路就在于神经机制的引入。神经网络方法是光流技术的一个发展方向。
Lucas-Kanade 光流
假设和说明
把图像看成关于时间的函数,***I(t)***,那么在t时刻,在图像的(x,y)处的像素,它的灰度值为:: I ( x , y , t ) I(x,y,t) I(x,y,t)
随着时间变化,它的坐标将发生变化,我们希望估计这个空间点在其它时刻(Δt后)的具体位置:: ( x + Δ t , y + Δ t ) (x+Δt,y+Δt) (x+Δt,y+Δt)
这里有一个灰度不变假设:同一个空间点的像素灰度值,在各个图像中是固定不变的: (1) I ( x + Δ t , y + Δ t , t + Δ t ) = I ( x , y , t ) I(x+Δt,y+Δt,t+Δt) = \mathcal I(x,y,t) \tag{1} I(x+Δt,y+Δt,t+Δt)=I(x,y,t)(1)
这种假设性太强,物体的材质,相机的角度,光源等都会对空间点的像素值产生影响,更进一步,像素值是空间内一射线形成的,因此这种灰度不变假设在实际生活中是不一定成立的。所以光流法的应用是有条件的
推导
对式(1)进行泰勒展开有:: I ( x + Δ t , y + Δ t , t + Δ t ) ≈ I ( x , y , t ) + ∂ I ∂ x + ∂ I ∂ y + ∂ I ∂ t I(x+Δt,y+Δt,t+Δt) \approx I(x,y,t) +\frac{ \partial I}{\partial x} +\frac{ \partial I}{\partial y} +\frac{ \partial I}{\partial t} I(x+Δt,y+Δt,t+Δt)≈I(x,y,t)+∂x∂I+∂y∂I+∂t∂I
根据灰度不变假设有:: ∂ I ∂ x + ∂ I ∂ y + ∂ I ∂ t = 0 \frac{ \partial I}{\partial x} +\frac{ \partial I}{\partial y} +\frac{ \partial I}{\partial t} = 0 ∂x∂I+∂y∂I+∂t∂I=0
可以改写为:: ∂ I ∂ x d x d t + ∂ I ∂ y d y d t = − ∂ I ∂ t \frac {\partial I}{\partial x}\frac {dx}{dt} + \frac {\partial I}{\partial y}\frac {dy}{dt} = -\frac{\partial I}{\partial t} ∂x∂Idtdx+∂y∂Idtdy=−∂t∂I
其中 d x / d t , d y / d t dx/dt,dy/dt dx/dt,dy/dt分别可以看作是像素在x轴和y轴方向的运动速度,可以记为 u , v u,v u,v , 而 ∂ I / ∂ x 和 ∂ I / ∂ y ∂I/∂x和∂I/∂y ∂I/∂x和∂I/∂y为图像灰度在该点处的x方向和y方向的梯度,可以记为 I x , I y , I_{x},I_{y}, Ix,Iy, 把图像灰度对时间的变化量记为 I t I_{t} It,那么上式可以写成矩阵形式
:
[
I
x
I
y
]
[
u
v
]
=
−
I
t
[I_{x}\ \ I_{y}] \left[ \begin{matrix} u \\ v \\ \end{matrix} \right]=-I_{t}
[Ix Iy][uv]=−It
对于某一个像素x,y来说,该式是一个带有两个变量(u,v)的一次方程,仅凭它无法计算u,v。要引入其它约束
在LK光流法中引入假设:某一个窗口内的像素具有相同的运动
考虑一个大小为
ω
x
×
ω
y
ω_{x}×ω_{y}
ωx×ωy的窗口,它含有
ω
x
ω
y
ω_{x}ω_{y}
ωxωy数量的像素,即有同样数量的方程,而只有两个未知数(所有像素的运动相同):
:
[
[
I
x
I
y
]
1
⋮
[
I
x
I
y
]
2
]
∗
[
u
v
]
=
−
[
I
t
1
⋮
I
t
2
]
\left[ \begin{matrix} \left[ \begin{matrix} I_{x}& I_{y} \\ \end{matrix} \right]_{1}\\ \vdots \\ \left[ \begin{matrix} I_{x}& I_{y} \\ \end{matrix} \right]_{2}\\ \end{matrix} \right]* \left[ \begin{matrix} u \\ v \\ \end{matrix} \right]= - \left[ \begin{matrix} I_{t1} \\ \vdots\\ I_{t2} \\ \end{matrix} \right]
⎣⎢⎡[IxIy]1⋮[IxIy]2⎦⎥⎤∗[uv]=−⎣⎢⎡It1⋮It2⎦⎥⎤
定义系数矩阵为A,等式由此向量为-b;:
A
=
[
[
I
x
I
y
]
1
⋮
[
I
x
I
y
]
2
]
,
b
=
[
I
t
1
⋮
I
t
2
]
A = \left[ \begin{matrix} \left[ \begin{matrix} I_{x}& I_{y} \\ \end{matrix} \right]_{1}\\ \vdots \\ \left[ \begin{matrix} I_{x}& I_{y} \\ \end{matrix} \right]_{2}\\ \end{matrix} \right],b =\left[ \begin{matrix} I_{t1} \\ \vdots\\ I_{t2} \\ \end{matrix} \right]
A=⎣⎢⎡[IxIy]1⋮[IxIy]2⎦⎥⎤,b=⎣⎢⎡It1⋮It2⎦⎥⎤
那么式子可以写为::
A
[
u
v
]
=
−
b
A \left[ \begin{matrix} u \\ v \\ \end{matrix} \right]=-b
A[uv]=−b
解关于u,v的超定方程,可以求解
:
[
u
v
]
=
−
A
+
b
=
−
(
A
T
A
)
−
1
A
T
b
\left[ \begin{matrix} u \\ v \\ \end{matrix} \right] = - A^{+}b = -(A^{T}A)^{-1}A^{T}b
[uv]=−A+b=−(ATA)−1ATb
在Slam中,LK方法常用来跟踪角点
在实际应用中,对于连续的两帧图像I,J;我们的可以将问题转化为求解向量
d
d
d的优化问题,
m
i
n
ε
(
d
)
=
=
Σ
Σ
(
I
(
x
)
−
I
(
x
+
d
)
)
2
minε(d)==ΣΣ(I(x)-I(x+d))^{2}
minε(d)==ΣΣ(I(x)−I(x+d))2
仿射矩阵
在实际场景中我们的数据都是离散的,具体的图像I和图像J可以代表前后两帧图像。对于图像特征点金字塔跟踪来说的目的是:对于前一帧的图像I上一点
P
i
(
u
,
v
)
P_{i}(u,v)
Pi(u,v),要在后一帧图像J上找到一点
P
j
(
u
+
d
u
,
v
+
d
v
)
P_{j}(u+du,v+dv)
Pj(u+du,v+dv)即
(
u
+
Δ
u
,
v
+
Δ
v
)
(u+Δu,v+Δv)
(u+Δu,v+Δv)与之相匹配,即灰度值最接近。那么向量
d
=
[
d
u
,
d
v
]
d=[du,dv]
d=[du,dv]就是图像在点
P
P
P处的运动速度,也就是所说像素点
P
P
P的光流。
进一步我们可以认为前一幅图像经过仿射变换得到了后一幅图像
下面
A
i
A_{i}
Ai为仿射矩阵,四个参数
d
u
u
,
d
v
v
,
d
u
v
,
d
v
u
duu,dvv,duv,dvu
duu,dvv,duv,dvu表征着图像中的仿射变形。
A
i
=
[
1
+
d
u
u
d
u
v
d
v
u
1
+
d
v
v
]
A_{i}=\left[ \begin{matrix} 1 + d_{uu} & d_{uv}\\ d_{vu} & 1 + d_{vv}\\ \end{matrix} \right]
Ai=[1+duudvuduv1+dvv]
进一步,图像匹配误差可以写为:
ε
(
d
,
A
)
=
ε
(
d
x
,
d
y
,
d
x
x
,
d
x
y
,
d
y
x
,
d
y
y
)
=
Σ
Σ
(
I
(
x
)
−
I
(
A
x
+
d
)
)
2
ε(d,A)=ε(d_{x},d_{y},d_{xx},d_{xy},d_{yx},d_{yy})=ΣΣ(I(x)-I(Ax+d))^{2}
ε(d,A)=ε(dx,dy,dxx,dxy,dyx,dyy)=ΣΣ(I(x)−I(Ax+d))2
参考资料
https://blog.csdn.net/zhonghuan1992/article/details/38508185
https://blog.csdn.net/qq_35368183/article/details/86601807
https://www.jianshu.com/p/e3570a9216a6
https://blog.csdn.net/App_12062011/article/details/51880258
https://blog.csdn.net/gh_home/article/details/51502933
高翔—《视觉SLAM十四讲》