Điều này có thể dễ dàng thực hiện trong R
hoặc Python
. Có sẵn các chức năng được kiểm tra tốt, vì vậy bạn không phải lo lắng về bất kỳ ranh giới hoặc sắc thái nào. Hơn nữa, cả hai đều miễn phí và phổ biến trong các nhà khoa học.
Giải pháp cho R
Có một gói đặc biệt để xử lý dữ liệu phổ, được gọi là hyperSpec . Việc hiệu chỉnh đường cơ sở của dây cao su đã được thực hiện ở đó (chức năng spc.rubberband
). Tất cả các chi tiết được làm nổi bật trong tài liệu. Cách sử dụng khá đơn giản:
require(hyperSpec)
spc <- read.spe("paracetamol.SPE")
baseline <- spc.rubberband(spc)
corrected <- spc - baseline
Giải pháp cho Python
Không có giải pháp bên ngoài nào (theo sự hiểu biết tốt nhất của tôi) cho python, nhưng bạn có thể sử dụng scipy.spatial.ConvexHull
chức năng để tìm các chỉ số của tất cả các điểm tạo thành một thân lồi xung quanh quang phổ của bạn. Giả sử rằng phổ được chứa trong x
và y
mảng:
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
Mảng v
chứa các chỉ số của các điểm đỉnh, được sắp xếp theo hướng CCW, vd [892, 125, 93, 0, 4, 89, 701, 1023]
. Chúng ta phải trích xuất một phần v
tăng dần, ví dụ 0 0101023.
# 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])
Bây giờ đường cơ sở đã được sửa như thế này:
y = y - rubberband(x, y)