c++ - 实现高斯模糊 - 如何计算卷积矩阵(内核)

标签 c++ matlab filter blur gaussian

我的问题非常接近这个问题: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

我认为用任何你喜欢的语言来实现它都很简单。

编辑:让我也为给定的情况添加 h1h2 的值,因为您可能不熟悉 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/

相关文章:

matlab - 根据多列对矩阵的行进行分组

bash - 如何从命令行调用MATLAB脚本?

c++ - 我可以在 Windows Phone 7 中使用 C++ 吗?

c++ - 使用 VS2010 Pro 在 Windows 8 上构建 Qt 4.8

c++ - 如何设计对包含不同类型的文件的访问?

android - ListView 中的自定义过滤 ArrayAdapter

jQuery:不过滤

c++ - 改进 if/else 语句链

c++ - 用OpenCV模拟matlab的mldivide

Android tap URL 打开修改后的 URL