如何获得高斯滤波器?

aja*_*esh 4 python opencv numpy scipy

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

from scipy.stats import multivariate_normal
multivariate_normal(mean=[1, 5], cov=(2.5))
Run Code Online (Sandbox Code Playgroud)

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

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

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

for i in range(image.shape[0):
    image_gauss_window[i:] = gw
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

Joe*_*don 5

使用np.fromfunction

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

所以,如果你有sizesigma,你可以得到2d numpy arraygaussian 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))
Run Code Online (Sandbox Code Playgroud)

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

kernel /= np.sum(kernel)
Run Code Online (Sandbox Code Playgroud)

其中(例如)与sizeas5sigmaas1将给出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]])
Run Code Online (Sandbox Code Playgroud)

你可以看到是一个很好的对称bell-curve2d发源于中心。


你可以看到这个gaussian filter可视化matplotlib

高斯


yap*_*s87 5

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

创建单个 1x5 高斯滤波器

x = np.linspace(0, 5, 5, endpoint=False)
y = multivariate_normal.pdf(x, mean=2, cov=0.5)
Run Code Online (Sandbox Code Playgroud)

然后改成二维数组

import numpy as np
y = y.reshape(1,5)
Run Code Online (Sandbox Code Playgroud)

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

GF = np.dot(y.T,y)
Run Code Online (Sandbox Code Playgroud)


Pee*_*ier 5

在 Python 中使用 openCV

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

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

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

第二种方法:使用cv2.getGaussianKernel

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

结果是一样的。

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