一文详解高光谱数据python处理包spectral(SPy)

一、基本操作

  • 读取高光谱数据文件
import spectral
# 读取ENVI格式的高光谱图像
# image的后缀可以是.raw、.spe、.lan等
# 代码里img对象,类似于rasterio库的dataset对象,可以用它来读取高光谱数据
img = spectral.envi.read_envi(file='my_data.hdr', image='my_data')
  • 加载数据
# 通过load函数获取数据
data = img.load() # 多维数组
  • 读取元数据
# 读取元数据metadata,可以获取坐标系统和变换系数
metadata=img.metadata
projection = metadata['pseudo projection info'] 
rpc =metadata['rpc info']
  • 获取高光谱图像的子集
# 获取高光谱图像的前10个波段
subset = img.extract(0, 10)# 读取单个波段
data0 = img.read_band(0)
  • 获取波长信息
wavelength_units= img.bands.band_unit  # 获取波长单位
wl=img.bands.centers # 获取中心波长
bandwidth=img.bands.bandwidths # 获取光谱分辨率,半高全宽
  • 显示高光谱图像并保存
 from spectral import *img = open_image('92AV3C.lan')view = imshow(img, (29, 19, 9)) # 显示save_rgb('rgb.jpg', img, [29, 19, 9]) # 保存

在这里插入图片描述

查看view的具体信息:

# 可以看到展示的三个RGB波段的索引以及值域
print(view)
ImageView object:Display bands       :  (29, 19, 9)Interpolation       :  <default>RGB data limits     :R: [2054.0, 6317.0]G: [2775.0, 7307.0]B: [3560.0, 7928.0]
  • 显示光谱信息

可以通过以下方式开启交互功能:

import matplotlib  
matplotlib.use('WXAgg')  # 注意:这行代码必须在导入pyplot之前执行

交互功能开启后,加载图像,点击图像上的像素点,即可出现相应的光谱曲线:

# imshow函数可以显示三波段的图像,并且可以显示指定位置的光谱信息view = imshow(img, (29, 19, 9)) # 显示

在这里插入图片描述

二、光谱算法

  • k-means 聚类
# k-means 聚类
(m, c) = kmeans(image=img, nclusters=20, max_iterations=30)

在这里插入图片描述

查看聚类中心:

import matplotlib.pyplot as plt
plt.figure()
for i in range(c.shape[0]):plt.plot(c[i])
plt.grid()

在这里插入图片描述

  • 监督分类

执行监督分类需要使用训练数据训练分类器,该分类器将样本与特定训练类相关联。要将类标签分配给具有 M 行和 N 列的图像中的像素,必须提供一个 MxN 整数值数组,其元素是相应训练类的索引。真值数组中的值为 0 表示未标记的像素(该像素未与训练类关联)。

# 加载并显示示例图像的地面实况地图
gt = open_image('92AV3GT.GIS').read_band(0)
v = imshow(classes=gt)# 通过调用 create_training_classes 来创建 TrainingClassSet 对象
classes = create_training_classes(img, gt)# 定义训练类后,创建一个监督式分类器,使用训练类对其进行训练,然后对图像进行分类
gmlc = GaussianClassifier(classes) # 高斯最大似然法# 训练分类器后,使用它来对与训练集具有相同光谱波段的图像进行分类
# 对训练图像进行分类并显示生成的分类图。
clmap = gmlc.classify_image(img)
v = imshow(classes=clmap)

在这里插入图片描述
上面的分类图显示了整个图像的分类结果。要仅查看真值像素的结果,必须屏蔽掉与训练类无关的所有像素

gtresults = clmap * (gt != 0)
v = imshow(classes=gtresults)

在这里插入图片描述

如果分类结果良好,预计上面的分类图看起来与原始真实地图非常相似。要仅查看errors,必须屏蔽 gtresults 中与真实图像不匹配的所有元素

 gterrors = gtresults * (gtresults != gt)v = imshow(classes=gterrors)

在这里插入图片描述
上图中误差图中的五个连续区域对应于 GaussianClassifier 忽略的真值类,因为它们的样本太少。

除了 GaussianClassifier,还提供了其他分类方法。

  • 降维

处理具有数百个波段的高光谱图像可能会造成计算负担,并且由于所谓的“维数诅咒”,分类精度可能会受到影响。为了缓解这些问题,通常需要降低数据的维度

# principal_components计算图像数据的主成分
# 并返回 PrincipalComponents 中的平均值、协方差、特征值和特征向量
pc = principal_components(img)
v = imshow(pc.cov)

在这里插入图片描述
在协方差矩阵显示中,较白的值表示较强的正协方差较暗的值表示较强的负协方差灰色值表示接近零的协方差

为了使用主成分降低维度,可以按降序对特征值进行排序,然后保留足够的特征值(相应的特征向量)来捕获总图像方差的所需部分。然后,将图像像素投影到剩余的特征向量上,以降低图像像素的维数。选择保留至少 99.9% 的总图像差异

 pc_0999 = pc.reduce(fraction=0.999)# How many eigenvalues are left?len(pc_0999.eigenvalues) # 32img_pc = pc_0999.transform(img)v = imshow(img_pc[:,:,:3], stretch_all=True)

