光流简介

光流简介
参考维基百科:光流简介

光流(Optical flow or optic flow)是关于视域中的物体运动检测中的概念。用来描述相对于观察者的运动所造成的观测目标、表面或边缘的运动。光流法在样型识别电脑视觉以及其他影像处理领域中非常有用,可用于运动检测、物件切割、碰撞时间与物体膨胀的计算、运动补偿编码,或者通过物体表面与边缘进行立体的测量等等。

光流的测算光流法实际是通过检测图像像素点的强度随时间的变化进而推断出物体移动速度及方向的方法。

在 2D+t 维的情况下(3D 和更高维度亦然),假设位于 {\displaystyle (x,y,t)} 的体素的亮度是 {\displaystyle I(x,y,t)}。该体素在两个图像帧之间移动了 \Delta x\Delta y\Delta t。于是可以得出一个亮度相同的结论:

{\displaystyle I(x,y,t)=I(x+\Delta x,y+\Delta y,t+\Delta t)} {\displaystyle I(x,y,t)=I(x+\Delta x,y+\Delta y,t+\Delta t)}

假设该移动很小,那么可以根据泰勒级数得出:

{\displaystyle 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+} {\displaystyle 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+}H.O.T.

因此可以推出:

{\displaystyle {\frac {\partial I}{\partial x}}\Delta x+{\frac {\partial I}{\partial y}}\Delta y+{\frac {\partial I}{\partial t}}\Delta t=0} {\displaystyle {\frac {\partial I}{\partial x}}\Delta x+{\frac {\partial I}{\partial y}}\Delta y+{\frac {\partial I}{\partial t}}\Delta t=0}

{\displaystyle {\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}}{\frac {\Delta t}{\Delta t}}=0} {\displaystyle {\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}}{\frac {\Delta t}{\Delta t}}=0}

最终可得出结论:

{\displaystyle {\frac {\partial I}{\partial x}}V_{x}+{\frac {\partial I}{\partial y}}V_{y}+{\frac {\partial I}{\partial t}}=0} {\displaystyle {\frac {\partial I}{\partial x}}V_{x}+{\frac {\partial I}{\partial y}}V_{y}+{\frac {\partial I}{\partial t}}=0}

这里的 {\displaystyle V_{x},V_{y}}{\displaystyle V_{x},V_{y}} 是 {\displaystyle x}x 和 {\displaystyle y}y 方向上的速率,或称为 {\displaystyle I(x,y,t)}{\displaystyle I(x,y,t)} 的光流。而 {\displaystyle {\tfrac {\partial I}{\partial x}}}{\displaystyle {\tfrac {\partial I}{\partial x}}}{\displaystyle {\tfrac {\partial I}{\partial y}}}{\displaystyle {\tfrac {\partial I}{\partial y}}} 和 {\displaystyle {\tfrac {\partial I}{\partial t}}}{\displaystyle {\tfrac {\partial I}{\partial t}}} 则是图像 {\displaystyle (x,y,t)}{\displaystyle (x,y,t)} 在对应方向上的偏导数{\displaystyle I_{x}}{\displaystyle I_{x}}{\displaystyle I_{y}}{\displaystyle I_{y}} 和 {\displaystyle I_{t}}{\displaystyle I_{t}} 的关系可用下式表述:

{\displaystyle I_{x}V_{x}+I_{y}V_{y}=-I_{t}} {\displaystyle I_{x}V_{x}+I_{y}V_{y}=-I_{t}}

{\displaystyle \nabla I^{T}\cdot {\vec {V}}=-I_{t}} {\displaystyle \nabla I^{T}\cdot {\vec {V}}=-I_{t}}
求解光流的算法有很多,其中最经典的是Lucas-Kanade Method,opencv中实现的也是该算法。

算法简介:

卢卡斯-金出方法是一种广泛使用的光流估计的差分方法,这个方法是由Bruce D. LucasTakeo Kanade发明的。它假设光流在像素点的邻域是一个常数,然后使用最小二乘法对邻域中的所有像素点求解基本的光流方程。

通过结合几个邻近像素点的信息,卢卡斯-金出方法(简称为L-K方法)通常能够消除光流方程里的多义性。而且,与逐点计算的方法相比,L-K方法对图像噪声不敏感。不过,由于这是一种局部方法,所以在图像的均匀区域内部,L-K方法无法提供光流信息。

L-K方法假设两个相邻帧的图像内容位移很小,且位移在所研究点p的邻域内为大致为常数。所以,可以假设光流方程 在以p点为中心的窗口内对所有的像素都成立。也就是说,局部图像流(速度)向量{\displaystyle (V_{x},V_{y})}{\displaystyle (V_{x},V_{y})}须满足:

