检索2D高斯数组的位置信息

时间:2016-10-28 13:43:42

标签: python numpy gaussian data-fitting

我有一个嘈杂的异常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实现呢?

我不知道如何计算宽度和高度。我也在考虑使用一些基于密度的聚类方法来提供位置信息,例如scikit-learn的DBSCAN,但不知道如何实际操作。

非常感谢提前!

1 个答案:

答案 0 :(得分: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