用最简单的差分法实现了一下前景分割。使用的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