在高光谱图像的特征提取过程中,采用非线性降维的方式对高光谱图像降维的过程中,采用图自编码器来对数据进行降维,需要将利用高光谱图像的结构信息和内容信息,则需要将高光谱图像数据构造为一个图结构,图结构的构建需要通过KNN算法来构建邻接矩阵。

文章目录

  • 前言
  • 一、KNN图
  • 二、邻接矩阵A的构建
    • 1.邻接矩阵A
    • 2.高光谱图像构造KNN图
  • 三、像素角度来构建图
  • 总结
  • 参考文献

前言

主要介绍图结构的构建方法。


对于一个M x N x B维度的高光谱图像,构建KNN图可以从像素的角度,也可以从波段的角度来构建,对于整个高光谱图像来说,从像素的角度来构建KNN图的话(每一个像素作为图节点),则邻接矩阵的大小为n * n维度,其中n = M x N。而从波段的角度来构建KNN图的话(每一个波段作为图节点),则邻接矩阵的大小为B x B维度。

一、KNN图

1.1 高光谱波段向量集合,X = { xi_ii​}i=1N_{i = 1}^Ni=1N​ ∈ RN∗B^{N * B}N∗B,即 X为一个像素对应的波段集合,N和B分别为像素数和光谱波段数。

将高光谱图像维度变换为RN∗B^{N * B}N∗B形式,通过如下代码。

load('SalinasA_corrected.mat')
data = salinasA_corrected;
[width,height,band] = size(data);
hsi = reshape(data,width * height,band);

1.2 同时考虑光谱特征X和光谱波段的结构信息,我们首先将带集转换成一个带图G = (V,E, A),其中光谱带xi_ii​被视为图上的一个节点vi_ii​,E是通过计算每个光谱带的k近邻(kNN)来构造的。其中,邻域矩阵A∈Rb×b_{b×b}b×b​。

1.3 通过计算欧几里得距离得到了邻域关系,用这种方法构造的图称为kNN图
1.4 由于KNN算法是一个监督算法,需要使用到数据的标签信息,通过如下代码加载标签信息,便进行维度变换,通常情况下,标签0对应的像素我们不用来构造KNN图

load('SalinasA_gt.mat')
label = reshape(salinasA_gt,width * height,1);

1.5 KNN算法模型的搭建

  • 通过采用MATLAB内置的函数fitcknn函数来构建。fitcknn函数接受的数据为一行一条数据,一列一个特征维度,因此需要主要数据的维度变换。

kNNClassifier = fitcknn(X, Y, ‘NumNeighbors’, 1)

  • X为训练数据,Y为标签数据;
  • X每一行为一天数据,每条数据有多个特征;
  • Y每一行为一个标签,与X数据对应;
  • 输出为一个KNN分类器模型;

构造一个KNN分类器,分为5个类,默认采用欧几里得距离公式;

 KnnClassifier = fitcknn(hsi,label,'NumNeighbors', 5);

1.6 KNN模型预测分类
采用predict函数,输出参数为分类器模型,测试数据;测试数据为每一行为一条数据。

test = hsi(label ~= 0,:);            % 获取测试数据,排除0标签的数据;
result = predict(KnnClassifier,test);% 预测,返回值为数据对应的标签

1.7 k近邻计算

  • 由于上述KNN算法只能用于分类任务,并没有给出k个近邻,因此我们采用工具箱VLFeat来进行k近邻的计算;k近邻的计算不需要使用标签数据,而KNN分类器需要使用标签数据来分类。
    K近邻计算参考及工具箱安装:https://blog.csdn.net/john_bian/article/details/79424432
    VLF eat下载:https://www.vlfeat.org/index.html
load('SalinasA_gt.mat');
load('SalinasA_corrected.mat');
[width,height,band] = size(salinasA_corrected);
data = reshape(salinasA_corrected,width * height,band);
X = data';
Q = X(:,1);
% 构建kd树
kdtree = vl_kdtreebuild(X);
% 计算Q的k个近邻
[index, distance] = vl_kdtreequery(kdtree, X, Q, 'NumNeighbors', 5) ;

KNN原理介绍:https://www.cnblogs.com/pinard/p/6061661.html

二、邻接矩阵A的构建

1.邻接矩阵A

采用如下的公式来构造链接矩阵A,其中Nk_kk​(xi_ii​)为xi_ii​的kNN。


需要保证邻接矩阵是对称矩阵。

2.高光谱图像构造KNN图

