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 spectral
import 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:\0210WRJData\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:\0210WRJData\hy_Cube", img, [29, 19, 9])
读取光谱曲线:
import matplotlib.pyplot as plt
#比如要读取第34行81列的像元波谱曲线:
plt.plot(img[33,80])
已经验证过,和在软件里看到的波谱一样,只是横轴是波段数,纵坐标可能查了1000倍,这个应该是人家定义的和软件里的值有出入,不过后续也好处理,直接放大1000倍就和软件里读取到的一样了。
最后还是希望如果有大神知道为什么会缩放1000倍能交流一下更好了,本人初学者,编程也不太擅长,会加强学习,所有博客仅供个人复习看及同行参考交流用,期待进步。