2016-10-28 4 views
0

У меня есть шумный ненормальный 2D-гауссовский массив с неизвестным местоположением, а также неизвестное значение и дисперсия. Как я могу вычислить местоположение центра Гаусса, его ширину и высоту на определенном уровне достоверности?Получить информацию о местоположении двумерного гауссовского массива

Для образца случае, как идеальный нормальный 2D гауссовой:

def gauss2d(shape=(200,200),sigma=20): 
    m,n = [(ss-1.)/2. for ss in shape] 
    y,x = np.ogrid[-m:m+1,-n:n+1] 
    h = np.exp(-(x*x + y*y)/(2.*sigma*sigma)) 
    h[ h < np.finfo(h.dtype).eps*h.max() ] = 0 
    h = h/h.max() 
    return h[:150, :150] 

skimage.io.imshow(gauss2d()) # it looks like the following 

gauss2D skimage result

я могу использовать arg.max() каждого пикселя, чтобы получить место в центре, но и для шумного случае я, возможно, придется использовать arg.max() каждого пикселя 3x3, чтобы прочно вычислить центр. Как я могу достичь этого с помощью python?

Я понятия не имею, как вычислить ширину и высоту. Я также думаю использовать какой-то метод кластеризации на основе плотности, чтобы дать информацию о местоположении, такую ​​как DBSCAN scikit-learn, но не знаю, как это сделать практически.

Большое спасибо заранее!

+1

смотреть на [это] (http://stackoverflow.com/questions/21566379/fitting-a-2d-gaussian-function-using-scipy-optimize-curve -fit-valueerror-and-m) – Aaron

+0

это именно то, что мне нужно! Спасибо, Аарон! – Xer

ответ

0

Это классическая проблема установки и может быть решена, например, scipy.optimize -модуль. Сначала определим функцию фитинга, т.е. 2d гауссовой:

def gauss2dFunc(xy, xo, yo, sigma): 
     x = xy[0] 
     y = xy[1] 
     return np.exp(-((x-xo)*(x-xo) + (y-yo)*(y-yo))/(2.*sigma*sigma)).ravel() 

Эта функция нуждается в кортеж текущих координат (х, у), координаты центра гауссова и сигма.

Затем определяется meshgrid для x, y-координат, и мы делаем первоначальное предположение о трех параметрах.

xvec = np.array(range(150)) 
yvec = np.array(range(150)) 
X,Y = np.meshgrid(xvec,yvec) 
initial_guess = [75,75,10] #xo,yo,sigma 

Далее мы называем функцию фитинга из optimize модуля с функцией указателя, сетки, данные из вашей функции и начальные догадок:

popt, pcov = opt.curve_fit(gauss2dFunc, (X, Y), gauss2d().ravel() , p0=initial_guess) 

popt теперь содержит три параметров в список.

Этот ответ навеян Fitting a 2D Gaussian function using scipy.optimize.curve_fit - ValueError and minpack.error

Смежные вопросы