我基本了解了橡皮筋/基线校正的工作原理。


给定的频谱分为(N)个范围。
确定每个范围中的最低点。
/>最初的基线是由这些点构成的。
现在,光谱上的所有点都被当前范围内的最低点与基线上的最低点之间的差所拉低。

不过,有些细微之处我不知道该如何处理。例如,如果这些点之一恰好位于两个范围之间的边界上,等等。

另外,我必须能够证明我正在编写的算法是可靠的并且可以

如果有人可以给我一些参考,我将非常高兴。

评论

也许有人知道更好的或类似的方法来检测和校正基线。

#1 楼

这可以在RPython中轻松完成。有经过良好测试的功能,因此您不必担心任何边界或细微差别。而且,它们都是免费的,并且在科学家中很受欢迎。

R的解决方案

有一个特殊的程序包可处理光谱数据,称为hyperSpec。橡皮筋基线校正已在此处实现(功能spc.rubberband)。所有详细信息均在文档中突出显示。用法很简单:

require(hyperSpec)
spc <- read.spe("paracetamol.SPE")
baseline <- spc.rubberband(spc)

corrected <- spc - baseline




Python解决方案

没有(最好就我所知)针对python的即用型解决方案,但是您可以使用scipy.spatial.ConvexHull函数查找在光谱周围形成凸包的所有点的索引。假设频谱包含在xy数组中: v。我们必须提取[892, 125, 93, 0, 4, 89, 701, 1023]升序的部分,例如0–1023。

import numpy as np
from scipy.spatial import ConvexHull

def rubberband(x, y):
    # Find the convex hull
    v = ConvexHull(np.array(zip(x, y))).vertices


现在像这样校正基线:

    # Rotate convex hull vertices until they start from the lowest one
    v = np.roll(v, -v.argmin())
    # Leave only the ascending part
    v = v[:v.argmax()]

    # Create baseline using linear interpolation between vertices
    return np.interp(x, x[v], y[v])


评论


$ \ begingroup $
好的答案,而且也是双语! :-)
$ \ endgroup $
– Peter K.♦
16年5月11日在11:36

#2 楼

使用Modpoly,Imodpoly和Zhang拟合算法的python解决方案。
Python库BaselineRemoval具有Modpoly,IModploy和Zhang拟合算法,当您将原始值输入为python列表或pandas系列并指定多项式时,它们可以返回基线校正结果。
将库安装为pip install BaselineRemoval。以下是示例
from BaselineRemoval import BaselineRemoval

input_array=[10,20,1.5,5,2,9,99,25,47]
polynomial_degree=2 #only needed for Modpoly and IModPoly algorithm

baseObj=BaselineRemoval(input_array)
Modpoly_output=baseObj.ModPoly(polynomial_degree)
Imodpoly_output=baseObj.IModPoly(polynomial_degree)
Zhangfit_output=baseObj.ZhangFit()

print('Original input:',input_array)
print('Modpoly base corrected values:',Modpoly_output)
print('IModPoly base corrected values:',Imodpoly_output)
print('ZhangFit base corrected values:',Zhangfit_output)

Original input: [10, 20, 1.5, 5, 2, 9, 99, 25, 47]
Modpoly base corrected values: [-1.98455800e-04  1.61793368e+01  1.08455179e+00  5.21544654e+00
  7.20210508e-02  2.15427531e+00  8.44622093e+01 -4.17691125e-03
  8.75511661e+00]
IModPoly base corrected values: [-0.84912125 15.13786196 -0.11351367  3.89675187 -1.33134142  0.70220645
 82.99739548 -1.44577432  7.37269705]
ZhangFit base corrected values: [ 8.49924691e+00  1.84994576e+01 -3.31739230e-04  3.49854060e+00
  4.97412948e-01  7.49628529e+00  9.74951576e+01  2.34940300e+01
  4.54929023e+01


#3 楼

可能有很多技术。您的想法对我来说似乎很好。

另外两个想法:


对数据进行FFT并过滤出最低频率。这也消除了基线调制。当然,您必须手动或从数据中得出的合理猜测中找到正确的滤光片宽度。
使用具有多个长波长的余弦函数并对数据进行线性拟合。您也可以通过简单的滤波器或通过对数据点的信号强度进行加权来剔除峰。


#4 楼

[EDIT 2018/03/24]自从回答以来,已经记录了对光谱数据的几种用途

如果您的光谱峰相对较细,并且在基线以上的频率范围内具有几乎较低的频率,则几乎为正,我建议尝试一下BEADS(带有稀疏性的基线估计和去噪),该算法基于数据的稀疏性及其派生函数。它可以很好地处理色谱数据。 Matlab代码可用,并且BEADS页面收集R或C ++代码以及已知用法。在这里,您可以找到拉曼光谱,天文高光谱星系光谱,X射线吸收光谱(XAS),X射线衍射(XRD)和XAS / XRD组合测量的用途。