用Matlab开启高光谱数据处理之旅

matlab处理 高光谱数据预处理(SG平滑、SNV、FD、SD、DWT、RL、MSC) 特征波段选择(CARS、UVE、SPA),建模(PLSR,RF,BPNN,SVR) 同时可以利用matlab提取高光谱影像的光谱信息,进行上述处理。

在科研与工程领域,高光谱数据蕴含着丰富的信息,但原始数据往往需要预处理才能发挥其最大价值。今天咱们就来唠唠如何用Matlab对高光谱数据进行一系列操作,从预处理到特征波段选择,再到建模,甚至还能对高光谱影像提取光谱信息后处理。

高光谱数据预处理

SG平滑(Savitzky - Golay滤波)

SG平滑是一种常用的降噪方法,通过对数据进行多项式拟合来平滑曲线。在Matlab里,用sgolayfilt函数就能轻松实现。

matlab 复制代码
% 假设data是我们的高光谱数据向量
data = [1, 1.2, 1.3, 1.1, 1.4, 1.5, 1.45, 1.6]; 
windowSize = 5; % 窗口大小,通常为奇数
polyOrder = 2; % 多项式阶数
smoothedData = sgolayfilt(data, polyOrder, windowSize);

代码分析:这里先定义了要处理的数据data,然后设置窗口大小windowSize和多项式阶数polyOrdersgolayfilt函数会根据这些参数对数据进行平滑处理,返回平滑后的数据smoothedData。窗口大小决定了参与拟合的数据点数量,阶数决定了拟合多项式的复杂程度。

SNV(标准正态变量变换)

SNV用于校正光谱数据因光程变化等因素造成的差异。Matlab代码如下:

matlab 复制代码
function snvData = SNV(data)
    [row, col] = size(data);
    snvData = zeros(row, col);
    for i = 1:row
        meanVal = mean(data(i, :));
        stdVal = std(data(i, :));
        snvData(i, :) = (data(i, :) - meanVal) / stdVal;
    end
end
% 使用
originalData = [1 2 3; 4 5 6; 7 8 9];
snvProcessed = SNV(originalData);

代码分析:上述代码定义了一个函数SNV,它接收一个二维数据矩阵data。函数通过遍历每一行数据,计算每行的均值meanVal和标准差stdVal,然后对每行数据进行标准化处理,最终返回处理后的数据snvData

FD(求导)、SD(平滑求导)

对高光谱数据求导可以突出数据的变化特征。Matlab里简单求导用diff函数。

matlab 复制代码
data = [1, 2, 4, 7, 11];
derivative = diff(data);

代码分析:diff函数会计算相邻数据点之间的差值,从而得到数据的一阶导数。如果要进行平滑求导,可以先进行SG平滑再求导。

DWT(离散小波变换)

DWT常用于信号去噪和特征提取。Matlab提供了dwt函数。

matlab 复制代码
load noisysine; % 加载示例数据
wname = 'db4'; % 小波基函数
[cA, cD] = dwt(noisy, wname); % 分解
denoised = waverec([cA, zeros(size(cD))], wname); % 重构,这里简单去掉细节系数进行去噪

代码分析:首先加载一个示例数据noisy,选择db4小波基函数。dwt函数将数据分解为近似系数cA和细节系数cD。重构时,我们简单地将细节系数设为0,只利用近似系数重构得到去噪后的数据denoised

RL(Robust Locally Weighted Regression,稳健局部加权回归)

RL用于对数据进行稳健拟合。Matlab里可以用lowess函数实现。

matlab 复制代码
x = 1:10;
y = [1.2, 2.1, 3.3, 4.2, 5.1, 6.3, 7.2, 8.1, 9.3, 10.2];
fit_y = lowess(x, y);

代码分析:lowess函数根据输入的自变量x和因变量y,进行稳健局部加权回归拟合,返回拟合后的fit_y值。

MSC(多元散射校正)

