【问题标题】:how to get the gaussian filter?如何获得高斯滤波器?
【发布时间】:2023-04-03 04:53:01
【问题描述】:

我想得到一个大小为m rowsn columns 的高斯窗口。 我知道如何达到一维。即下面。

from scipy.stats import multivariate_normal
multivariate_normal(mean=[1, 5], cov=(2.5))

现在我想要一个矩阵的二维。 目的:我想把这个过滤器放在图像的顶部。绿色是图像的矩阵。蓝色圆圈是高斯滤波器。我不确定如何获得蓝色窗口。

我正在考虑应用 something 像这样 -

gw = multivariate_normal(mean=[1, 5], cov=(2.5))

for i in range(image.shape[0):
    image_gauss_window[i:] = gw

您能提供一种方法来找出图像的高斯滤波器吗?我看到 opencv 许多函数将高斯模糊应用于图像。但是在这里我想要在图像上应用/卷积之前的过滤器。

【问题讨论】:

    标签: python numpy opencv scipy


    【解决方案1】:

    在 Python 中使用 openCV

    示例:Sigma=1.0 的 5x5 内核:

    第一种方法:使用中间有一个1的矩阵

        visualization_matrix = np.zeros((5,5))
        visualization_matrix[2,2] = 1.0
        print(visualization_matrix)
    
        [[0. 0. 0. 0. 0.]
         [0. 0. 0. 0. 0.]
         [0. 0. 1. 0. 0.]
         [0. 0. 0. 0. 0.]
         [0. 0. 0. 0. 0.]]
    
        gauss_kernel = cv2.GaussianBlur(visualization_matrix , (5, 5), 1.0, 
                                        borderType=cv2.BORDER_ISOLATED)
        print("Kernel: \n", gauss_kernel)
    
        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]]
    

    第二种方法:使用cv2.getGaussianKernel

        xdir_gauss = cv2.getGaussianKernel(5, 1.0)
        kernel = np.multiply(xdir_gauss.T, xdir_gauss)
        print("Kernel: \n", kernel)
    
        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]]
    

    结果是一样的。

    请注意,在 Python 中,内核大小必须是奇数。所以使用例如使用的函数不支持 4x4 内核。

    【讨论】:

      【解决方案2】:

      使用np.fromfunction:

      您可以使用我编写的a basic computer vision library 中的一些代码。

      所以如果你有sizesigma,你可以通过这一行得到gaussiankernel2dnumpyarray

      kernel = np.fromfunction(lambda x, y: (1/(2*math.pi*sigma**2)) * math.e ** ((-1*((x-(size-1)/2)**2+(y-(size-1)/2)**2))/(2*sigma**2)), (size, size))
      

      然后到normalise它,只需将每个element除以sum

      kernel /= np.sum(kernel)
      

      其中(例如size5sigma1 将给kernel 为:

      array([[ 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]])
      

      您可以看到,2d 中的一个很好的对称 bell-curve 在中心上升。


      你可以看到这个gaussianfiltermatplotlib可视化:

      【讨论】:

      • 你为什么要做size-1 而不仅仅是大小?
      • 哦,仔细观察,我相信这有定心效果!
      【解决方案3】:

      如果您正在寻找一种“python”方式来创建 2D 高斯滤波器,您可以通过两个 1D 高斯滤波器的点积来创建它。

      创建单个 1x5 高斯滤波器

      x = np.linspace(0, 5, 5, endpoint=False)
      y = multivariate_normal.pdf(x, mean=2, cov=0.5)
      

      然后改成二维数组

      import numpy as np
      y = y.reshape(1,5)
      

      将 y 与自身点积以创建对称的 2D 高斯滤波器

      GF = np.dot(y.T,y)
      

      【讨论】:

      • 这看起来很简单,试试看。
      • 二维对称高斯滤波器 === 高斯滤波器?
      • 是的。是一样的
      【解决方案4】:

      OpenCV 中没有此函数,但OpenCV 为您提供了创建该函数的基本函数,该函数名称为getGaussianKernel,我不知道python,所以我编写了我的程序c++ 但我知道将这段代码转换为 python 很容易

      Mat xdirectionGauss = getGaussianKernel(4,  //Size of kernel in x direction
                                              1.4);  // Sigma in x direction
      
      Mat kernel =xdirectionGauss*xdirectionGauss.t();  //kernel * transpose(kernel)
      

      kernels 输出会是这样的:

      [0.035183571, 0.058602851, 0.058602851, 0.035183571;
      0.058602851, 0.097610727, 0.097610727, 0.058602851;
      0.058602851, 0.097610727, 0.097610727, 0.058602851;
      0.035183571, 0.058602851, 0.058602851, 0.035183571]
      

      如果我想将结果与MATLAB 进行比较,它给出了 2D 内核,输出将等于 opencv

      >> h = fspecial('gaussian',[4 4], 1.4)
      
      h =
      
      0.0352    0.0586    0.0586    0.0352
      0.0586    0.0976    0.0976    0.0586
      0.0586    0.0976    0.0976    0.0586
      0.0352    0.0586    0.0586    0.0352
      

      【讨论】:

        猜你喜欢
        • 2013-06-15
        • 1970-01-01
        • 2013-03-29
        • 2018-10-03
        • 2018-01-26
        • 2013-02-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-22
        相关资源
        最近更新 更多