为什么 mvnpdf 和 fspecial('gaussian') 在 MatLab 中给出不同的矩阵?
Why do mvnpdf and fspecial('gaussian') give different matrices in MatLab?
我正在尝试在 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
- 使用
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);
即使在那之后,小数点也有一些细微的差别。
mvnpdf
的 SIGMA
输入参数应该是
sigma_mat = sigma^2 * eye(2);
即使西格玛相同,生成的两个矩阵也不相同。 fspecial
确保 sum(f(:))==1
。由于您要剪掉尾部,因此这种规范化与正态分布的 PDF 略有不同。在减少 sigma
时(因为采样会增加信息损失)和减少输出矩阵的大小时(因为这会切断更多的尾巴),您会注意到更大的差异。对于大 sigma
和大输出矩阵大小,差异应该非常小。
fspecial
以这种方式归一化的原因是因为输出是一个卷积核。应用平滑滤波器时,滤波器权重总和应为 1,以避免平均图像强度发生变化。如果您打算使用生成的内核进行图像处理,请使用 fspecial
或规范化 mvnpdf
.
的输出
我正在尝试在 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
- 使用
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);
即使在那之后,小数点也有一些细微的差别。
mvnpdf
的 SIGMA
输入参数应该是
sigma_mat = sigma^2 * eye(2);
即使西格玛相同,生成的两个矩阵也不相同。 fspecial
确保 sum(f(:))==1
。由于您要剪掉尾部,因此这种规范化与正态分布的 PDF 略有不同。在减少 sigma
时(因为采样会增加信息损失)和减少输出矩阵的大小时(因为这会切断更多的尾巴),您会注意到更大的差异。对于大 sigma
和大输出矩阵大小,差异应该非常小。
fspecial
以这种方式归一化的原因是因为输出是一个卷积核。应用平滑滤波器时,滤波器权重总和应为 1,以避免平均图像强度发生变化。如果您打算使用生成的内核进行图像处理,请使用 fspecial
或规范化 mvnpdf
.