我在matlab工作,最近我正在从事图像处理方面的研究。这次我正在实施一篇研究论文this paper,其中我遇到的问题是存储精度超过两倍。请仔细检查那篇论文的等式6。
我在以下代码中遇到问题..
img = imread('Einstein.bmp');
exponent = double(zeros(size(img,1),size(img,2)));
s = double(zeros(size(img,1),size(img,2)));
sigma=1;
for i=1:size(img,1)
for j=1:size(img,2)
exponent(i,j) = double(((i^2)+(j^2))/(2*(sigma^2)));
s(i,j) = double(exp(-exponent(i,j)));
end
end
在某些值之后,s(i,j)为所有值提供0,但该值不应为0.我如何避免该问题?
答案 0 :(得分:0)
答案 1 :(得分:0)
查看代码,您似乎正在尝试创建一个以(0,0)为中心的2D Gaussian function。您正在使用的内核宽度非常小:sigma=1
,看到您正在计算图像像素的整个网格上的函数。所以难怪你除了矩阵左上角的一小部分S
之外都会得到全零。
这是一种更有效的方法来创建以中间为中心的内核:
% 100x100 grid
r = 100; c = 100;
[x,y] = ndgrid(1:r,1:c);
% sigma = 20
sigma = max([r c])/5;
% 2D gaussian function
z = sum(bsxfun(@minus, [x(:) y(:)], [r c]./2).^2, 2);
z = exp(-z ./ (2*sigma^2)) ./ (sigma^2 * 2*pi);
z = reshape(z, [r c]);
如果您有权访问统计工具箱,请使用mvnpdf
写为:
z = mvnpdf([x(:) y(:)], [r c]./2, eye(2)*sigma^2);
z = reshape(z, [r c]);
或者如果您有图像处理工具箱,只需使用fspecial
:
z = fspecial('gaussian', [r c], sigma);
结果:
imshow(z, 'DisplayRange',[], 'InitialMag','fit')
axis on, colorbar
请注意,矩阵已归一化,因此积分为1(因此值较小)。这就是我在显示为图像时关闭默认[0,1]
范围的原因。
您还可以使用:[0,1]
z = (z - min(z(:))) ./ range(z(:))
范围内
以下是作为曲面查看的结果矩阵:
surf(x,y,z)
axis vis3d