我正在尝试在MatLab中生成2D高斯内核。我发现了两种解决方法。
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);
即使在那之后,小数点也有一些细微的差异。
答案 0 :(得分:1)
SIGMA
的{{1}}输入参数应该是
mvnpdf
即使使用相同的sigma,生成的两个矩阵也不相同。 sigma_mat = sigma^2 * eye(2);
确保fspecial
。由于您要剪掉尾巴,因此此归一化与正态分布的PDF略有不同。当减少sum(f(:))==1
时(由于采样时信息丢失的增加)和减小输出矩阵的大小(因为这会截去更多的尾巴),您会注意到更大的差异。对于较大的sigma
和较大的输出矩阵,差异应该很小。
sigma
之所以以这种方式规范化,是因为输出意味着卷积内核。应用平滑过滤器时,滤镜权重之和应为1,以避免平均图像强度发生变化。如果打算将生成的内核用于图像处理,请使用fspecial
或标准化fspecial
的输出。