Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to obtain a gaussian filter in python

I am using python to create a gaussian filter of size 5x5. I saw this post here where they talk about a similar thing but I didn't find the exact way to get equivalent python code to matlab function fspecial('gaussian', f_wid, sigma) Is there any other way to do it? I tried using the following code :

size = 2 sizey = None size = int(size) if not sizey:     sizey = size else:     sizey = int(sizey) x, y = scipy.mgrid[-size: size + 1, -sizey: sizey + 1] g = scipy.exp(- (x ** 2/float(size) + y ** 2 / float(sizey))) print g / np.sqrt(2 * np.pi) 

The output obtained is

[[ 0.00730688  0.03274718  0.05399097  0.03274718  0.00730688]  [ 0.03274718  0.14676266  0.24197072  0.14676266  0.03274718]  [ 0.05399097  0.24197072  0.39894228  0.24197072  0.05399097]  [ 0.03274718  0.14676266  0.24197072  0.14676266  0.03274718]  [ 0.00730688  0.03274718  0.05399097  0.03274718  0.00730688]] 

What I want is something like this:

   0.0029690   0.0133062   0.0219382   0.0133062   0.0029690    0.0133062   0.0596343   0.0983203   0.0596343   0.0133062    0.0219382   0.0983203   0.1621028   0.0983203   0.0219382    0.0133062   0.0596343   0.0983203   0.0596343   0.0133062    0.0029690   0.0133062   0.0219382   0.0133062   0.0029690 
like image 301
Khushboo Avatar asked Jun 19 '13 12:06

Khushboo


People also ask

How do you define a Gaussian filter?

In electronics and signal processing, a Gaussian filter is a filter whose impulse response is a Gaussian function (or an approximation to it, since a true Gaussian response would have infinite impulse response).

What is a Gaussian kernel python?

Python OpenCV getGaussianKernel() function is used to find the Gaussian filter coefficients. The Gaussian kernel is also used in Gaussian Blurring. Gaussian Blurring is the smoothing technique that uses a low pass filter whose weights are derived from a Gaussian function.


1 Answers

In general terms if you really care about getting the the exact same result as MATLAB, the easiest way to achieve this is often by looking directly at the source of the MATLAB function.

In this case, edit fspecial:

...   case 'gaussian' % Gaussian filter       siz   = (p2-1)/2;      std   = p3;       [x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));      arg   = -(x.*x + y.*y)/(2*std*std);       h     = exp(arg);      h(h<eps*max(h(:))) = 0;       sumh = sum(h(:));      if sumh ~= 0,        h  = h/sumh;      end; ... 

Pretty simple, eh? It's <10mins work to port this to Python:

import numpy as np  def matlab_style_gauss2D(shape=(3,3),sigma=0.5):     """     2D gaussian mask - should give the same result as MATLAB's     fspecial('gaussian',[shape],[sigma])     """     m,n = [(ss-1.)/2. for ss in shape]     y,x = np.ogrid[-m:m+1,-n:n+1]     h = np.exp( -(x*x + y*y) / (2.*sigma*sigma) )     h[ h < np.finfo(h.dtype).eps*h.max() ] = 0     sumh = h.sum()     if sumh != 0:         h /= sumh     return h 

This gives me the same answer as fspecial to within rounding error:

 >> fspecial('gaussian',5,1)   0.002969     0.013306     0.021938     0.013306     0.002969  0.013306     0.059634      0.09832     0.059634     0.013306  0.021938      0.09832       0.1621      0.09832     0.021938  0.013306     0.059634      0.09832     0.059634     0.013306  0.002969     0.013306     0.021938     0.013306     0.002969   : matlab_style_gauss2D((5,5),1)  array([[ 0.002969,  0.013306,  0.021938,  0.013306,  0.002969],        [ 0.013306,  0.059634,  0.09832 ,  0.059634,  0.013306],        [ 0.021938,  0.09832 ,  0.162103,  0.09832 ,  0.021938],        [ 0.013306,  0.059634,  0.09832 ,  0.059634,  0.013306],        [ 0.002969,  0.013306,  0.021938,  0.013306,  0.002969]]) 
like image 76
ali_m Avatar answered Sep 20 '22 15:09

ali_m