aja*_*esh 4 python opencv numpy scipy
我想大小的高斯窗m rows和n 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 许多函数将高斯模糊应用于图像。但在这里我想要在应用/卷积图像之前使用过滤器。
你可以使用a basic computer vision library我写的一些代码。
所以,如果你有size和sigma,你可以得到2d numpy array的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))
Run Code Online (Sandbox Code Playgroud)
然后到normalise它,只需将每个element除以sum:
kernel /= np.sum(kernel)
Run Code Online (Sandbox Code Playgroud)
其中(例如)与sizeas5和sigmaas1将给出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-curve在2d发源于中心。
你可以看到这个gaussian filter可视化matplotlib:
如果您正在寻找创建 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)
在 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 内核。