我正在尝试将2D numpy数组(图像)适合Python中的高斯。图像中可能有多个强度源,但我想要的是靠近几何中心的一个。因此,我希望在对阵列中间部分进行“猜测”的同时进行拟合。我怎样才能做到这一点?到目前为止,这是我所拥有的(我对曲线拟合的其他事情也感到困惑;请参见下文):
import numpy as np
from scipy import optimize
def Gaussian_2D(x, y, x_0, y_0, theta, sigma_x, sigma_y, amp):
a = np.cos(theta)**2/(2*sigma_x**2) + np.sin(theta)**2/(2*sigma_y**2)
b = -np.sin(2*theta)/(4*sigma_x**2) + np.sin(2*theta)/(4*sigma_y**2)
c = np.sin(theta)**2/(2*sigma_x**2) + np.cos(theta)**2/(2*sigma_y**2)
exp_term = a * (x-x_0)**2
exp_term += 2*b*(x-x_0)*(y-y_0)
exp_term += c * (y-y_0)**2
return amp * np.exp(-exp_term)
def fit_to_model(data):
xdata = np.arange(0, np.shape(data)[1], 1)
ydata = np.arange(0, np.shape(data)[0], 1)
geom_middle = (np.shape(data)[0]//2, np.shape(data)[1]//2)
p0 = geom_middle #guess
fit = optimize.curve_fit(Gaussian_2D(xdata, ydata, geom_middle[1], geom_middle[0], 0, np.std(data), np.std(data), amp), xdata, ydata p0)
return fit
data
是2D数组。不过,我不确定用什么代替振幅,因为我实际上还不知道光源的振幅(我想使用高斯拟合来找出其振幅和实际位置)。我也不知道我是否正确定义了xdata
,ydata
和sigma
,因为在我的数组中每个维度上可能存在不同的标准偏差,并且{ {1}}沿轴返回一个数组。感谢您的帮助-谢谢!