[转载]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)利用上面链接里提供的程序

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

时间: 2024-08-29 18:22:17

[转载]matlab高光谱影像读取、保存、分块的相关文章

matlab结构体形式保存数据生成.mat文件< 转>

2015年 参加天池大数据竞赛 为了建立模型,打算基于matlab使用Random Forest Algorithm的工具包 该工具包我在此分享给大家,http://yunpan.cn/cVXsjQvh8ARcx  访问密码 30a3 该工具包导入的数据格式就是我如下所说的封装方式,因此,在使用该算法包时,需要把自己的数据进行封装一下. 通过matlab打开,可以知道twonorm.mat里面还封装了两个.mat文件. 我们看看工具包的作者给的tutorial 部分源码如下: 的源码如下: 说明

GDAL影像读取并配置缩放的插值方法

影像读取 并缩放 读取大影像某一部分,并缩放到指定大小,我们有时会用如下代码: #include "gdal.h" #include "gdal_priv.h" #include "gdalwarper.h" void main() { GDALAllRegister(); CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");//support Chinese

[转载]Matlab实用小技巧——Matlab学习笔记

1.. Ctrl+C 中断正在执行的操作 如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断.MATLAB这时可能正疲于应付,响应会有些滞后. 2. figure命令新建一个绘图窗口 figure 可以打开一个空的绘图窗口,接下的绘图命令可以将图画在它里面,而不会覆盖以前的绘图窗口.当有多个figure窗口时,在命令窗口中执行如Plot等命令将覆盖当前figure窗口中的对象.所谓的当前figure窗口,也就是最后一次查看的窗口(可以用命令gcf得到). figu

将matlab中数据输出保存为txt或dat格式

总结网上各大论坛,主要有三种方法. 第一种方法:save(最简单基本的) 具体的命令是:用save *.txt -ascii x x为变量*.txt为文件名,该文件存储于当前工作目录下,再打开就可以 打开后,数据有可能是以指数形式保存的. 例子: a =[17 24 1 8 15;23 5 7 14 16 ;4 6 13 20 22 ;10 12 19 21 3 ;11 18 25 2 9 ]:save afile.txt -ascii a afile.txt打开之后,是这样的:1.700000

读取保存文件、图片在数据库中的上传读取

一.输入输出流 1.概念: 输入输出流主要用于保存.读取文件,其内容保存在内存中. 2.使用方法: using System.IO; //System.IO 命名空间包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型. 3.代码段实现读取和保存功能: 读取文字: OpenFileDialog op = new OpenFileDialog(); op.ShowDialog();//打开文件对话框 //将选择的东西读取到文档里 StreamReader sd = new StreamR

手动封装OpenCV1.0的IplImage读取保存功能遇到的小问题

最近准备重新学习图像处理的知识,主要目的是自己实现一遍图像处理的算法,所以除了读取.保存图像外的操作都自己写,没想到直接封装OpenCV的读取.保存功能的第一步就出错.关键代码如下 void MyImage::Clear() { if (m_pImg != nullptr) { std::cout << "释放内存" << std::endl; delete m_pImg; m_pImg = nullptr; } } 其中m_pImg是IplImage*类型,析

(转载)AS3 HTTPCLIENT读取视频流信息

最近的工作中频繁用到HTTPCLIENT这个类 先放上github的项目地址 https://github.com/gabriel/as3httpclient 原理就是利用socket模拟一个http链接来突破flash player的各种限制 由于是socket连接,所以跨域问题大家还是要好好注意下的 比如原先urlrequest中不能自定义的referer之类的 还有一个妙处就是原先的netstream是不能读取到流的数据, 有时候在流里会藏一些数据,这时候就用到这个类来解决了 这源码是搜索

matlab 图片批量读取

1. 指定的路径 单目录data所有图片 file_path = '.\data\';% 图片目录路径 img_path_list = dir(strcat(file_path,'*.jpg'));%获取该目录中全部jpg格式的图像 img_num = length(img_path_list);%获取图像总数量 if img_num > 0 %有满足条件的图像 for j = 1:img_num %逐一读取图像 image_name = img_path_list(j).name;% 图像名

[转载]Matlab之静态文本多行输出

转载文章,原文链接:Matlab中的静态文本框中显示多行内容 有时候,我们在GUI中利用静态文本框显示程序的结果,但是结果很长,一行未必可以显示的开,而静态文本框不像edit或listbox那样通过滚动条来显示多行内容,即便设置了max和min属性也是一样的. 于是,怎么在静态文本框中显示多行是很有意义的. 解决方法 利用函数textwrap 1 2 3 4 5 6 figure('units', 'normalized', 'position', [0.4 0.4 0.4 0.3]); h =