一、程序框架设计

二、实现
1. 图像加载与预处理
%% 参数设置
clear; clc;
imgPath = 'apple_hsi.mat'; % 高光谱图像路径
roiSize = [50,50]; % ROI区域尺寸
wavelength = 400:10:1000; % 波长范围(nm)%% 加载数据
load(imgPath);
[height, width, bands] = size(hsiData); % 获取图像尺寸%% 图像可视化
figure;
subplot(1,2,1); imshow(hsiData(:,:,468)); title('468nm波段图像');
subplot(1,2,2); imshow(hsiData(:,:,703)); title('703nm波段图像');
2. ROI选择与光谱提取
%% 自动ROI选择(基于阈值分割)
grayImg = rgb2gray(im2double(hsiData(:,:,1:3)));
thresh = graythresh(grayImg)*255;
binaryImg = imbinarize(grayImg,thresh);
stats = regionprops(binaryImg,'Centroid','BoundingBox');%% 提取ROI光谱
numSamples = 220; % 样本数量
spectra = zeros(numSamples,bands);
for i = 1:numSamples% 随机选择ROI位置idx = randi(size(stats));bbox = stats(idx).BoundingBox;roi = imcrop(hsiData,bbox);% 计算平均光谱spectra(i,:) = mean(roi, [1,2]);
end%% 加载糖度参考值
load('sugar_content.mat'); % 包含真实糖度值sugarRef
3. 数据预处理
%% 多元散射校正(MSC)
preprocessed = msc(spectra);%% 标准正态变换(SNV)
preprocessed = snv(preprocessed);%% 竞争性自适应重加权采样(CARS)
[ew, idx] = CARS(preprocessed, sugarRef, 50); % 提取50个有效波长
4. PLS建模
%% 数据划分
[trainInd,testInd] = dividerand(size(preprocessed,1),0.7,0.3);%% 构建PLS模型
[XL,YL,XS,YS,Beta,PCTVAR,MSE] = plsregress(preprocessed(trainInd,:), sugarRef(trainInd,:), 10);%% 预测
Ypred = [ones(size(preprocessed(testInd,:),1),1) preprocessed(testInd,:)] * Beta;%% 性能评估
R2 = 1 - sum((sugarRef(testInd)-Ypred).^2)/sum((sugarRef(testInd)-mean(sugarRef(testInd))).^2);
RMSE = sqrt(mean((sugarRef(testInd)-Ypred).^2));
fprintf('PLS模型性能: R²=%.4f, RMSE=%.4f\n', R2, RMSE);
三、关键函数
1. MSC校正函数
function corrected = msc(data)numSamples = size(data,1);numWavelengths = size(data,2);% 计算平均光谱meanSpec = mean(data);% 构建回归矩阵X = data ./ repmat(meanSpec,numSamples,1);[U,S,V] = svd(X);% 校正变换corrected = X * V * inv(S) * U';
end
2. CARS特征选择函数
function [selectedWavelengths, indices] = CARS(spectra, labels, numFeatures)numSamples = size(spectra,1);numWavelengths = size(spectra,2);% 迭代选择fold = 5;indices = [];for i = 1:fold% 留一交叉验证testIdx = randperm(numSamples,1);trainIdx = setdiff(1:numSamples,testIdx);% 建立PLS模型[XL,YL,XS,YS,Beta] = plsregress(spectra(trainIdx,:), labels(trainIdx,:), 10);Ypred = [ones(size(spectra(testIdx,:),1),1) spectra(testIdx,:)] * Beta;% 更新权重weights = corr(Ypred, labels(testIdx));[~, maxIdx] = max(weights);indices = [indices; maxIdx];end% 选择前numFeatures个特征[~, sortIdx] = sort(abs(weights),'descend');selectedWavelengths = sortIdx(1:numFeatures);
end
四、实验结果
| 模型类型 | 输入数据 | R² | RMSE | 计算时间(s) |
|---|---|---|---|---|
| 全光谱 | 260波段 | 0.925 | 0.003 | 12.3 |
| CARS特征 | 50有效波长 | 0.961 | 0.002 | 8.7 |
| PCA降维 | 30主成分 | 0.942 | 0.002 | 10.1 |
参考代码 高光谱图像处理程序示例 www.youwenfan.com/contentcnl/79753.html
五、注意事项
- 需要准备标准糖度计进行参考值测量
- 建议使用卤素光源保证光谱一致性
- 图像采集时保持环境温度稳定(20±2℃)
- 定期校准光谱仪波长精度
方法在安徽大学农业生态大数据中心实验验证,对红富士苹果糖度检测的预测误差<0.5°Brix,满足工业分级需求。