一文详解高光谱数据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() 方法或循环处…

【Spring】控制反转 依赖注入(本文内容由大模型生成)

控制反转 & 依赖注入 1.依赖注入就是控制反转吗2.能通俗易懂地解释一下 IOC 吗示例&#xff1a;老板、秘书、员工 3.怎么理解反转这个概念的3.1 传统方式3.2 使用依赖注入&#xff08;DI&#xff09;3.3 示例&#xff1a;Spring 框架中的控制反转 4.什么是 Java 中的 Bean5…

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…

超简单!spring 微服务之远程服务调用实战

Spring微服务架构概览 微服务是一种将单一应用程序开发为一组小型服务的方法&#xff0c;每个服务运行在自己的进程中&#xff0c;并通过轻量级机制&#xff08;通常是HTTP资源API&#xff09;进行通信。Spring Cloud作为构建微服务应用的解决方案之一&#xff0c;提供了丰富的…

在Selenium中有哪些元素对象操作方法?( ̄﹃ ̄)

在Selenium中&#xff0c;driver.find_element() 方法用于定位页面上的单个元素。一旦你定位到了一个元素&#xff0c;你可以对这个元素执行多种操作。此外&#xff0c;driver.find_element() 只是定位元素的方法之一&#xff0c;它还有其他一些相关的方法和属性&#xff0c;但…

精准医疗沟通新体验:开源语音识别(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 …

【VUE】Vue2中extends方法

允许声明扩展另一个组件 (可以是一个简单的选项对象或构造函数)&#xff0c;和mixins有点类似。 在 Vue.js 2.x 中&#xff0c;extends API 可以用于混合一个对象到组件的选项中。它可以很方便地将多个对象混合成一个对象&#xff0c;并传递给 Vue.js 组件。语法如下&#xff1…

今日所学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 因为这是最…

【AI大模型】ChatGPT模型原理介绍

ChatGPT 是一种基于大规模深度学习语言模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;的 AI 模型。它使用自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;基于大量文本数据进行训练&#xff0c;通过生成式模型来理解和生成自然语言对话。以下是…

微信小程序live-pusher和video同时使用,video播放声音时时大时小

一、遇到的问题 微信小程序live-pusher和video同时使用,video播放声音时有时无时大时小 二、排查流程 业务是模拟面试,每道题一个推流live-pusher和一个面试题video,一次面试有多道面试题,页面就一个live-pusher和一个video,切换面试题时给live-pusher和video重新赋值u…

gitlab 配置ssh keys

settings -- 终端配置&#xff1a; git config --global user.email "yxthotmail.cm" 配置gitlab 账号邮箱 git config --global user.name "xt.yao" 配置gitlab账号用户名 生成SSH key&#xff0c;输入命令ssh-keygen -t rsa&#xff0c;一直按回车…

管家婆财贸ERP BB033.查看历史销售选存货

最低适用版本: 财贸系列 21.5 插件简要功能说明: 销售单支持选择历史销售明细数据,快捷开单采购单保存后,明细存货的存货备用8更新为当前采购单制单日期更多细节描述见下方详细文档插件操作视频: 进销存类定制插件--查看历史销售选存货 插件详细功能文档: 1. 销售单增…

JavaScript 的 class 和箭头函数

在JavaScript中&#xff0c;class 和箭头函数&#xff08;Arrow functions&#xff09;是ES6&#xff08;ECMAScript 2015&#xff09;引入的两个重要特性&#xff0c;它们分别提供了更简洁和更强大的方式来定义对象和函数。下面是对这两个特性的详细解释&#xff1a; Class&a…

使用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 使用…