# Gaussian filtering with imgaussfilt2

Posted by Steve Eddins,

With the R2015a release a couple of years ago, the Image Processing Toolbox added the function imgaussfilt. This function performs 2-D Gaussian filtering on images. It features a heuristic that automatically switches between a spatial-domain implementation and a frequency-domain implementation.

I wanted to check out the heuristic and see how well it works on my own computer (a 2015 MacBook Pro).

You can use imgaussfilt this way:

rgb = imread('peppers.png');
sigma = 10;
rgb_smoothed = imgaussfilt(rgb,sigma);

imshow(rgb)

imshow(rgb_smoothed)
title('Gaussian smoothed, \sigma = 10')


With this call, imgaussfilt automatically chooses between a spatial-domain or a frequency-domain implementation. But you can also tell imgaussfilt which implementation to use.

rgb_smoothed_s = imgaussfilt(rgb,sigma,'FilterDomain','spatial');
rgb_smoothed_f = imgaussfilt(rgb,sigma,'FilterDomain','frequency');


I'll use this syntax, together with the timeit function, to get rough timing curves for the two implementation methods. The heuristic used by imgaussfilt uses a few different factors to decide, including image size, Gaussian kernel size, single or double precision, and the availability of processor-specific optimizations. For my computer, with a 2000-by-2000 image array, the cross-over point is at about $\sigma = 50$. That is, imgaussfilt uses the spatial-domain method for $\sigma < 50$, and it uses a frequency-domain method for $\sigma > 50$.

Let's check that out with a set of $\sigma$ values ranging from 5 to 200.

I = rand(2000,2000);
ww = 5:5:200;
for k = 1:length(ww)
t_s(k) = timeit(@() imgaussfilt(I,ww(k),'FilterDomain','spatial'));
end

for k = 1:length(ww)
t_f(k) = timeit(@() imgaussfilt(I,ww(k),'FilterDomain','frequency'));
end

plot(ww,t_s)
hold on
plot(ww,t_f)
hold off
legend('spatial','frequency')
xlabel('\sigma')
ylabel('time (s)')
title('imgaussfilt - 2000x2000 image')


As you can see, the cross-over point of the timing curves is about the same as the threshold used by imgaussfilt. As computing hardware and optimized computation libraries evolve over time, though, the ideal cross-over point might change. The Image Processing Toolbox team will need to check this every few years and adjust the heuristic as needed.

Get the MATLAB code

Published with MATLAB® R2016b

Or Pany replied on : 1 of 2

Good to know.
Thanks you Steve!

Braiki Marwa replied on : 2 of 2

Hello,
How to apply gaussian filters to an image iteratively?I wrote this code matlab but he is not work!

for i=1:nb1_iteration

Iblur1= imgaussfilt(im,0.5);
end