運動區域檢測方法(二)——背景差分法的簡單實現

在前一篇博客中介紹了幀間差分法的簡單實現,本篇介紹另外一種常用的運動區域檢測方法,背景差分法。背景差分法是採用圖像序列中的當前幀和背景參考模型比較來檢測運動物體的一種方法,其性能依賴於所使用的背景建模技術。背景構建的方法有多種,簡單的有均值法、中值法,複雜點的有卡爾曼濾波器模型法、單高斯分佈模型法、雙高斯分佈模型法等,這裏我用的是均值法。以下是相應的matlab代碼和輸出結果:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%背景差分法
clear all;
clc;
avi=MMREADER('I:\\電影\\test.avi');
VidFrames=read(avi,[10000,10050]);
N=4;                                            
start=11;                                        
threshold=15;
bg(start).cdata=0;
i=1;
for k=start-10:start-1
    bg(k).cdata=rgb2gray(VidFrames(:,:,:,k));
    bg(start).cdata=abs((bg(start).cdata+bg(k).cdata)/i); %均值法構建背景
    i=i+1;
end
for k=1+start:N+1+start                                            
    mov(k).cdata=rgb2gray(VidFrames(:,:,:,k)); %轉化成灰度圖    
end
[row,col]=size(mov(1+start).cdata);            

alldiff=zeros(row,col,N); 
bgpic=zeros(row,col,1);
bgdata=bg(start).cdata>threshold;
bgpic(:,:,1)=double(bgdata);  
figure(1);
imshow(bgpic(:,:,1))   %輸出構建的背景

for k=1+start:N+start
    diff=abs(mov(k).cdata-bg(start).cdata);          
    idiff=diff>threshold;                           
    alldiff(:,:,k)=double(idiff);           
end

j=2;
for k=1+start:N+start
    figure(j);
    imshow(alldiff(:,:,k)) %輸出測試幀減去構建背景的效果
    title(strcat(num2str(k),'幀','-','背景'));
    j=j+1;
end

原視頻截圖

構建的背景

背景差分法效果1

背景差分法效果2

出來的效果着實嚇了我一跳,比之前用的幀間差分法得到的效果好太多有木有!不過這也跟我爲了方便選取的是測試起始幀前十個幀的數據用來構建背景有關,完整的背景差分法還涉及背景的更新,我這裏爲了方便看到效果就沒有涉及到這一點。從輸出的圖片中可以明顯看到所“檢測出來的運動區域”而非“運動區域的輪廓”,單這點來看背景差分法比幀間差分法效果好,該方法實現起來也較爲簡單。但是,在背景差分法中,複雜多變的場景將使得背景的構建和模擬變得困難,不可能只是像這裏單純取均值法便能夠輕鬆解決,而且由於背景圖像的動態變化,需要通過視頻序列的幀間信息來估計和恢復背景,即背景重建,所以要選擇性的更新背景。

總結:背景差分法檢測運動目標速度快,檢測準確,易於實現,關鍵在於背景圖像的獲取和適時地更新。可考慮與幀間差分法結合使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章