如何显示 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)
我正在使用这个:
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)