我目前正在编写一个程序来跟踪小室中运行的苍蝇,我想要的是苍蝇中心的 XY 坐标。
为此,我首先使用高斯滤波器过滤每个帧fspecial('gaussian',[30 30],100)
and imfilter
在苍蝇所在的地方得到一朵白色的“云”。我需要这个来减少苍蝇中心的噪音。
我使用将结果转换为二进制图像im2bw
具有一定的阈值从上述云中获取白色斑点。
为了获取坐标,我使用regionprops
找到白色斑点的质心。
它已经运行良好,但需要很长时间 - 30 分钟的视频大约需要 6 小时;不过,帧速率为 100 fps。
我发现高斯滤波占用了大部分时间 - 我可以以某种方式调整这个过程吗?
我读到conv2
,据说速度更快,但它不适用于二值图像,是吗?将我的二进制图像转换为单图像或双图像会使它们变得混乱。
我已经在其他级别上研究了代码的性能,例如调整搜索窗口等,因此据我评估,剩下的就是过滤。
提前致谢
平滑部分可能是不必要的,对图像进行简单的阈值处理可以非常清晰地识别苍蝇:
f=rgb2gray(imread('frame.png'));
BW=f>30;
props=regionprops(BW, 'BoundingBox');
imshow(f)
rectangle('Position',props.BoundingBox, 'LineWidth',2, 'EdgeColor','b');
Result:
要回答有关快速平滑的问题,您可以使用基于 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));
Result:
原来的 (f
)
Filtered (Filteredf
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)