MSC校正可以消除由于颗粒大小、表面散射等因素引起的光谱变化。

matlab 复制代码
function mscData = MSC(data)
    refSpec = mean(data, 1); % 参考光谱
    [row, col] = size(data);
    mscData = zeros(row, col);
    for i = 1:row
        p = polyfit(refSpec, data(i, :), 1);
        mscData(i, :) = (data(i, :) - p(2)) / p(1);
    end
end
% 使用
originalData = [1 2 3; 4 5 6; 7 8 9];
mscProcessed = MSC(originalData);

代码分析:函数MSC首先计算所有光谱的平均光谱作为参考光谱refSpec。然后遍历每一条光谱,通过一次多项式拟合得到拟合系数p,再根据拟合系数对每条光谱进行校正,得到校正后的数据mscData

特征波段选择

CARS(竞争性自适应重加权采样)

CARS通过自适应重加权采样来选择重要特征波段。Matlab实现代码较复杂,大致思路是不断迭代计算权重,筛选出权重高的波段。

matlab 复制代码
% 假设X是高光谱数据矩阵,y是对应的标签向量
n = size(X, 2); % 波段数量
lambda = 0.1; % 权重更新参数
for iter = 1:10 % 假设迭代10次
    beta = regress(y, [ones(size(X, 1), 1), X]); % 线性回归
    weight = abs(beta(2:end)) / sum(abs(beta(2:end))); % 计算权重
    index = randperm(n); % 随机排列波段索引
    newIndex = index(1:round(n * lambda)); % 选择部分波段
    X_selected = X(:, newIndex);
    % 后续可继续根据模型性能调整lambda等参数
end

代码分析:每次迭代中,先进行线性回归得到系数beta,根据系数计算权重weight。然后随机选择部分波段构建新的数据矩阵X_selected,后续可以根据模型性能反馈进一步优化选择过程。

UVE(无信息变量消除)

UVE通过计算变量的不确定性来消除无信息变量。

matlab 复制代码
% 假设X是高光谱数据矩阵,y是对应的标签向量
n = size(X, 2);
beta = regress(y, [ones(size(X, 1), 1), X]); % 线性回归
stdBeta = std(beta(2:end)); % 系数标准差
meanBeta = mean(beta(2:end));
u = stdBeta / meanBeta; % 不确定性指标
threshold = 0.1; % 阈值
selectedIndex = find(u < threshold);
X_selected = X(:, selectedIndex);

代码分析:先进行线性回归得到系数beta,计算系数的标准差stdBeta和均值meanBeta,从而得到不确定性指标u。根据设定的阈值threshold,筛选出不确定性低的波段构建新的数据矩阵X_selected

SPA(连续投影算法)

SPA通过投影寻找最小冗余的特征波段。

matlab 复制代码
% 假设X是高光谱数据矩阵,y是对应的标签向量
numSel = 5; % 选择的波段数量
[selectedIndex, ~] = spa(X, y, numSel);
X_selected = X(:, selectedIndex);

代码分析:spa函数会根据输入的数据矩阵X和标签向量y,按照连续投影算法选择numSel个波段,返回选择的波段索引selectedIndex,进而构建新的数据矩阵X_selected

建模

PLSR(偏最小二乘法回归)

PLSR常用于建立自变量和因变量之间的关系模型。

matlab 复制代码
% 假设X是高光谱数据矩阵,y是对应的标签向量
X_train = X(1:80, :); % 训练集数据
y_train = y(1:80); % 训练集标签
X_test = X(81:end, :); % 测试集数据
y_test = y(81:end); % 测试集标签
model = plsregress(X_train, y_train, 'CV', 5); % 5折交叉验证建模
y_pred = predict(model, X_test); % 预测

代码分析:首先划分训练集和测试集,然后使用plsregress函数进行5折交叉验证建模得到模型model,最后用模型对测试集数据Xtest**进行预测得到预测值y pred

