matlab前景分割

用最简单的差分法实现了一下前景分割。使用的mall数据集。

思路是这样的:首先设定一个队列的长度,若读取的图片张数少于队列长度则以当前读取到的图片做平均。否则则以队列中的图片做平均。

这样之后和当前图片做差分,大于差分阈值的就是前景。

%init
close all ;
path = './mall_dataset/frames/'; 
numofImages = 30 ;
image_cells = cell(numofImages,1) ;
E = cell(numofImages,1) ;
Em = cell(numofImages,1) ;

%param
Wh = 10 ;%人高
Ww = 5 ;%人宽
defualtLenOfList = 5 ;%前景差分时默认的队列长度
dif_t = 60 ;%差分阈值

%kenel
gaussian_kenel = fspecial('gaussian',3,0.5) ;

%program
for i=1:numofImages
    temp = i ;
    prefix = 'seq_00' ;
    while temp < 1000
        prefix = strcat(prefix,'0') ;
        temp = temp*10 ;
    end
    prefix = strcat(prefix,num2str(i)) ;
    I=imread([path,prefix,'.jpg']); %依次读取每一幅图像
    I = rgb2gray(I);
    I = imfilter(I,gaussian_kenel) ;
    %I = uint8(I) ;
    [Gmag,Gdir] = imgradient(I) ;
    E{i}.Gmag =  Gmag;
    E{i}.Gdir = Gdir ;
    image_cells{i} = I ;
    %todo strip高=wp/W? 不一定好
    %差分处理
    Gmean = 0 ;
    if i~=1
        
        if i>defualtLenOfList
            lenoflist = defualtLenOfList ;
        else
            lenoflist = i-1 ;
        end
        
        Lstart = i-lenoflist ;
        Ltail = i-1 ;
        for j=Lstart:Ltail
            Gmean = Gmean + (E{j}.Gmag ./ lenoflist) ;
        end
        
        Lmean = 0 ;if lenoflist>=defualtLenOfList
            for k=Lstart:Ltail
                Lmean = Lmean + (E{k}.Gmag./lenoflist) ;
            end
            for k=Lstart:Ltail
                Lvar = Lvar+((E{k}.Gmag-Lmean).^2)./lenoflist ;
            end
        end 
        
        Gmoving = E{i}.Gmag - Gmean ;
        Gmoving = Gmoving .* (Gmoving>dif_t) ;
        G = uint8(Gmoving);
        imshow(G) ;
    end
end