如何显示 2d 的高斯内核? (开放式简历)

How do I get to show Gaussian Kernel for 2d? (opencv)

我正在使用这个:

 blur = cv2.GaussianBlur(dst,(5,5),0)

我想通过这个来显示内核矩阵:

print(cv2.getGaussianKernel(ksize=(5,5),sigma=0))

但是我遇到类型错误:

TypeError: an integer is required (got type tuple)

如果我只放 5,我得到一个 5x1 矩阵。模糊内核不是 5x5 吗?还是我缺少一些基本的东西?

高斯核是可分离的。因此,生成的内核是一维的。 GaussianBlur 函数依次沿每个图像维度应用此 1D 内核。可分离性 属性 意味着此过程产生的结果与应用 2D 卷积(或 3D,如果是 3D 图像)完全相同。但是工作量大大减少了。对于 5x5 内核,2D 卷积执行 25 次乘法和加法,可分离实现仅执行 5+5=10。对于更大的内核,收益越来越显着。

要查看完整的 2D 内核,请将 GaussianBlur 函数应用于全为零且中间的单个像素设置为 1 的图像。这是 Dirac delta 函数的离散等效项,我们可以用它来分析线性时不变函数(==卷积滤波器)。

如您在此示例中所见: taken from https://theailearner.com/tag/cv2-getgaussiankernel/ 我们可以得到自身转置的高斯核的点积。
首先我们得到一维内核:

k = cv2.getGaussianKernel(kSize, -1)

那我们就可以恢复归一化前的原始形式,就因为第一个元素总是原来等于1:

k /= k[0,0]

现在我们可以得到上面提到的点积:

print(k @ k.T)

如果您希望它的总和为 1(归一化),请将它除以它的总和:

kernel = k @ k.T
kernel /= kernel.sum()
print(kernel)