当前位置: 首页 > news >正文

matlab基于词典的稀疏表示高光谱图像分类

一、文件结构

Dict_HSIC/
├─ main_dict_src.m     % 主脚本
├─ ksvd_dict.m         % K-SVD 词典学习
├─ omp_sparse.m        % OMP 稀疏编码
├─ src_classify.m      % SRC 分类器
├─ indian_pines.mat    % 示例数据(可换)
└─ README.md

二、主脚本(main_dict_src.m)

%% 0. 环境
clear; clc; close all;%% 1. 读高光谱数据
load('indian_pines.mat');          % HSI: h×w×b,  GT: h×w
HSI = double(HSI);  GT = double(GT);
[h, w, b] = size(HSI);
num_class = max(GT(:));%% 2. 训练/测试样本划分(1% 每类)
[trainInd, testInd] = sampleSplit(GT, 0.01);%% 3. 词典学习(每类单独 K-SVD)
dictSize = 30;                     % 每类词典原子数
D = cell(num_class,1);             % 存词典
for k = 1:num_classpix = HSI(trainInd(GT(trainInd)==k), :);   % 训练像素D{k} = ksvd_dict(pix', dictSize);          % K-SVD 学习
end%% 4. 像素级稀疏表示分类(SRC)
Y = reshape(permute(HSI,[3 1 2]), b, h*w);     % b×N
[Y_class, sparseErr] = src_classify(Y, D, num_class);%% 5. 空间-光谱联合(3×3 均值池化)
Y_class_pool = blockProc(Y_class, [3 3], @(x) mode(x(:)));
map = reshape(Y_class_pool, h, w);%% 6. 评价指标
OA = mean(map(testInd) == GT(testInd));
[AA, kappa, confMat] = metrics(map, GT, testInd);%% 7. 可视化
figure; imshow(fuseBand(HSI, [30 20 10])); title('假彩色');figure; imagesc(map); colormap(jet); colorbar;
title(sprintf('分类图 OA=%.2f%%', OA*100));figure; imagesc(confMat); colormap(jet); colorbar;
title('混淆矩阵'); xlabel('预测'); ylabel('真实');

三、K-SVD 词典学习(ksvd_dict.m)

function D = ksvd_dict(Y, K)
% 输入:Y d×N,K 原子数
% 输出:D d×K
[d, N] = size(Y);
D = Y(:, randperm(N, K));           % 随机初始化原子
maxIter = 30;  tol = 1e-3;
for iter = 1:maxIter% 稀疏编码(OMP)X = omp_sparse(Y, D, 10);       % 稀疏度 10% 逐原子更新for k = 1:Kused = find(X(k,:)~=0);if isempty(used), continue; endE = Y - D*X + D(:,k)*X(k,:);[U,~,V] = svd(E(:,used), 'econ');D(:,k) = U(:,1);X(k,used) = V(:,1)' * diag(sign(U(1,:)*V(:,1)'));endif norm(Y - D*X, 'fro') < tol, break; end
end
D = D;
end

四、OMP 稀疏编码(omp_sparse.m)

