運動區域檢測方法(一)——幀間差分法的簡單實現

幀間差分法是一種通過對視頻圖像序列中相鄰兩幀作差分運算來獲得運動目標輪廓的方法,它可以很好地適用於存在多個運動目標和攝像機移動的情況。實現起來也較簡單,關鍵是對差分後的圖像進行二值化時需要選取適當的閾值shresold,我在這裏取的是通過多次嘗試得到的經驗值,以下是相應的matlab代碼和結果:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%幀間差分法
clear all;
clc;
avi=MMREADER('I:\\電影\\test.avi');                           %使用MMREADER方法讀入視頻流,拋棄aviread方法
VidFrames=read(avi,[10000,10050]);
N=4;                                             %考慮N幀的幀間差分法
start=10;                                        %起始幀
threshold=3;
for k=1+start:N+1+start                                              
    mov(k).cdata=rgb2gray(VidFrames(:,:,:,k));      %將彩色圖像轉換爲灰度圖像;
end
  [row,col]=size(mov(1+start).cdata);            %以mov(1+start).cdata的格式生成一個矩陣

  alldiff=zeros(row,col,N);                       %生成一個三維的矩陣alldiff用於存儲最終的各個幀的差分結果        

for k=1+start:N+start
  diff=abs(mov(k).cdata-mov(k+1).cdata);           %鄰幀差分
  idiff=diff<threshold;                           %二值化,idiff中的數據位邏輯值,diff中的數值爲unit8
  alldiff(:,:,k)=double(idiff);           
end

%觀察結果
i=1;
for k=1+start:N+start
    figure(i);
    imshow(alldiff(:,:,k))
    title(strcat(num2str(k),'幀','-',num2str(k+1),'幀'));
    i=i+1;
end

原視頻截圖

運行算法後效果圖1

運行算法後效果圖2

由輸出的結果可看出,只能得到運動區域的大致輪廓,這也正是幀間差分法的缺點,百度百科上是這麼論述幀間差分法的缺點的——能提取出對象的完整區域,只能提取出邊界;同時依賴於選擇的幀間時間間隔。對快速運動的物體,需要選擇較小的時間間隔,如果選擇不合適,當物體在前後兩幀中沒有重疊時,會被檢測爲兩個分開的物體:而對慢速運動的物體,應該選擇較大的時間差,如果時間選擇不適當,當物體在前後兩幀中幾乎完全重疊時,則檢測不到物體。

而且從兩張輸出的效果圖可以看到,圖片中存在明顯的“干擾點”,可以設想若是處理的視頻幀中剛好有多個運動中的但體積不大的區域,“干擾點”的影響會更大。

總結:幀間差分法實現簡單,但是效果一般。

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