文章目录
前言
Python在数据分析有着强大的功力,在各个领域都有大牛编写一些库去为Python注入新的生命力。ENVI SPECTRAL LIBRAYR文件是ENVI自带的光谱库文件,后缀(.sli)存储有各种实测的光谱数据。最近需要对这种文件进行读取分析,从别处了解到可以使用IDL或者是MATLAB进行处理,但是我实在是不擅长使用(懒)。在之前使用Python gdal的启发下,想用Python进行这方面的处理。
下面我将以自己读取光谱库中的真实想法为章节,主要在与记录自己的想法。
一、ENVI SPECTRAL LIBRARY 文件的结构
和普通ENVI格式的影像一样,光谱库文件也是由头文件(,hdr)、数据文件(.sli)两部分组成的。头文件主要记录了一些元数据,相当于索引,与一般的影像不同在于,光谱库的头文件中 file type = ENVI Spectral Library
二、思路历程(从失败到成功)
1. gdal(失败)
gdal可以读取ENVI格式的影像,那么是不是也可以读取光谱库呢,我去官网
ENVI-ENVI.hdr Labelled Raster——GDAL document查询后发现gdal并没有对于光谱库支持的驱动。我还是不死心,作死尝试了gdal读取影像的方式读取光谱库,发现报了以下错误。
contains an invalid file type in the ENVI.hdr GDAL does not support 'ENVI Spectral Library' type file
下面附上gdal读取影像的基本操作:
from osgeo import gdal
from osgeo import gdal_array
import numpy as np
np.set_printoptions(threshold=np.inf)#使print大量数据不用符号...代替而显示所有
dataset = gdal.Open(r"E:\1.tif")
2.以二进制文件的方式解码(失败)
在一篇博文的启发下,Python 读取ASTER光谱库这篇文章年代久远,代码不能直接使用,我尝试以二进制的形式对文件进行读取,这样得知道文件本身的存储格式。而且还要考虑到头文件中的信息提取。Python本身对于二进制文件的支持比较少,许多博主用到了struct
库来对二进制数据进行编码。
fp = open(r'E:\1.tif','rb')
print(fp.read())
fp.close()
打印一下二进制文件看看:
我裂开了,我也不知道文件本身的组织结构,到这就一头雾水。
三、使用spectral库进行处理(成功)
最终,我选择换条更简单的路,从二进制文件操作等于自己又要从底层逻辑开始实现,现在肯定会有很完善的实现了,只是需要我们去找到并利用起来。我查阅相关信息,发现一个名为spectral
的库完美满足了我们的需要(反复套娃❗)
import spectral as spl
import pandas as pd
import numpy as np
SpecLib = spl.envi.open(r'E:\1.hdr')
SpecLib = pd.DataFrame(index= SpecLib.name, data= SpecLib.spectra,colums=SpecLib.centers)
debug一下,没有报错,好的,我们来看一下变量SpecLib
中有哪些信息。
读取的变量包含了波段的相关信息(波长、单位、中心波长)、头文件中的元数据、光谱名称、光谱信号值。
这些变量都可以通过numpy
或者是pandas
进行后续操作,非常方便!