【问题标题】:(Matlab) Performance of Gaussian filtering using imfilter on a binary image(Matlab) 在二值图像上使用 imfilter 进行高斯滤波的性能
【发布时间】:2014-03-25 23:24:40
【问题描述】:

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

我发现高斯滤波占用了大部分时间 - 我可以以某种方式调整这个过程吗? 我读到了conv2,据说它更快,但它不适用于二进制图像,是吗?并且将我的二进制图像转换为单张或双张会弄乱它们。

我已经在其他级别上研究过代码的性能,例如调整搜索窗口等,所以我可以评估剩下的就是过滤。

提前致谢

【问题讨论】:

    标签: performance matlab filter gaussian


    【解决方案1】:

    可能是平滑部分是不必要的,对图像进行简单的阈值化可以非常清楚地识别苍蝇:

    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)

    【讨论】:

    • 这是一个示例图像:i.imgur.com/7YlMKpz.png 这就是 double(image) 的作用:i.imgur.com/7kctYTs.png
    • 你的第一张图片在我看来不是二进制的,更像是灰度。
    • @user3459888 您在第二张图片中看到的是范围转换突出显示的噪声。它也存在于您的原始图像中。使用阈值来摆脱它(请参阅我的编辑)。
    • 1) 当然你是对的,它是灰度;我在脑海中混淆了......我对Matlab比较陌生,所以发生这种情况...... 2)苍蝇的识别不是问题,而是噪音 - 我还想过滤掉苍蝇的小动作因为这项研究是针对运动的。
    • 3) 我现在使用特定阈值使用 im2bw 将原始帧转换为二进制,使用 conv2 “模糊”该图像以获得白云,然后再次使用不同阈值的 im2bw 以获得更多或少圆形白色斑点。这比使用 2xim2bw + imfilter 快大约 30%,这是可以接受的。我将试验基于 FFT 的滤波器,看看它是否更快。非常感谢您的努力!
    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2013-09-12
    • 2014-05-19
    • 1970-01-01
    • 2013-03-29
    • 2017-02-04
    相关资源
    最近更新 更多