Question

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

Était-ce utile?

La solution

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:

detected fly

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)

original pic Filtered (Filteredf)

smoothened

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top