一、环境准备
需要安装spectral包,这个包专门用于高光谱数据展示。
pip install spectral
二、数据加载
要预先准备原始高光谱的.mat数据和分类数据gt.mat(ground-turth);然后使用scipy.io中的loadmat(.)将其读入程序。
from scipy.io import loadmatorg_img = loadmat('HDate/PaviaU/paviaU.mat')
需要注意的是,直接使用loadmat(.)会输出一个dict字典,其构成如下:
为了获取其中真正的高光谱数据矩阵,需要在loadmat(.)后再加一个 索引进行定位,所以完整的读取语句应该是:
from scipy.io import loadmatinput_image = loadmat('HDate/PaviaU/paviaU.mat')['paviaU']
gt = loadmat("HDate/PaviaU/paviaU_gt.mat")['paviaU_gt']
通过输出两个变量的种类和尺寸:
可知,高光谱图像是一个610*340*103的矩阵,类似于传统的RGB图像,前两维为长宽,最后一维为通道数,不过通道数相较于只有3通道的RGB图像而言要高很多。
而gt作为预先标记好的ground-turth矩阵,其相当于一张灰度图,每个像素点的值从0-255,分别表示不同的种类。
三、数据展示
数据展示主要使用spectral中的imshow(.)来完成,用法同opencv里的imshow(.)
1.高光谱图片展示
import spectral as spyview1 = spy.imshow(data=input_image, bands=[69, 27, 11], title="img")
tips.函数中的bands参数用于校正颜色,如果不添加bands参数就会出现渲染的颜色不正确的问题(如下图所示)。
2.高光谱分类展示
view2 = spy.imshow(classes=gt, title="gt")
3.高光谱图像和分类叠加展示
view3 = spy.imshow(data=input_image, bands=[69, 27, 11], classes=gt)
4.高光谱颜色通道展示
不知道什么用,反正就是很炫
spy.view_cube(input_image, bands=[69, 27, 11])
5.高光谱高维特征展示
pc = spy.principal_components(input_image)
xdata = pc.transform(input_image)
spy.view_nd(xdata[:, :, :15], classes=gt)
6.数据保存
使用save_rgb(.)函数可以将上面的几种图以RGB图像的形式保存在指定位置,函数如下:
spy.save_rgb(data=input_image,bands=[69, 27, 11],filename='hello.jpg')
四、小实验
如果使用opencv来进行高光谱图像的展示会因为第三维通道数过多而报错。但gt相当于灰度图则不会出现这个问题。
但由于类别之间的差距过小(类别序号普遍不高于10),实际显示出来就是一片黑色。所以对每个元素都放大10倍后再使用opencv进行显示:
gtx = gt*10
cv2.imshow('Test',gtx)