基于Python的高光谱图像显示
- 高光谱数据:点击此处可下载
- 用到的库:matplotlib 2.23、scipy 1.10、spectral 0.21
- 主要内容:图像显示、类别显示、图像立方体显示、N维特征显示
欢迎有兴趣的朋友交流指点。最后,废话不多说直接上代码😄
import matplotlib.pyplot as plt
from scipy.io import loadmat
import spectral as spy
# 获取mat格式的数据,loadmat输出的是dict,所以需要进行定位
input_image = loadmat('D:/Hyper/Salinas_corrected.mat')['salinas_corrected']
gt = loadmat("D:/Hyper/Salinas_gt.mat")['salinas_gt']
view1 = spy.imshow(data=input_image, bands=[69, 27, 11], title="img") # 图像显示
view2 = spy.imshow(classes=gt, title="gt") # 地物类别显示
view3 = spy.imshow(data=input_image, bands=[69, 27, 11], classes=gt)
view3.set_display_mode("overlay")
view3.class_alpha = 0.3 # 设置类别透明度为0.3
spy.view_cube(input_image, bands=[69, 27, 11]) # 显示后会打印相应功能及操作
pc = spy.principal_components(input_image) # N维特征显示 view_nd与view_cube需要ipython 命令行输入:ipython --pylab
xdata = pc.transform(input_image) # 把数据转换到主成分空间
spy.view_nd(xdata[:, :, :15], classes=gt)
plt.pause(60)
- ImageView附加功能:显示图像窗口时按“h”显示所有键控和鼠标功能
- 显示图像窗口状态下(view1),按下“z”键将打开放大窗口显示放大视图,之后按“Ctrl”键并左键单击原始窗口,可将放大窗口平移到单击的像素位置。双击窗口中的特定位置,显示点击像素的二维光谱图
- 交互式编辑类标签:可选择地物类别图像中的矩形区域分配新的类别ID来交互式地修改像素类ID。类ID为非负整数。(view2)中按住Shift拖动鼠标左键选择区域,输入数字类ID回车赋值,再回车确定。可提前设置一个二维数组,然后用此方法赋值,估计分类检验有用
spy.save_rgb('rgb.jpg', img, [29, 19, 9]) # 保存RGB图像
spy.save_rgb('gt.jpg', gt, colors=spy_colors) # 保存索引图像
View1:
放大窗口显示:
![](https://img-blog.csdnimg.cn/2021013015204275.png)
光谱曲线显示:
![](https://img-blog.csdnimg.cn/20210130152119332.png)
view2:
编辑部分标签后:
view3:
图像立方体:
N维特征显示:
![](https://img-blog.csdnimg.cn/20210130165102395.png)
![](https://img-blog.csdnimg.cn/20210130165135767.png)
任意特征显示:
![](https://img-blog.csdnimg.cn/20210130165158953.png)
from scipy.io import loadmat
import spectral as spy
import numpy as np
# 读取ENVI的.hdr文件、Erdas的.lan文件以及aviris文件
data = spy.open(file_name)
# 读取Matlab的.mat文件
data = loadmat(file_name)['key'] # 返回的是dict,所以需要key
# 读取.raw的文件(BIL)
raw_image = np.fromfile(file_name, dtype)
format_image = np.zeros((lines, samples, bands)) # 参数分别对应文件行数、列数、波段数,对应的hdr文件可查询
for row in range(0, lines):
for dim in range(0, bands):
format_image[row, :, dim] = raw_image[(dim + row * bands) * samples:(dim + 1 + row * bands) * samples]
# 最后读取结果应该都是<class 'numpy.ndarray'>了,方便进一步处理操作😄