试图用scipy.interpolate计算FWHM的问题

时间:2014-06-24 00:22:49

标签: python image-processing scipy interpolation spline

我在尝试查找某些数据的FWHM时遇到问题。我最初尝试使用interpolate.interp1d拟合曲线。有了这个,我能够创建一个函数,当我输入一个x值时,它将返回一个插值的y值。问题是我需要此功能的反转。换句话说,我想切换我的独立变量和因变量。当我尝试切换它们时,我得到错误,因为必须对独立数据进行排序。如果我对数据进行排序,我将丢失索引,因此会丢失图形的形状。

我试过了:

x = np.linspace(0, line.shape[0], line.shape[0])
self.x_curve = interpolate.interp1d(x, y, 'linear')

其中y是我的数据。

为了反过来,我尝试了:

self.x_curve = interpolate.interp1d(sorted(y), x, 'linear')

但值已关闭。

然后我继续尝试使用UnivariateSpline并找到FWHM(来自这个问题:Finding the full width half maximum of a peak),但是roots()方法不断给我一个空列表[]

这就是我使用的:

x_curve = interpolate.UnivariateSpline(x, y)
r = x_curve.roots()
print(r)

这是数据的图像(使用UnivariateSpline):

Data plot

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:2)

使用UnivariateSpline.roots()获取FWHM只有在您移动数据以使其值在FWHM为0时才有效。

看到数据的背景是嘈杂的,我首先估计基线。例如:

y_baseline = y[(x<200) & (x>350)].mean()

(根据需要调整x的限制)。然后移动数据,使基线的中间和峰值为0.看到您的数据具有最小值而不是示例中的最大值,我使用y.min()

y_shifted = y - (y.min()+y_baseline)/2.0

现在为这个移位的数据拟合样条,roots()应该能够找到根,其差异是FWHM。

x_curve = interpolate.UnivariateSpline(x, y_shifted, s=0)
x_curve.roots()

如果要根据平滑数据估算FWHM,请增加s参数。