经典光流计算方法(HS光流法、Lucas-Kanada方法、Pyramidal LK方法)

光流法介绍参看:光流法—光流场估计概念

预备知识:梯度法

  最早的基于梯度的光流计算方法是于1980年发表的。这个算法的基本原理如下所述:假定 ( x , y , t ) (x,y,t) (x,y,t)是时刻 t t t在图像位置 ( x , y ) (x,y) (x,y)的灰度值。 u ( x , y ) u(x,y) u(x,y) v ( x , y ) v(x,y) v(x,y)是光流在位置 ( x , y ) (x,y) (x,y) x x x y y y方向的分量。如果我们假设在时刻 t + δ t t+\delta t t+δt,在位置 ( x + δ x , y + δ y ) (x+\delta x,y+\delta y) (x+δx,y+δy)的灰度值保持不变,那么如下等式成立:

I ( x + u δ t , y + v δ t , t + δ t ) = I ( x , y , t ) I(x+u\delta t,y+v\delta t,t+\delta t)=I(x,y,t) I(x+uδt,y+vδt,t+δt)=I(x,y,t)

其中, δ x = u δ t , δ y = v δ t \delta x=u\delta t,\delta y=v\delta t δx=uδt,δy=vδt. δ t \delta t δt代表一个小的时间间隔。接下来,利用泰勒公式展开等式的左侧如下:

I ( x , y , t ) + δ x ∂ I ∂ x + δ y ∂ I ∂ y + δ t ∂ I ∂ t + e = I ( x , y , t ) I(x,y,t)+\delta x\frac{\partial I}{\partial x}+\delta y\frac{\partial I}{\partial y}+\delta t\frac{\partial I}{\partial t}+e=I(x,y,t) I(x,y,t)+δxxI+δyyI+δttI+e=I(x,y,t)

这里 e e e表示 δ x \delta x δx δ y \delta y δy δ t \delta t δt中的二阶和高阶项。消掉左侧和右侧的 I ( x , y , t ) I(x,y,t) I(x,y,t)相同项,并忽略掉 e e e值。对上式分别除 δ t \delta t δt并整理,有:

∂ I ∂ x δ x ∂ t + ∂ I ∂ y δ y ∂ t + ∂ I ∂ t δ t ∂ t = 0 \frac{\partial I}{\partial x}\frac{\delta x}{\partial t}+\frac{\partial I}{\partial y}\frac{\delta y}{\partial t}+\frac{\partial I}{\partial t}\frac{\delta t}{\partial t}=0 xItδx+yItδy+tItδt=0

u ( x , y ) = δ x ∂ t , v ( x , y ) = δ y ∂ t u(x,y)=\frac{\delta x}{\partial t},v(x,y)=\frac{\delta y}{\partial t} u(x,y)=tδx,v(x,y)=tδy,则有:

I x u ( x , y ) + I y v ( x , y ) + I t = 0 I_x u(x,y)+I_y v(x,y)+I_t=0 Ixu(x,y)+Iyv(x,y)+It=0

  这里,倒数 I x , I y , I t I_x,I_y,I_t Ix,Iy,It可以计算图像灰度差得来。上式显然是一个基本用于推断光流方程的约束,但是实际上要同时计算 u ( x , y ) , v ( x , y ) u(x,y),v(x,y) u(x,y),v(x,y),一个方程是不够的,因此很多方法都在致力于寻找方程的边界条件,下边几种方法也是在该方程基础上增加约束求解光流方程的。

HS光流法

HS光流计算基于物体移动的光学特性的两个假设:

  1. 运动物体的灰度在很短的间隔时间内保持不变
  2. 给定邻域内的速度向量场变化是缓慢的

由梯度法知:
在这里插入图片描述

该式子就是光流约束方程,它反映了灰度与速度的一个对应关系,但是一个式子中有两个变量: u u u v v v,显然不能将速度解出,因此需要引入一个新的条件:光流的全局平滑约束条件

u u u v v v 随着像素点移动而发生的改变是缓慢的,局部区域的变化不大,尤其是在目标做无变形刚体运动时,局部区域速度的空间变化率为0。

因此,引入以下速度平滑项:
在这里插入图片描述
对于所有的像素点,需要满足上式和最小,综合光流约束条件和速度平滑约束条件,可建立以下的极小化方程:
在这里插入图片描述
式中的 α 是平滑权重系数,表示速度光滑项所占的权重。

在这里插入图片描述

可以用欧拉-拉格朗日方程求解

∂ L ∂ u − ∂ ∂ x ∂ L ∂ u x − ∂ ∂ y ∂ L ∂ u y = 0 ∂ L ∂ v − ∂ ∂ x ∂ L ∂ v x − ∂ ∂ y ∂ L ∂ v y = 0 \frac{\partial L}{\partial u}-\frac{\partial}{\partial x}\frac{\partial L}{\partial u_x}-\frac{\partial}{\partial y}\frac{\partial L}{\partial u_y}=0 \\ \frac{\partial L}{\partial v}-\frac{\partial}{\partial x}\frac{\partial L}{\partial v_x}-\frac{\partial}{\partial y}\frac{\partial L}{\partial v_y}=0 uLxuxLyuyL=0vLxvxLyvyL=0

得:
I x ( I x u + I y v + I t ) − α 2 Δ u = 0 I y ( I x u + I y v + I t ) − α 2 Δ v = 0 I_x(I_xu+I_yv+I_t)-\alpha ^2 \Delta u=0 \\ I_y(I_xu+I_yv+I_t)-\alpha ^2 \Delta v=0 Ix(Ixu+Iyv+It)α2Δu=0Iy(Ixu+Iyv+It)α2Δv=0

式中,拉普拉斯算子可以用某一点的速度与其周围速度平均值之差来近似,有:

在这里插入图片描述
在这里插入图片描述

化简得:

在这里插入图片描述
在这里插入图片描述

求解可以使用迭代的方法,使用第 k k k步的 u , v u,v u,v来计算 k + 1 k+1 k+1步的 u , v u,v u,v

Lucas-Kanada方法

由梯度法知有下列式子成立, V x V_x Vx等同于上式的 u u u V y V_y Vy等同于上式的 v v v

马上补充
LK方法假设以下条件成立:

  1. 亮度恒定
  2. 时间连续或者运动是小运动
  3. 空间一致,临近点有相似的运动

那么可与选取图像的多个邻域,每个邻域中的点都满足上述方程,这样可以得到一系列方法:

在这里插入图片描述
写成矩阵形式:

在这里插入图片描述
通过最小二乘法求解得光流场:

Pyramidal LK方法

  但是对于LK方法中,需要计算矩阵的逆,一些时候方程的选取会造成解的不稳定,另一方面,假设图像亮度恒定、运动较小这个条件是很苛刻的,所以在此基础上,Pyramidal LK采用金字塔形式作出了改良:

在这里插入图片描述

  低采样率代表图像的粗计算过程,用来识别较大的运动;高采样率代表图像的经计算过程,用来识别较小的运动;对应运动向量的计算过程实际上就是先找出大的运动向量在逐渐细化,计算小的运动向量,并能够通过小的运动量纠正大的运动量的计算偏差。

计算公式为:

在这里插入图片描述

MATLAB 中可以使用光流法(Horn-Schunck 光流法)来估计图像序列中的光流。下面是一种实现光流法的简单方法: 1. 读取图像序列:使用 MATLAB 的 imread 函数读取一系列图像,组成图像序列。可以将这些图像存储在一个矩阵中,每一帧图像作为矩阵的一个元素。 2. 灰度化:使用 MATLAB 的 rgb2gray 函数将图像序列转换为灰度图像序列。这是因为光流法对灰度图像效果更好。 3. 计算光流:使用 MATLAB 的 vision.OpticalFlow 光流估计对象来计算光流。创建一个光流估计对象,然后使用其 estimateFlow 计算方法进行计算。可以选择不同的光流算法,这里选择 Horn-Schunck 算法。 ```matlab % 创建光流估计对象 opticalFlow = vision.OpticalFlow('Method', 'Horn-Schunck'); % 依次对每一帧图像计算光流 for i = 2:size(graySequence, 4) flow = estimateFlow(opticalFlow, graySequence(:, :, :, i)); % 在图像上绘制光流向量 imshow(graySequence(:, :, :, i)); hold on plot(flow, 'ScaleFactor', 10); hold off drawnow; end ``` 4. 可视化光流:使用 MATLAB 的 plot 函数在图像上绘制光流向量,以便可视化光流的方向和强度。这些光流向量可用于分析图像序列中的运动。 上述代码中的 graySequence 表示灰度图像序列的矩阵,第一个维度表示图像的高度,第二个维度表示图像的宽度,第三个维度表示通道数(在灰度图像中为1),第四个维度表示帧数。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

负壹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值