原文地址:matlab高光谱影像读取、保存、分块作者:wind_静水流深_cloud
高光谱影像由于含有近百个波段,用matlab自带的图像读写函数imread和imwrite往往不能直接操作,以下针对高光谱影像读取、保存图像数组以及影像分块予以说明:
影像读取:
利用multibandread函数,此函数用于读取多波段二进制影像文件。至于何为二进制影像文件,简单地说ENVI主菜单file—save file as—envi standard得到的就是二进制影像文件,有时甚至会看到后缀名为bsq、bil、bip等影像,也是二进制影像文件。
对于一幅tif格式的高光谱影像,这里有两种方法将影像读入matlab:
(1)直接利用imread函数读取,不知为何tif格式的高光谱影像居然可以读取,但是速度挺慢
(2)利用multibandread函数读取,建议首先利用envi将tif格式转换为envi标准格式(如何转换上文有),至于为什么转换,原因在于这个函数是用来读取二进制影像的,若直接读取tif格式的影像虽然能够成功但是有些波段却变得模糊了,显得该波段信息量很少了,转换格式后不会出现这问题了(这是在实验中发现的,不知怎么解释)。
(3)利用下面链接里提供的程序
注意:利用该函数需要设置很多参数,参数是从头文件里找的,对于没有头文件的影像怎么办?解决方法:打开影像后,利用envi编辑头文件的功能会生成一个“简单的头文件”,这里面会包含波段数、行数、列数以及影像类型(bsq、bip、bil)等,总之生成的这个并非严格意义头文件的文件可满足利用multibandread读取影像时参数设置。其中multibandread中precision参数与matlab数据类型相应的关系如下所示:
precision=‘uint8=>uint8‘;%头文件中datatype=1对应ENVI中数据类型为Byte,对应MATLAB中数据类型为uint8
precision=‘int16=>int16‘;%头文件中datatype=2对应ENVI中数据类型为Integer,对应MATLAB中数据类型为int16
precision=‘uint16=>uint16‘;%头文件中datatype=12对应ENVI中数据类型为Unsighed Int,对应MATLAB中数据类型为uint16
precision=‘int32=>int32‘;%头文件中datatype=3对应ENVI中数据类型为Long Integer,对应MATLAB中数据类型为int32
precision=‘uint32=>uint32‘;%头文件中datatype=13对应ENVI中数据类型为Unsighed Long,对应MATLAB中数据类型为uint32
precision=‘float32=>float32‘;%头文件中datatype=4对应ENVI中数据类型为Floating Point,对应MATLAB中数据类型为float32
precision=‘double=>double‘;%头文件中datatype=5对应ENVI中数据类型为Double Precision,对应MATLAB中数据类型为double
对于ENVI标准格式的数据,除了multibandread函数外,网上有公布的程序专门读取ENVI标准格式影像(利用fread和fwrite函数进行二进制文件读写),但注意需提供头文件。代码链接:
http://download.csdn.net/detail/hyperspectral/2761545
http://www.mathworks.cn/matlabcentral/fileexchange/15629-envi-file-reader-updated-292010
注意:使用别人的程序要致谢或者引用相关文献,注意节操!!
影像保存:
这里也给出几种方法:
(1)还是利用imwrite,只不过每次保存一个波段,当然3个波段也是可以的
(2)利用multibandwrite函数,该函数与multibandread函数相对应,所以它是将图像数组保存为二进制图像(bsq、bil、bip),该函数可以直接将所有波段一起保存,调用实例:
multibandwrite(D,‘asd‘,‘bsq‘,‘machfmt‘,‘ieee-le‘,‘precision‘,‘int16‘)
其中D为读进matlab的图像数组,asd是保存后的文件名,bsq是波段存储方式。
‘machfmt‘和‘precision‘两个参数很重要,一定要写上,分别表示写入文件asd的数据格式以及精度,可从头文件找到,缺少这两个参数影像无法显示。
(3)利用上面链接里提供的程序
影像分块:
这里面的关键问题还是在于保存多波段图像数组,有以下几种方法:
(1)很笨的方法就是每个波段单独分块,用imwrite函数保存图像数组为分块图像,最后将相应的图像块组合,可能存在的问题是有些波段影像没有信息,这是由于数据类型高精度向低精度转化丢失信息。例如,有些影响读进matlab后数据类型为int16,而imwrite函数不支持该类型,调用函数时需进行类型转化,高精度向低精度转化必然损失信息。
(2)对于不需要显示分块的影像,当然可以直接将所有波段一起分块,保存为mat格式
(3)利用multibandwrite函数,分块的所有波段可以直接保存,需提供头文件。
(4)利用上面链接里提供的程序
总之一句话,对于高光谱影像有了头文件读、写等工作就变得很简单了,如果没有头文件就比较麻烦