對于某些運動元素的提取,我們仍然可以依據靜態影像提取的方法,比如R-G分量差提取等,前提是目標有某些獨有的特征,考慮一幅運動影像——
目標是運動的,背景是禁止的,目標以紅色為主,背景含有區域靜止的紅色,像這種情況單從靜態方法分析就很難了,
對于類似上述的影像,最簡單的提取方法是幀間差分與背景差分,這兩種演算法程序簡單,但局限性也明顯:幀間差分容易濾掉靜止的元素,但提取的
影像會不完整(有時會只有目標的輪廓),而且比較依賴幀速,幀速慢容易導致ghost現象(提取到兩個目標),幀速快可能誤判為靜止元素而被濾除,背
景差分可以提取比較完整的目標,但背景的更新是個難題(如原本的運動體在視野范圍靜止后需要將其歸入背景,原本靜止的運動體開始運動后需要將其從
背景里剔除,并且背景的更新同時還要保證提取的完整性),
對于幀間差分,通常采用三幅影像的后向差分,可以很好地避免ghost現象;而背景差分可以用兩幅影像與背景差分,將差分結果的相同部分在背景里
更新,本文只探究最基本的演算法實作,
幀間差分:
下圖是三幅影像的合成圖,可以看到左邊紅車的位移,右邊紅車完全靜止,如果采用R-G分量不能單獨提取出運動車輛,采用三幀間差分的效果左圖:

背景差分:
依然以上面例子為例(省去靜止的紅車),選擇三幅影像,
首先是三次位移的背景,第一次直接取第一幅影像,這里采用R-B分量差來灰度化(避免斑馬線的干擾),后兩幅都是更新所得:

然后是三次讀取的原影像,采用R-B分量差來灰度化:

最后是背景差分提取的結果:

需要說明的是,這三幅圖選得并不連續,如果連續的話,存在車重疊現象,這樣比較難更新背景,可能會有更好地演算法來消除這個BUG!
以下是matlab仿真測驗代碼:
%三幀間差分function framediff(prevframefile,curframefile,nxtframefile,thres,destination) prevframe=imread(prevframefile); curframe=imread(curframefile); nxtframe=imread(nxtframefile); diffa=uint8(abs(int16(curframe(:,:,1))-int16(prevframe(:,:,1)))); diffb=uint8(abs(int16(curframe(:,:,1))-int16(nxtframe(:,:,1)))); [sizex,sizey]=size(diffa); for i=1:sizex for j=1:sizey if diffa(i,j)<thres ||diffb(i,j)<thres %if diffa(i,j)<thres diffa(i,j)=0; else diffa(i,j)=255; end end end imwrite(diffa,destination,'jpg'); %imshow(diffa); end
%自更新的背景差分function backgrounddiff(videofile,start_index,end_index,step,thres) video=VideoReader(videofile); frame_amount=video.NumberOfFrame; width=video.Width; height=video.Height; if (end_index>frame_amount) end_index=frame_amount; %防止索引出界 end %background=rgb2gray(read(video,start_index)); background=read(video,start_index); background=background(:,:,1)-background(:,:,2); %R-G %prevdiff=logical(zeros(height,width)); prevdiff=imbinarize(background,thres/255); for i=start_index+step:step:end_index imwrite(background,strcat('video','\back',num2str(i),'.jpg'),'jpg'); %curframe=rgb2gray(read(video,i)); curframe=read(video,i); curframe=curframe(:,:,1)-curframe(:,:,2); diffa=uint8(abs(int16(curframe)-int16(background))); diffa=imbinarize(diffa,thres/255); for j=1:height for k=1:width if diffa(j,k)==1&&prevdiff(j,k)==1 background(j,k)=curframe(j,k);%更新背景 diffa(j,k)=0; end end end prevdiff=diffa; %imshow(diffa); imwrite(curframe,strcat('video','\curframe',num2str(i),'.jpg'),'jpg'); imwrite(diffa,strcat('video','\diffb',num2str(i),'.jpg'),'jpg'); end end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/73671.html
標籤:其他
上一篇:遵循統一的機器學習框架理解SVM