在这里插入图片描述
现在,对缩减的主成分使用高斯最大似然分类器(GMLC)来针对训练数据进行训练和分类

classes = create_training_classes(img_pc, gt)
gmlc = GaussianClassifier(classes)
clmap = gmlc.classify_image(img_pc)
clmap_training = clmap * (gt != 0)
v = imshow(classes=clmap_training)

在这里插入图片描述
相关的errors:

training_errors = clmap_training * (clmap_training != gt)
v = imshow(classes=training_errors)

在这里插入图片描述

三、应用

案例:植被与土壤的分类和识别

要求1:提取地面、无人机高光谱数据的反射率

解决方案:ASD(Analytical Spectral Devices)是一种用于地面光谱测量的设备,可以测量多个波长范围内的反射率。提取ASD地面光谱数据通常可以采用以下步骤:

"""
1 读取ASD数据文件:ASD数据通常以文本文件的形式存储,可以使用Python中的Pandas库中的read_csv()函数来读取。
"""
import pandas as pd"""
2 数据清洗和预处理:数据通常需要进行清洗和预处理,例如去除无效数据点,对数据进行插值、平滑和校准等。
"""
data = pd.read_csv('ASD_data.csv')# 删除无效数据点
data = data.dropna()# 对数据进行插值
data = data.interpolate()# 对数据进行平滑处理
from scipy.signal import savgol_filter
data['refl_smooth'] = savgol_filter(data['refl'], 11, 2)"""
3 可以使用Python中的Spectral库来进行光谱分析,例如计算反射率
"""# 计算反射率
data['reflectance'] = data['refl'] / data['white']

要求2:采用机器学习如SVM、RF、CNN的方法进行识别

支持向量机(SVM)是一种常用的分类算法,可以用于高光谱数据的分类、识别和回归。

"""
以无人机获取的高光谱图像为例
""""""
1 读取高光谱数据
"""import spectral
img = spectral.open_image('data.hdr')"""
2 数据预处理
"""
from sklearn.decomposition import PCA
X = img.load()
X = X.reshape((X.shape[0]*X.shape[1], X.shape[2]))
pca = PCA(n_components=30)
X = pca.fit_transform(X)"""
3 分割数据集
"""
from sklearn.model_selection import train_test_split
y = img.read_band(145)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)from sklearn.model_selection import train_test_split
y = img.read_band(145)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)"""
4 SVM分类
"""
使用Python中的sklearn库中的SVC()函数来进行SVM分类:
from sklearn.svm import SVC
clf = SVC(kernel='linear')
clf.fit(X_train, y_train)"""
5 评估分类器
"""
from sklearn.metrics import classification_report
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))

在这里插入图片描述

参考:
https://www.spectralpython.net/index.html
https://zhuanlan.zhihu.com/p/625036862

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】修炼之路-0008- String to Integer (atoi)【python】

题目 基本思路 其实题目已经说了如何实现了&#xff0c;我们按照给定的思路实现即可 1. 问题四大要求详解 1.1 处理空格 (Whitespace) 忽略字符串开头的任何空格字符 (" ")例如: " 123" 应该被处理为 “123”Python实现: 可以使用 strip() 方法或循环处…

Python浪漫之星星与文字构造的错位图

效果图&#xff1a; 完整代码&#xff1a; import tkinter as tk import random import math from tkinter.constants import *width 888 height 500 heartx width / 2 hearty height / 2 side 11class Star:def __init__(self, canvas, x, y, size):self.canvas canvas…

精准医疗沟通新体验:开源语音识别(ASR)如何提升医生与患者对话

需求背景&#xff1a;一家远程医疗公司在为偏远地区提供在线医疗服务的过程中&#xff0c;发现传统手动记录方式效率太低&#xff0c;无法满足需求&#xff0c;影响就诊的效率。 解决方案&#xff1a;使用思通数科的ASR平台&#xff0c;公司可以实现多话者对话转录和自动病历生…

MySql中的事务、MySql事务详解、MySql隔离级别

文章目录 一、什么是事务&#xff1f;二、事务四大特性ACID2.1、原子性&#xff08;Atomicity&#xff09;2.2、一致性&#xff08;Consistency&#xff09;2.3、隔离性&#xff08;Isolation&#xff09;2.4、持久性&#xff08;Durability&#xff09; 三、事务操作/事务的用…

MySQL-27.多表查询-案例

