### MATLAB读取ENVI Image标准格式的代码解析 #### 一、引言 在遥感领域,ENVI(Environmental Systems Research Institute - ENvironment for Visualizing Images)是一种广泛使用的软件工具,用于处理和分析多光谱及高光谱图像数据。ENVI支持多种图像格式,并以其特有的`.img`文件格式存储数据。为了在MATLAB环境中读取这些数据,我们需要编写专门的函数来解析ENVI的图像文件。本文将详细解析一个名为`read_ENVIimagefile`的MATLAB函数,该函数用于读取ENVI的标准图像格式。 #### 二、函数结构与逻辑 ##### 函数声明 ```matlab function data = read_ENVIimagefile(imgfilename) ``` 此函数接收一个参数`imgfilename`,即ENVI图像文件的路径名,并返回一个名为`data`的变量,其中包含图像的数据。 ##### 处理文件名 函数检查输入文件名是否以`.img`结尾,如果不是,则默认添加`.hdr`作为头部文件的扩展名;如果是,则移除`.img`后添加`.hdr`作为头部文件的扩展名。 ```matlab if length(imgfilename) >= 4 switch strcmp(imgfilename(length(imgfilename)-3:end), '.img') case 0 hdrfilename = strcat(imgfilename, '.hdr'); case 1 hdrfilename = strcat(imgfilename(1:(length(imgfilename)-4)), '.hdr'); end else hdrfilename = strcat(imgfilename, '.hdr'); end ``` ##### 读取头部文件 接下来,函数打开并读取头部文件,获取图像的基本属性,如像素数量、行数、波段数、数据类型等。 ```matlab fid = fopen(hdrfilename, 'r'); info = fread(fid, 'char=>char'); info = info'; % 转置为行向量 fclose(fid); ``` ##### 解析头部信息 通过字符串操作,函数解析出头部文件中的关键信息,包括: - `samples`: 每行的像素数 - `lines`: 图像的行数 - `bands`: 波段数 - `datatype`: 数据类型 - `interleave`: 数据排列方式 ```matlab a = strfind(info, 'samples='); b = length('samples='); c = strfind(info, 'lines'); samples = []; for i = a + b : c - 1 samples = [samples, info(i)]; end samples = str2num(samples); a = strfind(info, 'lines='); b = length('lines='); c = strfind(info, 'bands'); lines = []; for i = a + b : c - 1 lines = [lines, info(i)]; end lines = str2num(lines); a = strfind(info, 'bands='); b = length('bands='); c = strfind(info, 'headeroffset'); bands = []; for i = a + b : c - 1 bands = [bands, info(i)]; end bands = str2num(bands); a = strfind(info, 'datatype='); b = length('datatype='); c = strfind(info, 'interleave'); datatype = []; for i = a + b : c - 1 datatype = [datatype, info(i)]; end datatype = str2num(datatype); ``` ##### 数据类型转换 根据不同的`datatype`值,函数确定了MATLAB中对应的数据类型,并将其存储在`precision`变量中。 ```matlab precision = []; switch datatype case 1 precision = 'uint8=>uint8'; case 2 precision = 'int16=>int16'; case 12 precision = 'uint16=>uint16'; case 3 precision = 'int32=>int32'; case 13 precision = 'uint32=>uint32'; case 4 precision = 'float32=>float32'; case 5 precision = 'double=>double'; otherwise error('Invalid datatype'); end ``` ##### 读取图像数据 函数使用`multibandread`函数读取图像数据,并将其存储在`data`变量中。 ```matlab fid = fopen(imgfilename, 'r'); data = multibandread(imgfilename, [lines, samples, bands], precision, 0, interleave, 'ieee-le'); data = double(data); ``` #### 三、总结 本节介绍了一个用于读取ENVI标准图像格式的MATLAB函数。通过该函数,用户可以方便地将ENVI图像数据导入到MATLAB环境中进行进一步的处理和分析。这个函数的关键在于正确解析头部文件,以获取图像的基本属性,并确保数据类型的正确转换,以便在MATLAB中进行高效的数据处理。
%本函数读取img格式,前提是img图像显式带有'.img'后缀名。
if length(imgfilename)>=4
switch strcmp(imgfilename(length(imgfilename)-3:end), '.img')
case 0
hdrfilename=strcat(imgfilename, '.hdr');
case 1
hdrfilename=strcat(imgfilename(1: (length(imgfilename)-4)), '.hdr');
end
else
hdrfilename=strcat(imgfilename, '.hdr');
end
%读取ENVI标准格式图像文件
%读取图像头文件
fid = fopen(hdrfilename, 'r');
info = fread(fid,'char=>char');
info=info';%默认读入列向量,须要转置为行向量才适于显示
fclose(fid);
%查找列数
a=strfind(info,'samples = ');
b=length('samples = ');
c=strfind(info,'lines');
samples=[];
for i=a+b:c-1
samples=[samples,info(i)];
end
samples=str2num(samples);
%查找行数
a=strfind(info,'lines = ');
b=length('lines = ');
lines=[];
for i=a+b:c-1
lines=[lines,info(i)];
end
lines=str2num(lines);
%查找波段数
a=strfind(info,'bands = ');
b=length('bands = ');
c=strfind(info,'header offset');
bands=[];
for i=a+b:c-1
bands=[bands,info(i)];
end
bands=str2num(bands);
%查找数据类型
a=strfind(info,'data type = ');
b=length('data type = ');
c=strfind(info,'interleave');
datatype=[];
for i=a+b:c-1
datatype=[datatype,info(i)];
end
datatype=str2num(datatype);
precision=[];
switch datatype
case 1
precision='uint8=>uint8';%头文件中datatype=1对应ENVI中数据类型为Byte,对应MATLAB中数据类型为uint8
case 2
precision='int16=>int16';%头文件中datatype=2对应ENVI中数据类型为Integer,对应MATLAB中数据类型为int16
剩余20页未读,继续阅读
- 粉丝: 17
- 资源: 39
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- java制造业MES生产管理系统源码 MES源码数据库 MySQL源码类型 WebForm
- 基于无人机航拍数据实现的三维场景重建python源代码+文档说明+数据集(高分项目)
- 【重磅,更新!】全国2000-2022年植被指数数据(分辨率30m)
- 包含Qt5Core.dll Qt5Gui.dll Qt5Network.dll Qt5Svg.dll Qt5Widgets.dl
- python3.6 get-pip.py
- python期末大作业基于ResNet的人脸表情识别项目源码+数据集+模型文件(高分项目)
- C#大型多门店4S连锁汽车维修保养管理系统源码(带文档)数据库 SQL2008源码类型 WebForm
- 【安卓毕业设计】基于Android健康检测系统的设计与实现源码(完整前后端+mysql+说明文档).zip
- 【重磅,更新!】中国分省农户创业活动农户创业活跃度(2011-2021年)
- YOLOv5 PyTorch 格式注释番茄叶病检测数据集下载