2014-03-25 72 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您在第二幅图像中看到的是范围转换突出显示的噪音。它也存在于你的原始图像中。使用阈值来摆脱它(请参阅我的编辑)。 –

相关问题