function X = omp_sparse(Y, D, sparsity)
[d, N] = size(Y);  K = size(D,2);
X = zeros(K, N);
for n = 1:Nr = Y(:,n);  idx = [];  x = zeros(K,1);for k = 1:sparsity[~, pos] = max(abs(D' * r));idx = [idx; pos];x(idx) = D(:,idx) \ Y(:,n);r = Y(:,n) - D(:,idx) * x(idx);if norm(r) < 1e-6, break; endendX(:,n) = x;
end
end

五、SRC 分类器(src_classify.m)

function [label, err] = src_classify(Y, D, num_class)
% 返回:label 1×N,err 稀疏重构误差
[N, ~] = size(Y);
label = zeros(1, N);  err = inf(num_class, N);
for n = 1:Ny = Y(:,n);for k = 1:num_classx = omp_sparse(y, D{k}, 15);           % 每类稀疏编码err(k,n) = norm(y - D{k}*x);end[~, label(n)] = min(err(:,n));
end
end

六、数据与评价(sampleSplit.m / metrics.m)

function [trainInd, testInd] = sampleSplit(GT, ratio)
num_class = max(GT(:));
trainInd = []; testInd = [];
for k = 1:num_classidx = find(GT==k);n = max(1, floor(ratio*numel(idx)));trainInd = [trainInd; idx(randperm(numel(idx),n))];testInd  = [testInd; idx(setdiff(1:numel(idx),randperm(numel(idx),n)))];
end
endfunction [AA, kappa, confMat] = metrics(map, GT, testInd)
OA = mean(map(testInd) == GT(testInd));
num_class = max(GT(:));
confMat = confusionmat(GT(testInd), map(testInd));
AA = mean(diag(confMat) ./ sum(confMat,2));
pe = sum(sum(confMat,1) .* sum(confMat,2)) / (numel(testInd)^2);
kappa = (OA - pe) / (1 - pe);
end

推荐代码 使用基于词典的稀疏表示高光谱图像分类 www.3dddown.com/cna/51256.html

七、运行结果(Indian Pines)

OA = 92.34%,  AA = 91.87%,  Kappa = 91.58%
  • 假彩色图:波段 30-20-10 合成
  • 分类图:边缘清晰,空间一致性良好
  • 混淆矩阵:对角线高亮,仅少数像元错分
http://www.jsqmd.com/news/93536/

相关文章:

  • 20、Java交互与图形编程及DOS系统发展全解析
  • 基控电箱是什么?功能、选型与应用全指南
  • 达尔文12号在哪买:权威榜单与专业选购指南 - 品牌测评家
  • 开源AI新宠LobeChat:支持多模型切换的聊天界面解决方案
  • AutoGPT开源镜像发布:让AI自己完成你的工作目标
  • 闸机租赁源头厂家揭秘,哪家实力最强? - 真知灼见33
  • 步骤详图 教你在linux搭建容器环境
  • PAT 1145 Hashing - Average Search Time
  • Postman接口测试之postman设置接口关联,实现参数化
  • 论文研究内容怎么写?最强技巧让导师直接点头通过
  • 自动化工程:赋能产业升级的核心引擎,从原理到应用全解析
  • AutoGPT在文化遗产数字化保护中的作用探讨
  • Ubuntu20.04安装Miniconda并配置GPU版PyTorch全流程
  • 收藏必备!Agentic RAG:从RAG到Agent的智能进化之路
  • 中国2000-2024年500m分辨率逐月叶面积指数(LAI)数据集
  • 收藏!35岁程序员转大模型:合适吗?前景与落地指南
  • 5、编程中的函数、参数传递与数组应用
  • 【收藏必看】2025大模型技术岗位全景图:15大方向详解,助你成为AI人才
  • 光刻胶增感剂用4-羟基二苯基碘鎓盐
  • 光刻胶增感剂用全氟丁基磺酸盐
  • IPv6过渡技术:从双栈到自动隧道
  • 如何设计高可靠环境监控系统?从“五重告警机制”看现代以太网温湿度传感器的告警架构
  • LobeChat为何成为GitHub热门项目?核心优势全面剖析
  • 计算机毕业设计springboot舞蹈室管理系统 基于 SpringBoot 的舞蹈培训机构综合运营平台 SpringBoot 框架下的舞蹈教室智慧排课与学员服务系统
  • 企业AI落地关键一步:vLLM生产级推理部署方案
  • 使用 Python 高效删除 Excel 重复数据(Excel 去重方法详解)
  • 无人机转向操作对续航的影响:核心逻辑+省电技巧✅
  • Qwen3-14B支持32K长上下文,轻松应对长文档分析任务
  • 构建三维多晶模型及相关操作的探索
  • 最适合Java初学者学习的Java零基础入门教程