zoukankan      html  css  js  c++  java
  • [转载]matlab高光谱影像读取、保存、分块

    原文地址: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)利用上面链接里提供的程序

    总之一句话,对于高光谱影像有了头文件读、写等工作就变得很简单了,如果没有头文件就比较麻烦

  • 相关阅读:
    数据库基础概念及操作语句
    多态、封装、继承的概念。
    排序有几种方式
    构造函数、复制构造函数和析构函数的特性
    String类的构造函数,析构函数、拷贝构造函数和赋值函数
    操作系统中进程调度策略
    静态数据成员和函数
    指针与引用的区别
    const的用法及它在C语言和C++中的不同
    反射性能优化
  • 原文地址:https://www.cnblogs.com/aodu/p/8081134.html
Copyright © 2011-2022 走看看