RF(随机森林)

随机森林是一种强大的集成学习模型。

matlab 复制代码
% 假设X是高光谱数据矩阵,y是对应的标签向量
X_train = X(1:80, :);
y_train = y(1:80);
X_test = X(81:end, :);
y_test = y(81:end);
numTrees = 100; % 树的数量
model = TreeBagger(numTrees, X_train, y_train); % 构建随机森林模型
y_pred = predict(model, X_test);

代码分析:同样先划分数据集,然后使用TreeBagger函数构建随机森林模型,设定树的数量为numTrees,最后用模型对测试集进行预测得到y_pred

BPNN(反向传播神经网络)

BPNN是一种常用的神经网络模型。

matlab 复制代码
% 假设X是高光谱数据矩阵,y是对应的标签向量
X_train = X(1:80, :);
y_train = y(1:80);
X_test = X(81:end, :);
y_test = y(81:end);
hiddenLayerSize = 10; % 隐藏层神经元数量
net = feedforwardnet(hiddenLayerSize); % 创建前馈神经网络
net = train(net, X_train', y_train'); % 训练网络
y_pred = sim(net, X_test'); % 预测

代码分析:划分数据集后,创建一个具有hiddenLayerSize个隐藏层神经元的前馈神经网络net,然后对网络进行训练,最后用训练好的网络对测试集进行仿真预测得到y_pred

SVR(支持向量回归)

SVR用于解决回归问题。

matlab 复制代码
% 假设X是高光谱数据矩阵,y是对应的标签向量
X_train = X(1:80, :);
y_train = y(1:80);
X_test = X(81:end, :);
y_test = y(81:end);
svrModel = fitrsvm(X_train, y_train); % 训练SVR模型
y_pred = predict(svrModel, X_test);

代码分析:划分数据集后,使用fitrsvm函数训练SVR模型svrModel,最后用模型对测试集进行预测得到y_pred

高光谱影像光谱信息提取与处理

利用Matlab还能从高光谱影像中提取光谱信息并进行上述处理。比如读取高光谱影像数据:

matlab 复制代码
img = hypercubeRead('yourImageFile.hdr'); % 假设影像文件格式为.hdr
spectralData = double(img.data); % 提取光谱数据
% 对spectralData进行上述预处理、特征选择、建模等操作

代码分析:hypercubeRead函数读取高光谱影像文件(假设格式为.hdr),然后提取其中的数据部分并转换为双精度类型double,得到光谱数据spectralData,之后就可以对它进行前面提到的各种处理啦。

matlab处理 高光谱数据预处理(SG平滑、SNV、FD、SD、DWT、RL、MSC) 特征波段选择(CARS、UVE、SPA),建模(PLSR,RF,BPNN,SVR) 同时可以利用matlab提取高光谱影像的光谱信息,进行上述处理。

高光谱数据处理是一个有趣且富有挑战的领域,Matlab提供了丰富的工具让我们能够高效地完成从数据预处理到建模的一系列工作。希望这篇博文能为大家在相关研究和应用中提供一些帮助。

相关推荐
jay神1 小时前
基于SpringBoot的英语自主学习系统
java·spring boot·后端·学习·毕业设计
qinaoaini2 小时前
Spring 简介
java·后端·spring
Cache技术分享2 小时前
322. Java Stream API - 使用 Finisher 对 Collector 结果进行后处理
前端·后端
何中应2 小时前
记录一次pom.xml依赖顺序产生的错误
后端·maven
dfyx9992 小时前
SpringBoot教程(三十二) SpringBoot集成Skywalking链路跟踪
spring boot·后端·skywalking
风的归宿552 小时前
一次openresty的网关性能优化之旅
后端
_Pluto_2 小时前
RabbitMQ的消息安全性
后端
踏浪无痕2 小时前
微服务日志与调用链打通方案:一个简单但实用的思路
后端