(Matlab)在二进制图像上使用imfilter进行高斯滤波的性能

时间:2014-03-25 14:08:47

标签: performance matlab filter gaussian

我正在编写一个程序来跟踪一个小室内正在运行的飞行,我想要的是飞行中心的XY坐标。 为此,我首先使用fspecial('gaussian',[30 30],100)imfilter使用高斯滤波器对每个帧进行滤波,以得到苍蝇所在的白色“云”。我需要这个来减少苍蝇中心的噪音。 我使用具有特定阈值的im2bw将结果转换为二进制图像,以从上述云中获得白色斑点。 为了获得坐标,我使用regionprops找到白色斑点的质心。 它已经运行良好,但它需要很长时间 - 大约6小时30分钟的视频;但帧速率是100 fps。

我已经发现高斯滤波占用了大部分时间 - 我能以某种方式调整这个过程吗? 我读到conv2,据说速度更快,但它对二进制图像不起作用,是吗?将我的二进制图像转换为单个或双重图像会使它们混乱。

我已经在其他级别上处理了代码的性能,比如调整搜索窗口等,所以过滤就是我可以评估的内容。

提前致谢

1 个答案:

答案 0 :(得分: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的低通滤波代替移动高斯滤波来更快地平滑帧。一帧的示例(掩码只需要完成一次):

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