matlab画hs算法,Matlab HS算法实现

function [us,vs] = HSoptflow(Xrgb,n)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Author: Gregory Power gregory.power@wpafb.af.mil

% This MATLAB code shows a Motion Estimation map created by

% using a Horn and Schunck motion estimation technique on two

% consecutive frames. Input requires.

% Xrgb(h,w,d,N) where X is a frame sequence of a certain

% height(h), width (w), depth (d=3 for color),

% and number of frames (N).

% n= is the starting frame number which is less than N

% V= the output variable which is a 2D velocity array

%

% Sample Call: V=HSoptflow(X,3);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[h,w,d,N]=size(Xrgb)

if n>N-1

error(1,'requested file greater than frame number required');

end;

%get two image frames

if d==1

Xn=double(Xrgb(:,:,1,n));

Xnp1=double(Xrgb(:,:,1,n+1));

elseif d==3

Xn=double(Xrgb(:,:,1,n)*0.299+Xrgb(:,:,2,n)*0.587+Xrgb(:,:,3,n)*0.114);

Xnp1=double(Xrgb(:,:,1,n+1)*0.299+Xrgb(:,:,2,n+1)*0.587+Xrgb(:,:,3,n+1)*0.114);

else

error(2,'not an RGB or Monochrome image file');

end;

%get image size and adjust for border

size(Xn)

hm5=h-5; wm5=w-5;

z=zeros(h,w); v1=z; v2=z;

%initialize

dsx2=v1; dsx1=v1; dst=v1;

alpha2=625;

imax=20;

%Calculate gradients

dst(5:hm5,5:wm5) = ( Xnp1(6:hm5+1,6:wm5+1)-Xn(6:hm5+1,6:wm5+1) + Xnp1(6:hm5+1,5:wm5)-Xn(6:hm5+1,5:wm5)+ Xnp1(5:hm5,6:wm5+1)-Xn(5:hm5,6:wm5+1) +Xnp1(5:hm5,5:wm5)-Xn(5:hm5,5:wm5))/4;

dsx2(5:hm5,5:wm5) = ( Xnp1(6:hm5+1,6:wm5+1)-Xnp1(5:hm5,6:wm5+1) + Xnp1(6:hm5+1,5:wm5)-Xnp1(5:hm5,5:wm5)+ Xn(6:hm5+1,6:wm5+1)-Xn(5:hm5,6:wm5+1) +Xn(6:hm5+1,5:wm5)-Xn(5:hm5,5:wm5))/4;

dsx1(5:hm5,5:wm5) = ( Xnp1(6:hm5+1,6:wm5+1)-Xnp1(6:hm5+1,5:wm5) + Xnp1(5:hm5,6:wm5+1)-Xnp1(5:hm5,5:wm5)+ Xn(6:hm5+1,6:wm5+1)-Xn(6:hm5+1,5:wm5) +Xn(5:hm5,6:wm5+1)-Xn(5:hm5,5:wm5))/4;

for i=1:imax

delta=(dsx1.*v1+dsx2.*v2+dst)./(alpha2+dsx1.^2+dsx2.^2);

v1=v1-dsx1.*delta;

v2=v2-dsx2.*delta;

end;

u=z; u(5:hm5,5:wm5)=v1(5:hm5,5:wm5);

v=z; v(5:hm5,5:wm5)=v2(5:hm5,5:wm5);

xskip=round(h/32);

[hs,ws]=size(u(1:xskip:h,1:xskip:w))

us=zeros(hs,ws); vs=us;

N=xskip^2;

for i=1:hs-1

for j=1:ws-1

hk=i*xskip-xskip+1;

hl=i*xskip;

wk=j*xskip-xskip+1;

wl=j*xskip;

us(i,j)=sum(sum(u(hk:hl,wk:wl)))/N;

vs(i,j)=sum(sum(v(hk:hl,wk:wl)))/N;

end;

end;

figure(1);

quiver(us,vs);

colormap('default');

axis ij;

axis tight;

axis equal;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值