How to obtain a gaussian filter in python

后端 未结 8 1363
广开言路
广开言路 2021-01-31 03:57

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 c

相关标签:
8条回答
  • 2021-01-31 04:18

    You could try this too (as product of 2 independent 1D Gaussian random variables) to obtain a 2D Gaussian Kernel:

    from numpy import pi, exp, sqrt
    s, k = 1, 2 #  generate a (2k+1)x(2k+1) gaussian kernel with mean=0 and sigma = s
    probs = [exp(-z*z/(2*s*s))/sqrt(2*pi*s*s) for z in range(-k,k+1)] 
    kernel = np.outer(probs, probs)
    print kernel
    
    #[[ 0.00291502  0.00792386  0.02153928  0.00792386  0.00291502]
    #[ 0.00792386  0.02153928  0.05854983  0.02153928  0.00792386]
    #[ 0.02153928  0.05854983  0.15915494  0.05854983  0.02153928]
    #[ 0.00792386  0.02153928  0.05854983  0.02153928  0.00792386]
    #[ 0.00291502  0.00792386  0.02153928  0.00792386  0.00291502]]
    
    import matplotlib.pylab as plt
    plt.imshow(kernel)
    plt.colorbar()
    plt.show()
    

    0 讨论(0)
  • 2021-01-31 04:18

    here is to provide an nd-gaussian window generator:

    def gen_gaussian_kernel(shape, mean, var):
        coors = [range(shape[d]) for d in range(len(shape))]
        k = np.zeros(shape=shape)
        cartesian_product = [[]]
        for coor in coors:
            cartesian_product = [x + [y] for x in cartesian_product for y in coor]
        for c in cartesian_product:
            s = 0
            for cc, m in zip(c,mean):
                s += (cc - m)**2
            k[tuple(c)] = np.exp(-s/(2*var))
        return k
    

    this function will give you an unnormalized gaussian windows with given shape, center, and variance. for instance: gen_gaussian_kernel(shape=(3,3,3),mean=(1,1,1),var=1.0) output->

    [[[ 0.22313016  0.36787944  0.22313016]
      [ 0.36787944  0.60653066  0.36787944]
      [ 0.22313016  0.36787944  0.22313016]]
    
     [[ 0.36787944  0.60653066  0.36787944]
      [ 0.60653066  1.          0.60653066]
      [ 0.36787944  0.60653066  0.36787944]]
    
     [[ 0.22313016  0.36787944  0.22313016]
      [ 0.36787944  0.60653066  0.36787944]
      [ 0.22313016  0.36787944  0.22313016]]]
    
    0 讨论(0)
  • 2021-01-31 04:18

    Using Gaussian PDF and assuming space invariant blur

    def gaussian_kernel(sigma, size):
        mu = np.floor([size / 2, size / 2])
        size = int(size)
        kernel = np.zeros((size, size))
        for i in range(size):
            for j in range(size):
                kernel[i, j] = np.exp(-(0.5/(sigma*sigma)) * (np.square(i-mu[0]) + 
                np.square(j-mu[0]))) / np.sqrt(2*math.pi*sigma*sigma)```
    
        kernel = kernel/np.sum(kernel)
        return kernel
    
    0 讨论(0)
  • 2021-01-31 04:27

    Hey, I think this might help you

    import numpy as np
    import cv2
    
    def gaussian_kernel(dimension_x, dimension_y, sigma_x, sigma_y):
        x = cv2.getGaussianKernel(dimension_x, sigma_x)
        y = cv2.getGaussianKernel(dimension_y, sigma_y)
        kernel = x.dot(y.T)
        return kernel
    g_kernel = gaussian_kernel(5, 5, 1, 1)
    print(g_kernel)
    
    [[0.00296902 0.01330621 0.02193823 0.01330621 0.00296902]
     [0.01330621 0.0596343  0.09832033 0.0596343  0.01330621]
     [0.02193823 0.09832033 0.16210282 0.09832033 0.02193823]
     [0.01330621 0.0596343  0.09832033 0.0596343  0.01330621]
     [0.00296902 0.01330621 0.02193823 0.01330621 0.00296902]]
    
    0 讨论(0)
  • 2021-01-31 04:33

    I found similar solution for this problem:

    def fspecial_gauss(size, sigma):
    
        """Function to mimic the 'fspecial' gaussian MATLAB function
        """
    
        x, y = numpy.mgrid[-size//2 + 1:size//2 + 1, -size//2 + 1:size//2 + 1]
        g = numpy.exp(-((x**2 + y**2)/(2.0*sigma**2)))
        return g/g.sum()
    
    0 讨论(0)
  • 2021-01-31 04:34

    Hi I think the problem is that for a gaussian filter the normalization factor depends on how many dimensions you used. So the filter looks like thisformula
    What you miss is the square of the normalization factor! And need to renormalize the whole matrix because of computing accuracy! The code is attached here:

    def gaussian_filter(shape =(5,5), sigma=1):
        x, y = [edge /2 for edge in shape]
        grid = np.array([[((i**2+j**2)/(2.0*sigma**2)) for i in xrange(-x, x+1)] for j in xrange(-y, y+1)])
        g_filter = np.exp(-grid)/(2*np.pi*sigma**2)
        g_filter /= np.sum(g_filter)
        return g_filter
    print gaussian_filter()
    

    The output without normalized to sum of 1:

    [[ 0.00291502  0.01306423  0.02153928  0.01306423  0.00291502]
     [ 0.01306423  0.05854983  0.09653235  0.05854983  0.01306423]
     [ 0.02153928  0.09653235  0.15915494  0.09653235  0.02153928]
     [ 0.01306423  0.05854983  0.09653235  0.05854983  0.01306423]
     [ 0.00291502  0.01306423  0.02153928  0.01306423  0.00291502]]
    

    The output divided by np.sum(g_filter):

    [[ 0.00296902  0.01330621  0.02193823  0.01330621  0.00296902]
     [ 0.01330621  0.0596343   0.09832033  0.0596343   0.01330621]
     [ 0.02193823  0.09832033  0.16210282  0.09832033  0.02193823]
     [ 0.01330621  0.0596343   0.09832033  0.0596343   0.01330621]
     [ 0.00296902  0.01330621  0.02193823  0.01330621  0.00296902]]
    
    0 讨论(0)
提交回复
热议问题