基于上述知识,来构造高光谱图像的KNN图,对于高光谱图像,我们把每个像素作为一个样本,B个波段作为特征,让后对每个像素的波段集合,计算其k近邻,让后根据公式构造邻接矩阵;

  • 从像素角度构造邻接矩阵,A ∈ Rn×n^{n×n}n×n,确定,像素数量大,导致邻接矩阵过大。
clc
clear
%% 获取文件数据
load('SalinasA_corrected.mat');
load('SalinasA_gt.mat');
% 获取数据
data = salinasA_corrected;
label = salinasA_gt;%% 获取数据维度以及对数据进行维度变换
[width,height,band] = size(data);
% 维度变换并转置矩阵
N = width * height;
X = reshape(data,N,band)';% 样本
Y = reshape(label,N,1)';  % 标签%% 计算每个样本的k近邻,并构造邻接矩阵
% 邻接矩阵,每个像素作为图中一个节点,则邻接矩阵为N * N维度
A = zeros(N,N);
% 构建Kd树
kdtree = vl_kdtreebuild(X);
% 计算样本X(:,i)的k个近邻,并构造邻接矩阵A
for i = 1 : N[index, ~] = vl_kdtreequery(kdtree, X, X(:,i), 'NumNeighbors', 6) ;% 排除样本本身index = index(index ~= i);% 构造邻接矩阵A,此处可以体会邻接矩阵为整个高光谱图的邻接矩阵A(i,index) = 1;
end
if A == A'disp("对称矩阵");
else disp("非对称矩阵");
end
%%
  • 从波段的角度来构造邻接矩阵,邻接矩阵A ∈ Rb×b^{b×b}b×b。
clc
clear
%% 获取文件数据
load('KSC.mat');
load('KSC_gt.mat');
% 获取数据
data = KSC;
label = KSC_gt;%% 获取数据维度以及对数据进行维度变换
[width,height,band] = size(data);
% 维度变换
N = width * height;
X = reshape(data,N,band);% 样本
Y = reshape(label,N,1);  % 标签%% 计算每个样本的k近邻,并构造邻接矩阵
% 邻接矩阵,每个波段作为图中一个节点,则邻接矩阵为B * B维度
A = zeros(band,band);
% 构建Kd树
kdtree = vl_kdtreebuild(X);
% 计算样本X(:,i)的k个近邻,并构造邻接矩阵A
for i = 1 : band[index, ~] = vl_kdtreequery(kdtree, X, X(:,i), 'NumNeighbors', 6) ;% 排除样本本身index = index(index ~= i);% 构造邻接矩阵A,此处可以体会邻接矩阵为整个高光谱图的邻接矩阵A(i,index) = 1;
end
if A == A'disp("对称矩阵");
else disp("非对称矩阵");
end
%%

三、像素角度来构建图

3.1 像素作为图结构的节点,则G = (V,E,X),V = { vi=1,...,n_{i = 1,...,n}i=1,...,n​}是顶点集合,E = { eij_{ij}ij​}是边集合,X = { xi_ii​;…;xn_nn​}是属性值。

  • X ∈ Rn×d^{n×d}n×d
  • 邻接矩阵 A∈Rn×n^{n×n}n×n,如果eij_{ij}ij​ ∈E,则Aij_{ij}ij​ = 1,否则为0;

3.2 需要构造邻接矩阵A,需要知道图结构的边集;

总结

主要介绍高光谱图像利用结构信息和内容信息进行特征提取时,结构信息的构造,在这里主要就是邻接矩阵A的构造,梳理两篇论文中的方法,为自己理清思路,并做些编码记录;

参考文献

KNN 分类器:https://www.dazhuanlan.com/2019/10/23/5db00bf7d8ffb/
邻接矩阵A相关资料:https://www.cnblogs.com/pinard/p/6221564.html