一.数据准备 -- 分类表 create table category (id int unsigned primary key auto_increment comment 主键ID,name varchar(20) not null unique comment 分类名称,type tinyint unsigned not null comment 类型 1 菜品分类 2 套餐分类,sort …

今日所学1024和1026

1 简便方法&#xff1a; 在文件夹里找到dll的文件路径&#xff0c;然后在系统变量里添加对应路径&#xff0c; 就不会报错了。 2关于报Qt插件的错,解决办法如下 1026Github的2FA 超级详细的github双重验证密码忘记或者获取不了了怎么办&github recovery code忘记怎么办…

计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议

文章目录 IPv4地址与MAC地址的封装位置IPv4地址与MAC地址的关系地址解析协议ARP工作原理ARP高速缓存表 IPv4地址与MAC地址的封装位置 在数据传输过程中&#xff0c;每一层都会添加自己的头部信息&#xff0c;最终形成完整的数据包。具体来说&#xff1a; 应用层生成的应用程序…

洛谷 P3130 [USACO15DEC] Counting Haybale P

原题链接 题目本质&#xff1a;线段树 感觉我对线段树稍有敏感&#xff0c;线段树一眼就看出来了&#xff0c;思路出来得也快&#xff0c;这道题也并不是很难。 解题思路&#xff1a; 这道题能看出来是线段树就基本成功一半了&#xff0c;区间修改区间查询&#xff0c;就基…

「二叉树进阶题解:构建、遍历与结构转化全解析」

文章目录 根据二叉树创建字符串思路代码 二叉树的层序遍历思路代码 二叉树的最近公共祖先思路代码 二叉搜索树与双向链表思路代码 从前序与中序遍历序列构造二叉树思路代码 总结 根据二叉树创建字符串 题目&#xff1a; 样例&#xff1a; 可以看见&#xff0c;唯一特殊的就…

深度学习-循环神经网络-LSTM对序列数据进行预测

项目简介: 使用LSTM模型, 对文本数据进行预测, 每次截取字符20, 对第二十一个字符进行预测, LSTM层: units100, activationrelu Dense层: units输入的文本中的字符种类, 比如我使用的文本有644个不同的字符, 那么units64 激活函数: 因为是多分类, 使用softmax 因为这是最…

使用Vue.js构建响应式Web应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用Vue.js构建响应式Web应用 1 引言 2 Vue.js简介 3 安装Vue CLI 4 创建Vue项目 5 设计应用结构 6 创建组件 7 使用…

2024“源鲁杯“高校网络安全技能大赛-Misc-WP

Round 1 hide_png 题目给了一张图片&#xff0c;flag就在图片上&#xff0c;不过不太明显&#xff0c;写个python脚本处理一下 from PIL import Image ​ # 打开图像并转换为RGB模式 img Image.open("./attachments.png").convert("RGB") ​ # 获取图像…

GCN+BiLSTM多特征输入时间序列预测(Pytorch)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GCNBiLSTM多特征输入时间序列预测&#xff08;Pytorch&#xff09; 可以做风电预测&#xff0c;光伏预测&#xff0c;寿命预测&#xff0c;浓度预测等。 Python代码&#xff0c;基于Pytorch编写 1.多特征输入单步预测…

【大数据学习 | kafka】kafuka的基础架构

1. kafka是什么 Kafka是由LinkedIn开发的一个分布式的消息队列。它是一款开源的、轻量级的、分布式、可分区和具有复制备份的&#xff08;Replicated&#xff09;、基于ZooKeeper的协调管理的分布式流平台的功能强大的消息系统。与传统的消息系统相比&#xff0c;KafKa能够很好…

MySQL-DQL练习题

文章目录 简介初始化表练习题 简介 本节简介: 主要是一些给出一些习题, 关于DQL查询相关的, DQL查询语句是最重要的SQL语句, 功能性最复杂, 功能也最强, 所以本节建议适合以及有了DQL查询基础的食用, 另外注意我们使用的是Navicat, SQL编辑的格式规范也是Navicat指定的默认格式…

Android 15: 探索未来的可能性

Android 15: 探索未来的可能性 随着技术的不断进步,我们的智能手机系统也在不断地进化。Android 15,作为谷歌最新推出的操作系统版本,带来了一系列令人兴奋的新特性和改进,让我们的数字生活更加丰富多彩。本文将带你一探Android 15的新特性,感受科技的魅力。 低光增强:…

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中&#xff0c;我们将一起深入了解K8s权限维持的攻击手法&#xff0c;通过研究这些攻击手法的技术细节&#xff0c;来更好地认识K8s权限维持所带来的安全风险。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s权限维持&#xff1a;简单介绍K8s权限维持…

安装OpenResty

OpenResty OpenResty 是一个基于 Nginx的高性能 Web 平台&#xff0c;用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。具备下列特点&#xff1a; 具备Nginx的完整功能 基于Lua语言进行扩展&#xff0c;集成了大量精良的 Lua 库、第三方模块…

python多线程处理xlsx,多进程访问接口

import pandas as pd from concurrent.futures import ThreadPoolExecutor# 读取Excel文件 file_path scence.xlsx df pd.read_excel(file_path)# 定义每10行处理逻辑 def process_rows(start_idx):end_idx min(start_idx 10, len(df)) # 处理每10行for i in range(start_…

【Linux系统】进程终止

一、进程退出方式 1、正常终止 主要两种类型&#xff1a;从 main 返回、调用 exit 和 _exit 具体讲解如下&#xff1a; &#xff08;1&#xff09;从 main 返回 这个的使用就不用多说了吧&#xff0c;相信你们已经烂熟于心了 作用&#xff1a;return 语句用于从函数中返回…