用2D方程在Python中拟合图像
我有一张图片,我想把它适配到一个二维方程上,以便提取出nx和ny这两个参数。首先,我定义了一个二维函数和拟合的残差,然后我读取了图片文件,接着我尝试使用leastsq方法进行拟合,这是我的代码:
#!/usr/bin/python
import pyfits
import numpy as np
import numpy.random as npr
import matplotlib.pyplot as plt
import scipy.optimize
nx=870
ny=901
# define 2D function
def fun(nx,ny):
n=(1+((nx**2+ny**2)**0.5/150)**2)**-3.7
return n
vfun=np.vectorize(fun)
nxlist=np.linspace(-nx,nx,870)
nylist=np.linspace(-ny,ny,901)
X,Y=np.meshgrid(nxlist,nylist)
Z=vfun(X,Y)
def residuals(p,y,nx,ny):
nx,ny = p
err = y-fun(nx,ny)
return err
def peval (nx,ny,p):
nx,ny=p
return fun(nx,ny)
# read image file
def image():
h = pyfits.open('image.fits')
IM = h[0].data # copy the image data into a numpy (numerical python) array
return IM
y_true = image()
y_meas = y_true+0.1*np.random.randn(ny,nx) # add noise
colmap = plt.get_cmap('CMRmap') # load CMRmap colormap
plt.imshow(y_meas, cmap=colmap, origin='lower') # plot image using gray colorbar
plt.show()
# initial values
p0=[300,500]
plsq = scipy.optimize.leastsq(residuals,p0,args=(y_meas,nx,ny))
print plsq
但是,我收到了这个错误信息:
File "image_fit_test.py", line 51, in <module>
plsq = scipy.optimize.leastsq(residuals,p0,args=(y_meas,nx,ny))
File "/.../anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 364,
in leastsq
gtol, maxfev, epsfcn, factor, diag)
minpack.error: Result from function call is not a proper array of floats.
请问有人能建议一下解决方案吗?我哪里出错了?
谢谢大家!
1 个回答
1
只需将 residuals()
替换成下面的内容,就可以解决你的问题:
def residuals(p,y,nx,ny):
nx,ny = p
err = y-fun(nx,ny)
return err.flatten()
基本上,我怀疑调用 residuals(p0, meas, nx, ny)
这个函数会返回一个形状为 (nx, ny)
的 二维数组
,这会导致出现 minpack.error
的错误。你需要传递一个 一维数组
(或者一个 浮点数
)给 leastsq()
。