我希望得到一个大小为m rows
和n 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
你能找到一种方法来找出图像的高斯滤波器吗?我看到opencv很多函数都将高斯模糊应用于图像。但在这里,我想要在图像上应用/卷积之前使用滤镜。
答案 0 :(得分:3)
您可以使用我写的a basic computer vision library
中的一些代码。
因此,如果您有sigma
和2d
,则可以获得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)
(例如)size
为5
,sigma
为1
,kernel
为:{/ 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
:
答案 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)