【问题标题】:Retrieve location info of a 2D Gaussian array [duplicate]检索二维高斯数组的位置信息 [重复]
【发布时间】:2017-03-11 10:11:39
【问题描述】:

我有一个嘈杂的非正态二维高斯数组,位置未知,均值和方差未知。如何在一定的置信水平下计算高斯的中心位置及其宽度和高度?

对于像完美正态二维高斯这样的样例:

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

我可以使用每个像素的arg.max() 来获取中心位置,但对于嘈杂的情况,我可能需要使用每个3x3 大小的像素的arg.max() 来稳健地计算中心。我怎样才能用 python 实现呢?

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

非常感谢!

【问题讨论】:

  • 看看this
  • 这正是我所需要的!谢谢亚伦!

标签: python numpy gaussian data-fitting


【解决方案1】:

这是一个经典的拟合问题,可以用例如scipy.optimize-模块。首先我们定义拟合函数,即二维高斯:

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)、高斯中心坐标和sigma的元组。

然后定义 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2013-09-22
    • 1970-01-01
    • 2016-09-12
    • 2021-04-10
    • 2015-04-05
    • 2016-04-14
    相关资源
    最近更新 更多