如何获得高斯滤波器?

时间:2017-11-18 18:28:07

标签: python numpy opencv scipy

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

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

现在我想要一个矩阵的两个维度。 目的:我希望将此滤镜放在图像上方。绿色是图像的矩阵。蓝色圆圈是高斯滤波器。我不知道如何获得蓝色窗口。

我正在考虑应用这样的东西 -

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

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

enter image description here

你能找到一种方法来找出图像的高斯滤波器吗?我看到opencv很多函数都将高斯模糊应用于图像。但在这里,我想要在图像上应用/卷积之前使用滤镜。

4 个答案:

答案 0 :(得分:3)

使用np.fromfunction:

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

因此,如果您有sigma2d,则可以获得numpy array的{​​{1}} gaussian kernel这一行:

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)

例如size5sigma1kernel为:{/ 1}} p>

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]])

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

您可以通过gaussian看到filter matplotlib

gaussian

答案 1 :(得分:2)

OpenCV中没有此函数,但OpenCV为您提供了创建该函数的基本函数,该函数名称为getGaussianKernel,我不知道{{1}所以我在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

如果我想将结果与给出2D内核的[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] 进行比较,则输出将等于opencv

MATLAB

答案 2 :(得分:2)

在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内核。

答案 3 :(得分:1)

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

创建单个1x5高斯滤波器

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

然后将其更改为2D数组

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

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

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