{\displaystyle I_{x}(q_{1})V_{x}+I_{y}(q_{1})V_{y}=-I_{t}(q_{1})} {\displaystyle I_{x}(q_{1})V_{x}+I_{y}(q_{1})V_{y}=-I_{t}(q_{1})}
{\displaystyle I_{x}(q_{2})V_{x}+I_{y}(q_{2})V_{y}=-I_{t}(q_{2})} {\displaystyle I_{x}(q_{2})V_{x}+I_{y}(q_{2})V_{y}=-I_{t}(q_{2})}
{\displaystyle \vdots } \vdots
{\displaystyle I_{x}(q_{n})V_{x}+I_{y}(q_{n})V_{y}=-I_{t}(q_{n})} {\displaystyle I_{x}(q_{n})V_{x}+I_{y}(q_{n})V_{y}=-I_{t}(q_{n})}

其中,{\displaystyle q_{1},q_{2},\dots ,q_{n}}{\displaystyle q_{1},q_{2},\dots ,q_{n}} 是窗口中的像素,{\displaystyle I_{x}(q_{i}),I_{y}(q_{i}),I_{t}(q_{i})}{\displaystyle I_{x}(q_{i}),I_{y}(q_{i}),I_{t}(q_{i})}是图像在点{\displaystyle q_{i}}q_i和当前时间对位置xy和时间t的偏导。

这些等式可以写成矩阵的形式{\displaystyle Av=b}{\displaystyle Av=b},此处

{\displaystyle A={\begin{bmatrix}I_{x}(q_{1})&I_{y}(q_{1})\\[10pt]I_{x}(q_{2})&I_{y}(q_{2})\\[10pt]\vdots &\vdots \\[10pt]I_{x}(q_{n})&I_{y}(q_{n})\end{bmatrix}},\quad \quad v={\begin{bmatrix}V_{x}\\[10pt]V_{y}\end{bmatrix}},\quad {\mbox{and}}\quad b={\begin{bmatrix}-I_{t}(q_{1})\\[10pt]-I_{t}(q_{2})\\[10pt]\vdots \\[10pt]-I_{t}(q_{n})\end{bmatrix}}} {\displaystyle A={\begin{bmatrix}I_{x}(q_{1})&I_{y}(q_{1})\\[10pt]I_{x}(q_{2})&I_{y}(q_{2})\\[10pt]\vdots &\vdots \\[10pt]I_{x}(q_{n})&I_{y}(q_{n})\end{bmatrix}},\quad \quad v={\begin{bmatrix}V_{x}\\[10pt]V_{y}\end{bmatrix}},\quad {\mbox{and}}\quad b={\begin{bmatrix}-I_{t}(q_{1})\\[10pt]-I_{t}(q_{2})\\[10pt]\vdots \\[10pt]-I_{t}(q_{n})\end{bmatrix}}}

此方程组的等式个数多于未知数个数,所以它通常是超定的。L-K方法使用最小二乘法获得一个近似解,即计算一个2x2的方程组:

{\displaystyle A^{T}Av=A^{T}b} {\displaystyle A^{T}Av=A^{T}b} 或
{\displaystyle \mathrm {v} =(A^{T}A)^{-1}A^{T}b} {\displaystyle \mathrm {v} =(A^{T}A)^{-1}A^{T}b}

其中,{\displaystyle A^{T}}A^T是矩阵{\displaystyle A}A转置。即计算:

{\displaystyle {\begin{bmatrix}V_{x}\\[10pt]V_{y}\end{bmatrix}}={\begin{bmatrix}\sum _{i}I_{x}(q_{i})^{2}&\sum _{i}I_{x}(q_{i})I_{y}(q_{i})\\[10pt]\sum _{i}I_{y}(q_{i})I_{x}(q_{i})&\sum _{i}I_{y}(q_{i})^{2}\end{bmatrix}}^{-1}{\begin{bmatrix}-\sum _{i}I_{x}(q_{i})I_{t}(q_{i})\\[10pt]-\sum _{i}I_{y}(q_{i})I_{t}(q_{i})\end{bmatrix}}} {\displaystyle {\begin{bmatrix}V_{x}\\[10pt]V_{y}\end{bmatrix}}={\begin{bmatrix}\sum _{i}I_{x}(q_{i})^{2}&\sum _{i}I_{x}(q_{i})I_{y}(q_{i})\\[10pt]\sum _{i}I_{y}(q_{i})I_{x}(q_{i})&\sum _{i}I_{y}(q_{i})^{2}\end{bmatrix}}^{-1}{\begin{bmatrix}-\sum _{i}I_{x}(q_{i})I_{t}(q_{i})\\[10pt]-\sum _{i}I_{y}(q_{i})I_{t}(q_{i})\end{bmatrix}}}

i=1 到 n求和。

矩阵{\displaystyle A^{T}A}{\displaystyle A^{T}A}通常被称作图像在点p的 结构张量


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值