%清除命令窗口
clc;
clear;
clear all;
%读入并显示两幅图像
a1=imread('frame07.png');
a2=imread('frame08.png');
%对两帧图像进行均值滤波
b1=double(a1(:,:,1));
b2=double(a2(:,:,1));
[m1,n1]=size(b1);
[m2,n2]=size(b2);
image1=zeros(m1,n1);
image2=zeros(m2,n2);
for i=2:m1-1
for j=2:n1-1
image1(i,j)=(b1(i-1,j-1)+ b1(i-1,j)+b1(i-1,j+1)+b1(i,j-1)+b1(i,j)+b1(i,j+1)+b1(i+1,j-1)+b1(i+1,j)+b1(i+1,j+1))/9;
end
end
image1=uint8(image1);
figure(3);
imshow(image1) ;
for i=2:m2-1
for j=2:n2-1
image2(i,j)=(b2(i-1,j-1)+ b2(i-1,j)+b2(i-1,j+1)+b2(i,j-1)+b2(i,j)+b2(i,j+1)+b2(i+1,j-1)+b2(i+1,j)+b2(i+1,j+1))/9;
end
end
image2=uint8(image2);
figure(4);
imshow(image2)
%初始化
z=zeros(m1,n1);
aa=z;bb=z;cc=z;
avgu=z;avgv=z;
%v1=z; v2=z;
u=z;v=z;
alpha=625;
n=32;
%计算Ix,Iy,It的值
for i=3:m1-1
for j=3:n1-1
aa(i,j)=( image2(i+1,j+1)-image2(i,j+1) + image2(i+1,j)-image2(i,j)+ image1(i+1,j+1)-image1(i,j+1) +image1(i+1,j)-image1(i,j))/4;%基于x方向
bb(i,j)=( image2(i+1,j+1)-image2(i+1,j) + image2(i,j+1)-image2(i,j)+ image1(i+1,j+1)-image1(i+1,j) +image1(i,j+1)-image2(i,j))/4; %基于y方向
cc(i,j)=( image2(i+1,j+1)-image1(i+1,j+1) + image2(i+1,j)-image1(i+1,j)+ image2(i,j+1)-image1(i,j+1) +image2(i,j)-image1(i,j))/4; %基于t方向
end
end
%计算u、v值
% for k=1:n
% for i=3:m1-1
% for j=3:n1-1
% avgu(i,j)=(u(i-1,j)+u(i+1,j)+u(i,j-1)+u(i,j+1))/4;
% avgv(i,j)=(v(i-1,j)+v(i+1,j)+v(i,j-1)+v(i,j+1))/4;
% delta(i,j)=(aa(i,j).*avgu(i,j)+bb(i,j).*avgv(i,j)+cc(i,j))./(alpha+aa(i,j).^2+bb(i,j).^2);
% u(i,j)=avgu(i,j)-aa(i,j).*delta(i,j);
% v(i,j)=avgv(i,j)-bb(i,j).*delta(i,j);
% end
% end
% end;
%计算u、v值
for k=1:n
for i=3:m1-1
for j=3:n1-1
delta(i,j)=(aa(i,j).*u(i,j)+bb(i,j).*v(i,j)+cc(i,j))./(alpha+aa(i,j).^2+bb(i,j).^2);
u(i,j)=u(i,j)-aa(i,j).*delta(i,j);
v(i,j)=v(i,j)-bb(i,j).*delta(i,j);
end
end
end;
% 显示光流场
dd=round(m1/20);
[m3,n3]=size(u(1:dd:m1,1:dd:n1));
us=zeros(m3,n3); vs=us;
a=us;b=us;
N=dd^2;
for i=1:m3-1
for j=1:n3-1
mx=i*dd-dd+1;
my=i*dd;
nx=j*dd-dd+1;
ny=j*dd;
for m=mx:my
for n=nx:ny
a(i,j)=a(i,j)+u(m,n);
b(i,j)=b(i,j)+v(m,n);
end
end
us(i,j)=a(i,j)/N;
vs(i,j)=b(i,j)/N;
end;
end;
figure(5);
quiver(us,vs);
axis ij;
axis tight;
axis equal;
% 量化显示
for i=1:m1
for j=1:n1
u(i,j)=abs(u(i,j));
end
end
out=zeros(m1,n1);
x=u(3:m1-1,3:n1-1);
min1=0;max1=255;
min=min(x(:))
max=max(x(:))
N=255;
Q=(max-min)/N % 量化步长
for i=3:m1-1
for j=3:n1-1
out(i,j)=round(u(i,j)/Q)+min1;
end
end
out=uint8(out);
figure(6)
imshow(out)
% 量化后二值化处理
erzhi=zeros(m1,n1);
for i=1:m1
for j=1:n1
if out(i,j)>50
erzhi(i,j)=255;
else erzhi(i,j)=0;
end
end
end
erzhi=uint8(erzhi);
figure(7)
imshow(erzhi)
% 闭运算
se1 = strel('disk',5);
se2 = strel('ball',5,5);
peng=imdilate(erzhi,se2);
fu=imerode(peng,se1);
peng1=imdilate(peng,se2);
fu1=imerode(peng1,se1);
peng2=imdilate(peng1,se2);
fu2=imerode(peng2,se1);
figure(9)
imshow(fu2)