【问题标题】:Why do mvnpdf and fspecial('gaussian') give different matrices in MatLab?为什么 mvnpdf 和 fspecial('gaussian') 在 MatLab 中给出不同的矩阵?
【发布时间】:2019-01-24 01:33:54
【问题描述】:

我正在尝试在 MatLab 中生成二维高斯核。我找到了两种方法。
1.使用mvnpdf

mu = [0 0];
sigma = 1.4;
sigma_mat = 1/sigma^2 * eye(2);
x1 = -3:1:3;
x2 = x1;
[X1,X2] = meshgrid(x1,x2);
G = mvnpdf([X1(:) X2(:)],mu,sigma_mat);
F = reshape(G,length(x2),length(x1));

这给出了下面的矩阵

0    0    0    0    0    0    0
0    0    0    0.01 0    0    0
0    0    0.04 0.12 0.04 0    0
0    0.01 0.12 0.31 0.12 0.01 0
0    0    0.04 0.12 0.04 0    0
0    0    0    0.01 0    0    0
0    0    0    0    0    0    0
  1. 使用fspecial('gaussian')

f = fspecial('gaussian', [7,7], 1.4);

这给出了矩阵

0.00    0.00    0.01    0.01    0.01    0.00    0.00
0.00    0.01    0.02    0.03    0.02    0.01    0.00
0.01    0.02    0.05    0.06    0.05    0.02    0.01
0.01    0.03    0.06    0.08    0.06    0.03    0.01
0.01    0.02    0.05    0.06    0.05    0.02    0.01
0.00    0.01    0.02    0.03    0.02    0.01    0.00
0.00    0.00    0.01    0.01    0.01    0.00    0.00

这两个函数有什么区别?为什么他们给出不同的输出?
谢谢!

编辑 1: 正如Cris Luengo 正确指出的那样,sigma_mat 中有一个错误。应该是

sigma_mat = sigma^2 * eye(2);

即使在那之后,小数点也有一些细微的差异。

【问题讨论】:

  • 哦!你是对的。它应该是sigma_mat = sigma^2 * eye(2); sigma_mat 必须是协方差矩阵。我没有注意到 mvnpdf 取 sigma_mat 的倒数。即使在那之后,小数点也有一些细微的差别。知道为什么吗?一会儿我会更新问题
  • 完美。请张贴这两个 cmets 作为答案。我会接受的。谢谢:)

标签: matlab gaussian


【解决方案1】:

mvnpdf 的 SIGMA 输入参数应该是

sigma_mat = sigma^2 * eye(2);

即使使用相同的 sigma,生成的两个矩阵也不相同。 fspecial 确保 sum(f(:))==1。由于您要剪掉尾巴,因此这种标准化与正态分布的 PDF 略有不同。当减少sigma(因为采样信息丢失增加)和减少输出矩阵的大小(因为这会切断更多的尾部)时,您会注意到更大的差异。对于较大的sigma 和较大的输出矩阵大小,差异应该非常小。

fspecial 以这种方式归一化的原因是因为输出是卷积核。应用平滑滤波器时,滤波器权重的总和应为 1,以避免平均图像强度发生变化。如果您打算使用生成的内核进行图像处理,请使用fspecial 或标准化mvnpdf 的输出。

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多