如何为2D高斯产生噪声?

时间:2016-06-08 04:52:46

标签: matlab curve-fitting gaussian

我正在尝试在2D高斯上练习曲线拟合,但为了做到这一点,我需要将随机噪声添加到我预定义的高斯。我的第一个本能是循环通过两个for循环并用随机数创建两个矩阵X和Y,但是当我尝试(我没有代码)时,Matlab不会让我绘制高斯,因为我没有使用meshgrid函数生成我的X和Y值。由于我似乎需要使用meshgrid,任何人都可以帮我弄清楚如何生成一个随机的网格网格,这样我就可以为我的高斯添加一些噪声了吗?

amp = 1;
x0 = 0;
y0 = 0;
sigmaX = 1;
sigmaY = 1;
%X = 1:1:100;
%Y = 1:1:100;
[X,Y] = meshgrid(-3:.1:3);
%Z = X .* exp(-X.^2 - Y.^2);
Z = amp*exp(-((X-x0).^2/(2*sigmaX^2)+(Y-y0).^2/(2*sigmaY^2)));
surf(X, Y, Z);

%Add noise now
编辑:所以我发现rand可以返回一个随机矩阵,它可以与冲浪功能一起使用(由于某种原因,它早些时候对我不起作用)。结果如下所示:noisy 2D gaussian

amp = 1;
x0 = 0;
y0 = 0;
sigmaX = 1;
sigmaY = 1;
[X,Y] = meshgrid(-3:.1:3);
%Z = X .* exp(-X.^2 - Y.^2);
Z = amp*exp(-((X-x0).^2/(2*sigmaX^2)+(Y-y0).^2/(2*sigmaY^2)));
surf(X, Y, Z);

%Make some noise
[xRows, xColumns] = size(X);
[yRows, yColumns] = size(Y);

figure(2)
X =  -.1 + (.1+.1)*rand(61,61);
Y =  -.1 + (.1+.1)*rand(61,61);
Z = amp*exp(-((X-x0).^2/(2*sigmaX^2)+(Y-y0).^2/(2*sigmaY^2)));
surf(X, Y, Z)

但是我觉得高斯已经基本上失去了它的典型钟形,看起来更像是一个斜坡场而不是任何东西。我将尝试改进它,但我会喜欢任何输入。

2 个答案:

答案 0 :(得分:1)

这就是我要做的事。

amp=1;
x0=0;
y0=0;
sigmaX=1;
sigmaY=1;
noiseAmp=.1;
x=[-2:.1:2];
y=[-2:.1:2];

%Create two Noise Vectors
noisez1=noiseAmp.*rand(1,length(x));
noisez2=noiseAmp.*rand(1,length(x));
% Make an meshgrid out of the two Vectors
[noiseZ1,noiseZ2]=meshgrid(noisez1,noisez2);
% Add the Meshgrids togehter
Noise=noiseZ1+noiseZ2;

[X,Y]=meshgrid(x,y);
% Add the Noise to the result of Z
Z=amp*exp(-((X-x0).^2/(2*sigmaX^2)+(Y-y0).^2/(2*sigmaY^2)))+Noise;
surf(X,Y,Z);

答案 1 :(得分:0)

如果您只想要2D图,可以试试这个

  amp=1;
  noiseAmp=0.01;
  x0=0;
  y0=0;
  sigmaX=1;
  sigmaY=1;
  x=[-5:.01:5];
  noiseY=noiseAmp*rand(1,length(x));
  y=noiseY+amp*exp(-((x-x0).^2/(2*sigmaX^2)));
  plot(x,y);

其中noiseAmp是噪声的幅度。

但是如果你仍然想用surf()函数创建一个3D图,你必须在Z结果中添加一个随机的meshgrid。