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)