我正在尝试创建一些高斯分布并将它们放在图像上。高斯人随机创建了参数(幅度,位置和标准偏差)。首先我将参数放入向量或矩阵,然后我使用ngrid()函数获得2d空间来创建高斯,但是我得到一个错误(因为可能使用ngrid值的数学运算并不是微不足道的......)。错误是:
??? Error using ==> minus
Integers can only be combined
with integers of the same class,
or scalar doubles.
Error in ==> ss_gauss_fit at 23
gauss = amp(i)*
exp(-((x-xc).^2 +
(y-yc).^2)./(2*std(i)));
代码在这里:
clear all;
image = uint8(zeros([300 300]));
imsize=size(image);
noOfGauss=10;
maxAmpGauss=160;
stdMax=15;
stdMin=3;
for i=1:noOfGauss
posn(:,:,i)=[ uint8(imsize(1)*rand()) uint8(imsize(2)*rand()) ];
std(i)=stdMin+uint8((stdMax-stdMin)*rand());
amp(i)= uint8(rand()* maxAmpGauss);
end
% draw the gaussians on blank image
for i=1:noOfGauss
[x,y] = ndgrid(1:imsize(1), 1:imsize(2));
xc = posn(1,1,i);
yc = posn(1,2,i);
gauss = amp(i)* exp(-((x-xc).^2 + (y-yc).^2)./(2*std(i)));
image = image + gauss;
end
请告诉我如何解决这个问题,用参数向量绘制2d Gaussians ... 提前致谢
答案 0 :(得分:1)
除了关于“绘制图像”的疯狂之外,我还不太了解,我认为你试图在网格上添加一堆独立的高斯分布。这是我对你的代码所做的。请注意,您的双变量高斯不能正确归一化,而您之前使用的是方差而不是标准偏差。我修复后者;但是,我没有为标准化而烦恼,因为无论如何你要将每个乘以一个幅度值。
clear all;
xmax = 50;
ymax = 50;
noOfGauss=10;
maxAmpGauss=160;
stdMax=10;
stdMin=3;
posn = zeros(noOfGauss, 2);
std = zeros(noOfGauss, 1);
amp = zeros(noOfGauss, 1);
for i=1:noOfGauss
posn(i,:)=[ xmax*rand() ymax*rand() ];
std(i)=stdMin+(stdMax-stdMin)*rand();
amp(i)= rand()* maxAmpGauss;
end
% draw the gaussians
[x,y] = ndgrid(1:xmax, 1:ymax);
z = zeros(xmax, ymax);
for i=1:noOfGauss
xc = posn(i,1);
yc = posn(i,2);
z = z + amp(i)* exp(-((x-xc).^2 + (y-yc).^2)./(2*std(i)^2));
end
surf(x, y, z);
随机输出: