|
我打算将二维高斯函数拟合到显示激光束的图像上,以得到其参数如FWHM和位置。到目前为止,我试图理解如何在Python中定义一个二维高斯函数,以及如何将x和y变量传递给它。
我编写了一个小脚本,它定义了这个函数,绘制了它,给它添加了一些噪声,然后尝试使用curve_fit来匹配它。一切似乎都在工作,除了最后一个步骤,我试图使我的模型函数适应嘈杂的数据。这是我的代码:
- import scipy.optimize as opt
- import numpy as np
- import pylab as plt
- #define model function and pass independant variables x and y as a list
- def twoD_Gaussian((x,y), amplitude, xo, yo, sigma_x, sigma_y, theta, offset):
- xo = float(xo)
- yo = float(yo)
- 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)
- return offset + amplitude*np.exp( - (a*((x-xo)**2) + 2*b*(x-xo)*(y-yo) + c*((y-yo)**2)))
- # Create x and y indices
- x = np.linspace(0, 200, 201)
- y = np.linspace(0, 200, 201)
- x,y = np.meshgrid(x, y)
- #create data
- data = twoD_Gaussian((x, y), 3, 100, 100, 20, 40, 0, 10)
- # plot twoD_Gaussian data generated above
- plt.figure()
- plt.imshow(data)
- plt.colorbar()
- # add some noise to the data and try to fit the data generated beforehand
- initial_guess = (3,100,100,20,40,0,10)
- data_noisy = data + 0.2*np.random.normal(size=len(x))
- popt, pcov = opt.curve_fit(twoD_Gaussian, (x,y), data_noisy, p0 = initial_guess)
复制代码
得到一个错误
ValueError: object too deep for desired array
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
execfile(filename, namespace)
File "E:/Work Computer/Software/Python/Fitting scripts/2D Gaussian function fit/2D_Gaussian_LevMarq_v2.py", line 39, in <module>
popt, pcov = opt.curve_fit(twoD_Gaussian, (x,y), data_noisy, p0 = initial_guess)
File "C:\Python\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\scipy\optimize\minpack.py", line 533, in curve_fit
res = leastsq(func, p0, args=args, full_output=1, **kw)
File "C:\Python\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\scipy\optimize\minpack.py", line 378, in leastsq
gtol, maxfev, epsfcn, factor, diag)
minpack.error: Result from function call is not a proper array of floats.
|
|