[SciPy-dev] recursive Gaussian filter in C
Sturla Molden
sturla at molden.no
Wed Sep 9 04:54:33 EDT 2009
I have written a C version of the recursive Gaussian filter. It is more
accurate than gaussian_filter in ndimage (less truncation error near
edges, as shown before) and also faster. Here are some timings on
filtering the "lenna" test image on my computer:
sigma = 5
elapsed time (iir with openmp): 81.366640 ms
elapsed time (iir): 107.282360 ms
elapsed time (ndimage): 137.548760 ms
sigma = 9
elapsed time (iir with openmp): 44.403760 ms
elapsed time (iir): 75.285720 ms
elapsed time (ndimage): 163.750920 ms
sigma = 21
elapsed time (iir with openmp): 45.063040 ms
elapsed time (iir): 75.941400 ms
elapsed time (ndimage): 313.359080 ms
sigma = 101
elapsed time (iir with openmp): 56.134120 ms
elapsed time (iir): 87.622240 ms
elapsed time (ndimage): 1210.016680 ms
It is still only written for np.float64, but it would be easy to make
optimized versions for various dtypes, including rgb images.
You don't really see the scaling effect of OpenMP here, as the only
thing that changes with sigma is the amount of zero-padding. Anyhow,
this beats ndimage on speed and accuracy, and scales much better with
sigma.
It is not restricted to 2 dimensions. It can filter along any axis of an
ndarray. Thus another use case is fast kernel density estimation in nd
space.
Regards,
Sturla Molden
More information about the SciPy-Dev
mailing list