www.pudn.com > backgroundtest.rar > motiontest1.m
%先把第一帧和最后一帧作差分,把模糊目标区域提取出来并对该区域用“逐像素检测法”提取背景。
%生成L(n,:)格式,以用于后面的循环语句结构;
I=ones(8,5);
q=reshape(49:56,8,1);
I(:,1)=q;
I(:,2)='.';
I(:,3)='b';
I(:,4)='m';
I(:,5)='p';
L=setstr(I); %将ASCII码转为字符串;
% 将8帧图像的像素转为一个三维矩阵,求出n\8帧图像中对应像素的max与min值,通过分别计算
% max,min与中间值的距离大小,取间距小的(2\n)四个像素的平均值作为该像素的最终值。
% % 此算法基于下列假设:截取的视频帧数足够的多,以至于在某一像素上存在运动目标的
% % 帧数比不存在运动目标的帧数要多。
c=imread(L(1,:));
[m n]=size(c);
I0=uint8(ones(m,n,8));
%连续读取n\8帧图像,用图像数据生成矩阵I0(:,:,n),1~n维分别对应1~n帧图像。
for k=1:8
j=imread(L(k,:));
I0(:,:,k)=j;
end
[m n o]=size(I0);
Q=uint8(ones(m,n));
%因为uint8型的范围是0~255,要使两值相减得出正确的值只能将其转化为double型的。
%两uint8型相减可能出现负值,此时如果结果也定义为uint8型,那结果会将负值置为0;
%如果结果为大于255的值,则结果会将其置为255。
I1=double(I0(:,:,1));
I8=double(I0(:,:,8));
AA=abs(I1-I8);
for i=1:m;
for j=1:n;
if AA(i,j)>10
z=I0(i,j,:);
q=median(z);
x=max(z);
y=min(z);
t1=abs(x-q);
t2=abs(y-q);
if t1>t2
Q(i,j)=q-(t2/2);
else
Q(i,j)=q+(t1/2);
end
else
Q(i,j)=I1(i,j);
end
end
end
%Q(i,j)为提取的背景图像数据。
%提取运动物体
Q0=double(Q);
IQ=I1-Q0;
iq=uint8(abs(IQ));
for i=1:m;
for j=1:n;
if iq(i,j)>10
iq(i,j)=I1(i,j);
else iq(i,j)=0;
end
end
end
iq=medfilt2(iq,[3 3]);
imshow(Q);
figure,imshow(iq)