数据类型在matlab中存储精度超过两倍

时间:2013-09-11 07:46:48

标签: matlab image-processing gaussian floating-point-precision

我在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.我如何避免该问题?

2 个答案:

答案 0 :(得分:0)

似乎matlab只使用了64位双打,但你可以幸运地获得了一个arbitrary precision libraries可用于matlab。

答案 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

2d_gaussian

请注意,矩阵已归一化,因此积分为1(因此值较小)。这就是我在显示为图像时关闭默认[0,1]范围的原因。

您还可以使用:[0,1]

将其映射到z = (z - min(z(:))) ./ range(z(:))范围内

以下是作为曲面查看的结果矩阵:

surf(x,y,z)
axis vis3d

2d_gauss_surface