2016-10-28 61 views
0

我有一個具有未知位置的嘈雜的非正常二維高斯數組,以及未知的均值和方差。我怎樣才能計算高斯的中心位置和它的寬度和高度在一定的置信水平?檢索二維高斯數組的位置信息

對於樣品的情況下像一個完美的普通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實現這一點?

我不知道如何計算寬度和高度。我也在考慮使用一些基於密度的聚類方法來提供位置信息,例如scikit-learn的DBSCAN,但不知道如何實際操作。

非常感謝提前!

+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() 

此功能需要當前座標(XY)的元組,所述中心座標的高斯和西格瑪的。

然後定義x,y座標的網格,我們對3個參數進行初始猜測。

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