создание случайных гауссов на изображении

Я пытаюсь создать несколько распределений Гаусса и поместить их на изображение. Гауссианы имеют случайно созданный параметр (амплитуда, положение и стандартное отклонение). Сначала я помещаю параметры в векторы или матрицы, затем я использую функцию ngrid(), чтобы получить двумерное пространство для создания гауссианов, однако я получаю сообщение об ошибке (поскольку, возможно, математические операции со значениями 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 гауссианы с векторами параметров... Заранее спасибо


person user2137591    schedule 05.03.2013    source источник


Ответы (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);

Случайный вывод:

введите здесь описание изображения

person Andrew Mao    schedule 06.03.2013
comment
Спасибо, это было именно то, что я искал, чтобы помочь мне заставить работать код Python. - person Aesir; 13.07.2014