H-S光流算法及仿真总结 下载本文

H-S光流算法及仿真总结

一、光流的概念

二维图像是三维实景在成像面的投影,反映了三维实景中物体的位置等信息。

假设Po是三维实景中的一点,Pi是Po在成像面上的投影,Po的运动反映在成像面中就是Pi的运动,假设Po在δt时间内运动了δs到Po’,Pi则运动了δs’到Pi,Pi运动的速度为

?s'。如下图所示: ?tPo’ 成像面Po Pi Pi’ 图1 Po的运动在成像面上反映为Pi的运动

Pi的运动速度

景中物体的位置、运动等信息。

?s'就是Pi的光流。由此得出,光流就是三维实景在成像面?t上的投影的运动速度。三维实景中的某一点在成像面上的投影的运动速度形成点光流,所有点在成像面上的投影的运动速度则形成光流场。光流场反映了三维实

光照的变化必然引起光流的变化,有些运动不产生光流,如光照不变时,均匀亮度的球体绕中心轴自转的运动。因此我们在研究实际问题时常常假设光照亮度不变。

二、光流的H-S算法

1、光流基本约束方程

假定:1、图像的灰度始终不变,2、光流在整个图像中满足一定的约束条件,

1

即全局性约束,3光流在整个图像中均匀变化, 无重叠,即平滑性约束。

设I(x,y,t)是图像上点(x,y)某一时刻t的亮度,u(x,y)和v(x,y)分别是点(x,y)在x方向和y方向上的光流分量,点(x,y)在t+δt时间内运动到(x+δx,y+δy),其中,δx=u*δt,δy=v*δt。

由于亮度不变,所以有

I(x+δx,y+δy,t+δt)=I(x,y,t) 用泰勒级数展开得

I(x,y,t)??I?I?Idx?dy?dt???I(x,y,t) ?x?y?t其中ε是关于δx、δy、δt的二阶以上的项,可以忽略不计 两边同除以δt得

?Idx?IdydI???0 ?xdt?ydtdtIx?设

?I?I?IdxdyIy?It?u?v??y,?x,?t,dt,dt,则有

光流基本约束方程

Ixu?Iyv?It?0

2、H-S提出的光流算法迭代方程 迭代方程

u(k?1)?u(k)?IxIxu(k)?Iyv(k)?It??I?I22x2y,v(k?1)?v(k)?IyIxu(k)?Iyv(k)?It??I?I22x2y

其中,k是迭代次数, u和v是光流局部平均值,?为权重系数。 三、H-S光流算法在matlAB中的仿真

1、利用imread()读取用来计算光流的两幅图像im1和im2 ; 2、利用函数rgb2gray()将两幅图像转化为灰度值并存入im1、im2; 3、利用构造函数smoothImg()对im1、im2进行平滑性处理,公式如下:

G?12??e2???1,x?(?,),??2(3?)2??22,其中

?x2Im1=Conv2(conv2(im1,G,),G),Im2=Conv2(conv2(im2,G,),G),conv2()为求卷积函数

2

4、设置u、v的初始值,都取0;

5、利用构造函数computeDerivatives()求Ix、Iy和It,公式如下: Ix = conv2(im1,0.25* [-1 1; -1 1]) + conv2(im2, 0.25*[-1 1; -1 1]) Iy = conv2(im1, 0.25*[-1 -1; 1 1]) + conv2(im2, 0.25*[-1 -1; 1 1]) It = conv2(im1, 0.25*ones(2)) + conv2(im2, -0.25*ones(2)) 6、利用卷积求u和v,公式如下: uAvg=conv2(u,kernel_1) vAvg=conv2(v,kernel_1)

kernel_1= [1/12 1/6 1/12;1/6 0 1/6;1/12 1/6 1/12] 7、利用H-S迭代公式求u、v

??u(k?1)?u(k)?Ixλ=1

Ixu(k)?Iyv(k)?It??I?I22x2yv(k?1)?v(k)?Iy,

Ixu(k)?Iyv(k)?It2?2?Ix2?Iy,k=100,

8、利用quiver()绘制光流图。

3