我的问题非常接近这个问题:How do I gaussian blur an image without using any in-built gaussian functions?
这个问题的答案很好,但是没有给出实际计算真正的高斯滤波器内核的例子。答案给出了一个任意内核,并展示了如何使用该内核应用过滤器,而不是如何计算真正的内核本身。我正在尝试从头开始在 C++ 或 Matlab 中实现高斯模糊,所以我需要知道如何从头开始计算内核。
如果有人可以使用任何小的示例图像矩阵计算出真正的高斯滤波器内核,我将不胜感激。
最佳答案
您可以按照 fspecial
的 MATLAB 文档中的说明从头开始创建高斯核。 .请阅读该页面算法部分中的高斯核创建公式,并按照以下代码进行操作。代码是创建一个 sigma = 1 的 m×n 矩阵。
m = 5; n = 5;
sigma = 1;
[h1, h2] = meshgrid(-(m-1)/2:(m-1)/2, -(n-1)/2:(n-1)/2);
hg = exp(- (h1.^2+h2.^2) / (2*sigma^2));
h = hg ./ sum(hg(:));
h =
0.0030 0.0133 0.0219 0.0133 0.0030
0.0133 0.0596 0.0983 0.0596 0.0133
0.0219 0.0983 0.1621 0.0983 0.0219
0.0133 0.0596 0.0983 0.0596 0.0133
0.0030 0.0133 0.0219 0.0133 0.0030
请注意,这可以通过内置的 fspecial
来完成,如下所示:
fspecial('gaussian', [m n], sigma)
ans =
0.0030 0.0133 0.0219 0.0133 0.0030
0.0133 0.0596 0.0983 0.0596 0.0133
0.0219 0.0983 0.1621 0.0983 0.0219
0.0133 0.0596 0.0983 0.0596 0.0133
0.0030 0.0133 0.0219 0.0133 0.0030
我认为用任何你喜欢的语言来实现它都很简单。
编辑:让我也为给定的情况添加 h1
和 h2
的值,因为您可能不熟悉 meshgrid
如果你用 C++ 编写代码。
h1 =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
h2 =
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
关于c++ - 实现高斯模糊 - 如何计算卷积矩阵(内核),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8204645/