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

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倍能交流一下更好了,本人初学者,编程也不太擅长,会加强学习,所有博客仅供个人复习看及同行参考交流用,期待进步。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值