小工具知识网

当前位置: 首页 > 行业知识 > 基于python的Spectral模块读取高光谱影像信息的一些笔记

行业知识

基于python的Spectral模块读取高光谱影像信息的一些笔记

2026-11-09 02:50:26 来源:互联网转载

1. 安装spectral���块

spectral模块的安装需要有numpy、pillow、wxpython、matplotlib、ipython等这几个包的铺垫,而且安装spectral模块时看的教程最好不要pip Install,要在安装完上述几个包之后在官网上下载,从Python Package Index(PyPI)或GitHub上的SPy Project Page下载,如果pip安装成功了当我没说哈哈,不过最终目的是能用就行,具体的也不太懂,不要深究。

2. 导入模块并读取高光谱数据

重点:之前我一直遇到程序报错Unable to locate file “XXX”. If the file exists, use its full path or place its directory in the SPECTRAL_DATA environment variable.但是我的目录路径都没有错,问了好久也没问出来。后来一次偶然尝试改错成功,问题就在路径中的单斜杠\改为双斜杠\,至于为什么,最终是调试成功了,可能人家就这么定义的吧。

import spectralimport numpy as np#用来做数组一类的处理#读取高光谱hdr头文件:因为信息都在这里边存储  data = spectral.open_image("F:\0210WRJData\GF_clip.hdr") img.load()  #可以把数据加载进来看看,输出的是一个数组的形式,大小为(行,列,波段数)

3.根据模块的参数读取高光谱的一些信息

基本文件信息读取:

img.shape      #打印出来的也是数组的形状,和img.load()效果一样print(img) #读取出来的是一些存储信息等,如下    #Data Source:   'F:10WRJData\GF_clip'# Rows:            277# Samples:         518# Bands:           330#Interleave:        BIL#Quantization:  16 bits#Data format:     int16

像素值信息读取:

假设要读取第一个波段的每个像元的灰度值,应该从0开始即img.read_band(0),代码中参数写的是1,因此读取的是波段2的像元灰度值,不要弄错了。

不过读取出来的值和软件里查看的差了1000倍,这个还不知道因为啥,如果有大神赐教,本人不胜感激。

band1_array = img.read_band(1)print(band1_array)print(band1_array.shape) #维度当然是二维数组了#[[0.1298 0.117  0.0941 ... 0.1251 0.1254 0.1229]#[0.117  0.1094 0.0992 ... 0.1251 0.1229 0.1203]#[0.1119 0.1043 0.0967 ... 0.1175 0.1101 0.1101] ...#[0.1081 0.103  0.0979 ... 0.1308 0.1438 0.1438]#[0.1081 0.1081 0.0979 ... 0.1308 0.1387 0.1413]#[0.1004 0.1106 0.1004 ... 0.1308 0.1362 0.1438]]#(277, 518)

高光谱图像显示:

view = spectral.imshow(img)view

运行结果:

如果输出的结果波段组合不是自己想要的,还可以自己指定波段进行显示:

view1 = spectral.imshow(img,(29,19,9))#括号里即为指定波段view1

显示高光谱立方体:

就像网上说的那样,确实没什么用,但是很酷。不过立方体画出来了会更便于后续理解,空间感更强。

一句代码基本搞定,同样波段组合可以自己设置,运行不太快,多等一会就好。

spectral.view_cube(img, bands=[29, 19, 9])#如果想保存指定波段组合的影像,下边这句代码可以实现spectral.save_rgb("F:10WRJData\hy_Cube", img, [29, 19, 9])

读取光谱曲线:

import matplotlib.pyplot as plt#比如要读取第34行81列的像元波谱曲线:plt.plot(img[33,80])

已经验证过,和在软件里看到的波谱一样,只是横轴是波段数,纵坐标可能查了1000倍,这个应该是人家定义的和软件里的值有出入,不过后续也好处理,直接放大1000倍就和软件里读取到的一样了。

最后还是希望如果有大神知道为什么会缩放1000倍能交流一下更好了,本人初学者,编程也不太擅长,会加强学习,所有博客仅供个人复习看及同行参考交流用,期待进步。

上一篇:pytorch安装GPU版本 (Cuda12.1)教程: Windows、Mac和Linux系统下GPU版PyTorch(CUDA 12.1)快速安装

下一篇:宝塔面板怎么同步iis?