检索二维高斯阵列的位置信息
Retrieve location info of a 2D Gaussian array
我有一个嘈杂的非正态二维高斯数组,其位置未知,均值和方差也未知。如何在一定的置信水平下计算高斯的中心位置及其宽度和高度?
对于像完美的正常 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
我可以使用每个像素的 arg.max()
来获取中心位置,但对于嘈杂的情况,我可能需要使用每个 3x3
大小像素的 arg.max()
来稳健地计算中央。我怎样才能用 python 实现这一目标?
我不知道如何计算宽度和高度。我也在考虑使用一些基于密度的聚类方法来提供位置信息,例如 scikit-learn 的 DBSCAN,但不知道如何实际操作。
非常感谢!
这是一个经典的拟合问题,可以用例如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)、gaussian中心坐标和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
我有一个嘈杂的非正态二维高斯数组,其位置未知,均值和方差也未知。如何在一定的置信水平下计算高斯的中心位置及其宽度和高度?
对于像完美的正常 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
我可以使用每个像素的 arg.max()
来获取中心位置,但对于嘈杂的情况,我可能需要使用每个 3x3
大小像素的 arg.max()
来稳健地计算中央。我怎样才能用 python 实现这一目标?
我不知道如何计算宽度和高度。我也在考虑使用一些基于密度的聚类方法来提供位置信息,例如 scikit-learn 的 DBSCAN,但不知道如何实际操作。
非常感谢!
这是一个经典的拟合问题,可以用例如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)、gaussian中心坐标和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