使用Python 对ENVI SPECTRAL LIBRARY(.sli)进行读取


前言

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 进行后续操作,非常方便!

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值