MATLAB高光谱图像构建KNN图相关推荐

  1. Matlab高光谱图像PCA降维[附代码]

    开始介绍高光谱降维之前,我们首先回忆PCA的原理. 推荐B站UP:交通数据小旭学长 <用最直观的方式告诉你:什么是主成分分析PCA> 一.PCA原理 1.1 引入 假设手上有一组二维数据D ...

  2. matlab求图像的能量图,如何计算图像的能量

    夫兰克-赫兹实验[实验目的] 本实验通过对氩原子第一激发电位的测量,了解夫兰克和赫兹在研究原子内部能量问题时所采用的基本实验方法:了解电子与氩原子碰撞和能量交换过程的微观图象和影响这个过程的主要物理因 ...

  3. MATLAB处理高光谱图像数据

    以下内容主要包括四个方面: (1)显示第2到5条光谱反射率和波长的关系(折线图): (2)显示前四条叶绿素值的条形图 (3)显示叶绿素与各个波段的相关性折线图 (4)计算植被指数NDVI与叶绿素对应的 ...

  4. 一种改进的高光谱图像CEM目标检测算法

    一种改进的高光谱图像CEM目标检测算法 人工智能技术与咨询 来源:< 应用物理> ,作者付铜铜等 关键词: 高光谱图像:光谱重排:CEM算法:目标检测: 摘要: 约束能量最小化(Const ...

  5. 利用ArcGIS提取高光谱图像每个像素的光谱信息,再利用matlab显示每个像素的光谱信息

    1.示例高光谱图像 2.像素光谱信息提取步骤 2.1 栅格转点 在ArcGIS的工具箱中选择[栅格转点]工具,将每个像素都转成一个点,如下图所示: 2.2 多值提取至点 在ArcGIS的工具箱中选择[ ...

  6. 最全可白嫖之高光谱图像数据处理(格式转换,数据增强,通道剪切,大小裁剪,光谱显示,折线图表示)

    目录 (一)高光谱谱格式转换之rar转mat格式 ①RAW转tiff步骤: ②tiff转mat步骤: (二)两种方法把高光谱图像缩放到0-1的数据集 (三)高光谱数据预处理成规定大小和规格的数据集 ( ...

  7. 如何生成高光谱图像某一点像素值的反射光谱图

    如何生成高光谱图像某一点像素值的反射光谱图 在做高光谱图像超分辨率对比实验的时候需要画光谱反射折线图,在网上找了好久也不知道怎么画. 然后我再外网找到了用MATLAB画的方法,亲测可用! reflec ...

  8. Matlab绘图基础——利用axes(坐标系图形对象)绘制重叠图像 及 一图多轴(一幅图绘制多个坐标轴)

    Matlab绘图基础--利用axes(坐标系图形对象)绘制重叠图像 及 一图多轴(一幅图绘制多个坐标轴) - 司徒鲜生 - 博客园 Matlab中axes函数解析_ljh0302的博客-CSDN博客_ ...

  9. matlab箱形图_使用javascript可视化世界幸福来构建箱形图

    matlab箱形图 Data visualization is an important and sometimes undervalued tool in a data scientist's to ...

最新文章

  1. 为Office Communicator启用超链接
  2. Swift3.0语言教程使用字符串创建和初始化字符串
  3. CSS基础学习-8.CSS盒子模型_标准盒子9.CSS怪异盒子
  4. java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector解决方法
  5. 【渝粤题库】陕西师范大学291003综合英语(三)作业(高起专、高起本)
  6. lua cURL使用笔记
  7. phpcmsV9 关于phpcms根目录下ico图标,改了没效果的解决办法?
  8. maven的setting文件简单配置
  9. 谷歌Launchpad Studio瞄准医疗领域,从早期公司吸取行业经验
  10. java输出各国人的问候语_世界各国问候语及发音.doc
  11. 用for打印菱形java_Java 动态打印菱形代码之for循环的使用
  12. android java 图形_java – 在Android中呈现的图像上的锯齿状边缘
  13. 微信抢号软件_强推|那些写微信公众号一定要拥有的软件
  14. db4o java教程_Db4o 社区版 8.1.1 发布,面向对象数据库
  15. travis不生效,No builds for this repository
  16. C++循环结构设计——韩信点兵
  17. 基于javaweb+jsp的设备维修管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot)
  18. Java代码评审歪诗!让你写出更加优秀的代码!
  19. Java Dependence Analysis(Java静态依赖分析)
  20. 一文搞懂常用的网络概念:域名、动态IP、DNS、DDNS

热门文章

  1. LeetCode 366. 寻找二叉树的叶子节点(上下翻转二叉树+BFS)
  2. LeetCode 1169. 查询无效交易
  3. LeetCode 1109. 航班预订统计(差分思想)
  4. LeetCode 1277. 统计全为 1 的正方形子矩阵(DP)
  5. LeetCode 887. 鸡蛋掉落(DP,难、不懂)
  6. LeetCode 78. 子集(回溯)
  7. 石头剪刀布程序流程图_机器学习终章:剪刀石头布猜拳机器人
  8. k8s挂载目录_拥抱云原生,如何将开源项目用k8s部署?
  9. phppage类封装分页功能_PHP封装的page分页类定义与用法完整示例
  10. 论文浅尝 | KnowEdu: 一个自动构建教育知识图谱的系统