scipy 如何获得高斯滤波器?

qjp7pelc  于 2022-11-10  发布在  其他
关注(0)|答案(4)|浏览(256)

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

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

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

qcbq4gxm

qcbq4gxm1#

使用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除以:

kernel /= np.sum(kernel)

其中(* 例如 *)将size作为5,将sigma作为1,将给予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]])

你可以看到一个很好的对称的bell-curve2d中,从中间升起。
你可以看到这个gaussianfiltermatplotlib可视化:

qlfbtfca

qlfbtfca2#

在Python中使用openCV

示例:Sigma=1.0的5x5内核:
第一种方法:使用中间有一个1的矩阵
第一个
第二种方法:使用cv2.getGaussianKernel
第一个
结果是一样的。
注意,在Python中,内核大小必须是奇数。因此,所使用的函数不支持使用例如4x4内核。

fwzugrvs

fwzugrvs3#

如果你正在寻找一个“python“ian的方式来创建一个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)
huwehgph

huwehgph4#

这个函数在OpenCV中并不存在,但是OpenCV提供了创建它的基本函数,这个函数叫做cv::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]

如果将结果与生成2D内核的MATLAB进行比较,则输出将与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

相关问题