我正在编写一个程序来跟踪一个小室内正在运行的飞行,我想要的是飞行中心的XY坐标。
为此,我首先使用fspecial('gaussian',[30 30],100)
和imfilter
使用高斯滤波器对每个帧进行滤波,以得到苍蝇所在的白色“云”。我需要这个来减少苍蝇中心的噪音。
我使用具有特定阈值的im2bw
将结果转换为二进制图像,以从上述云中获得白色斑点。
为了获得坐标,我使用regionprops
找到白色斑点的质心。
它已经运行良好,但它需要很长时间 - 大约6小时30分钟的视频;但帧速率是100 fps。
我已经发现高斯滤波占用了大部分时间 - 我能以某种方式调整这个过程吗?
我读到conv2
,据说速度更快,但它对二进制图像不起作用,是吗?将我的二进制图像转换为单个或双重图像会使它们混乱。
我已经在其他级别上处理了代码的性能,比如调整搜索窗口等,所以过滤就是我可以评估的内容。
提前致谢
答案 0 :(得分:0)
可能是平滑部分是不必要的,对图像进行简单的阈值处理可以非常清晰地识别苍蝇:
f=rgb2gray(imread('frame.png'));
BW=f>30;
props=regionprops(BW, 'BoundingBox');
imshow(f)
rectangle('Position',props.BoundingBox, 'LineWidth',2, 'EdgeColor','b');
结果:
要回答有关快速平滑的问题,您可以使用基于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
)
已过滤(
Filteredf
)