问题
I am currently coding a program to keep track of a running fly in a small chamber, what I want is XY-coordinates of the center of the fly.
For this I first filter each frame with a Gaussian filter using fspecial('gaussian',[30 30],100)
and imfilter
to get a white "cloud" where the fly is. I need this to reduce noise of the center of the fly.
I convert the outcome into a binary image using im2bw
with a certain threshold to get a white blob from the aforementioned cloud.
To get the coordinates, I use regionprops
that finds the centroid of the white blob.
It already works fine, but it takes ages - roughly 6 hours for 30 minutes of video; the framerate is 100 fps, though.
I have figured out that the Gaussian filtering takes up most of the time - can I tweak this process somehow?
I read about conv2
, which is said to be faster but it does not work on binary images, does it? And converting my binary images to single or double messes them up.
I already worked on the code's performance on other levels, like adjusting the search window etc., so the filtering is what is left as far as I can assess.
Thanks in advance
回答1:
It might be that the smoothing part is unnecessary, a simple thresholding of your image leads to a pretty clear identification of the fly:
f=rgb2gray(imread('frame.png'));
BW=f>30;
props=regionprops(BW, 'BoundingBox');
imshow(f)
rectangle('Position',props.BoundingBox, 'LineWidth',2, 'EdgeColor','b');
Result:

To answer your question about fast smoothing, you could use FFT-based low-pass filtering instead of a moving gaussian to smoothen your frames much faster. Example for one frame (the mask needs only to be done once):
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));
Result:
Original (f
)

Filteredf
)

来源:https://stackoverflow.com/questions/22637069/matlab-performance-of-gaussian-filtering-using-imfilter-on-a-binary-image