これはR
またはで簡単に実行できますPython
。十分にテストされた機能が利用できるので、境界やニュアンスを気にする必要はありません。さらに、どちらも無料で、科学者の間で人気があります。
Rのソリューション
hyperSpecと呼ばれる、スペクトルデータを処理する特別なパッケージがあります。ラバーバンドのベースライン補正はすでにそこに実装されています(関数spc.rubberband
)。すべての詳細はドキュメントで強調表示されています。使い方はとても簡単です:
require(hyperSpec)
spc <- read.spe("paracetamol.SPE")
baseline <- spc.rubberband(spc)
corrected <- spc - baseline
Pythonのソリューション
(私の知る限りでは)Pythonのすぐに使えるソリューションはありませんが、scipy.spatial.ConvexHull
関数を使用して、スペクトルの周囲に凸包を形成するすべてのポイントのインデックスを見つけることができます。スペクトルがx
and y
配列に含まれていると仮定します。
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
配列にv
は、CCW方向に配置された頂点ポイントのインデックスが含まれます[892, 125, 93, 0, 4, 89, 701, 1023]
。v
昇順の部分、たとえば0〜1023 を抽出する必要があります。
# 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])
これで、ベースラインは次のように修正されました。
y = y - rubberband(x, y)