Esto se puede hacer fácilmente en Ro Python. Hay funciones bien probadas disponibles, por lo que no tiene que preocuparse por los límites o matices. Además, ambos son gratuitos y populares entre los científicos.
Solución para R
Hay un paquete especial para manejar datos espectrales, llamado hyperSpec . La corrección de la línea base de la banda elástica ya está implementada allí (función spc.rubberband). Todos los detalles están resaltados en la documentación. El uso es bastante simple:
require(hyperSpec)
spc <- read.spe("paracetamol.SPE")
baseline <- spc.rubberband(spc)
corrected <- spc - baseline

Solución para Python
No existe (según mi leal saber y entender) una solución lista para usar para python, pero puede usar la scipy.spatial.ConvexHullfunción para encontrar índices de todos los puntos que forman un casco convexo alrededor de su espectro. Supongamos que el espectro está contenido xy las ymatrices:
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
La matriz vcontiene índices de los puntos de vértice, dispuestos en la dirección CCW, por ejemplo [892, 125, 93, 0, 4, 89, 701, 1023]. Tenemos que extraer la parte donde vestá ascendiendo, por ejemplo, 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])
Ahora la línea de base se corrige así:
y = y - rubberband(x, y)