2014-03-25 78 views
1

我目前正在編寫一個程序來跟蹤在一個小房間中運行的飛行,我想要的是飛行中心的XY座標。 爲此,我首先用高斯濾波器使用fspecial('gaussian',[30 30],100)imfilter對每個幀進行濾波,以獲得蒼蠅所在的白色「雲」。我需要這個來減少飛行中心的噪音。 我使用具有一定閾值的im2bw將結果轉換爲二進制圖像,以從上述雲中獲取白色斑點。 爲了獲得座標,我使用regionprops來找到白色斑點的質心。 它已經可以正常工作,但它需要很長時間 - 30分鐘的視頻需要大約6小時;但幀速率爲100 fps。(Matlab)在二進制圖像上使用imfilter進行高斯濾波的性能

我已經發現高斯濾波佔用了大部分時間 - 我可以調整這個過程嗎? 我讀了約conv2,據說這是更快,但它不適用於二進製圖像,是嗎?並將我的二進制圖像轉換爲單或雙混淆它們。

我已經在其他級別上調試過代碼的性能,比如調整搜索窗口等等,所以過濾就是我所能評估的。

在此先感謝

回答

0

這可能是平滑的部分是不必要的,你的形象的一個簡單的閾值導致了相當清楚的識別飛:

f=rgb2gray(imread('frame.png')); 
BW=f>30; 
props=regionprops(BW, 'BoundingBox'); 
imshow(f) 
rectangle('Position',props.BoundingBox, 'LineWidth',2, 'EdgeColor','b'); 

結果:

detected fly

要回答你關於快速平滑的問題,你可以使用基於FFT的低通濾波器代替movin g高斯平滑你的幀更快。例如,對於一幀(掩模只需要執行一次):

f=rgb2gray(imread('frame.png')); 
D=30; 
[x,y]=size(f); 

%Generating a disc-shaped binary mask with radius D: 

Mask = fspecial('disk',D)==0; 
Mask = ~imresize(padarray(Mask, [floor((x/2)-D) floor((y/2)-D)], 1, 'both'), [x y]); 

% (Apply this to all the frames:) 

MaskedFFT=fftshift(fft2(f));.*Mask; 
Filteredf=abs(ifft2(MaskedFFT)); 

結果:

原件(f

original pic 過濾(Filteredf

smoothened

+0

以下是一個示例圖片: http://i.imgur.com/ 7YlMKpz.png 這是雙(圖片)所做的: http://i.imgur.com/7kctYTs.png – user3459888

+0

您的第一張圖像對我來說不是二元的,更像是灰度。 –

+0

@ user3459888您在第二幅圖像中看到的是範圍轉換突出顯示的噪音。它也存在於你的原始圖像中。使用閾值來擺脫它(請參閱我的編輯)。 –

相關問題