matlab 读写ENVI标准数据

news2024/12/26 10:56:34

本博客主要讲解如何读、生成ENVI标准格式的数据。主要分为四部分:读取ENVI头文件、读取ENVI数据、写入ENVI头文件、生成ENVI标准数据,最后附加讲解了本人写的生成hdr文本文件代码。此外,文中还具体介绍写代码的一些思路。

一、读取ENVI头文件

可以用MathWorks官网公开的read_envihdr函数进行读取,并将头文件的数据保存为一个结构体。点击下载read_envihdr函数。

下面给出一个实例:

hdr文件“test_disp.hdr”

ENVI
description = {
   ACQUISITION TIME = 20221009101021.117934
   MASTER ACQUISITION TIME = 20221009101021.117934
   SLAVE ACQUISITION TIME = 20231016101026.222492
   ANCILLARY INFO = DISPLACEMENT M.
   File generated with SARscape  5.2.1 }

samples                   = 17634
lines                     = 13082
bands                     = 1
headeroffset              = 0
file type                 = ENVI Standard
data type                 = 4
sensor type               = Unknown
interleave                = bsq
byte order                = 0
map info = {Geographic Lat/Lon, 1, 1, 117.17881266000001, 27.439235720000003, 0.00016666000000000001, 0.00016666000000000001, WGS-84, 
 units=Degrees}
x start                   = 1
y start                   = 1
 

 利用read_envihdr函数读取

clear;close all;clc
% 路径
dispFilePath = "G:\DInSAR\DInSARNew\RESULT\test_disp.hdr";

% 读取头文件数据test_disp
dispInfo = read_envihdr(dispFilePath);                   % 读取头文件

读取经纬度信息:

% 读取经纬度以及每个像素的大小
% [经度,纬度,经度方向像素的大小,纬度方向像素的大小]
dispGeoTemp = strsplit(dispInfo.map_info.CONTENT,",");      % 地理信息(左上角)
dispGeoLatLon = str2double(string(dispGeoTemp(1,4:7)));     % 经度纬度(左上角)

 注:当对数据进行地理矫正、移动、裁剪等改变影像位置等操作,需要对dispInfo结构体数据进行修改。

二、读取ENVI数据

根据第一章节读取头文件信息,利用multibandread函数对头文件数据进行读取。

 multibandread用法,网上很多,这里不做介绍。

dirTemp = char(dispFilePath);
dispFile = string(dirTemp(1:end-4));                        % 无后缀的文件名,即去掉“.hdr”
disp = multibandread(dispFile,dispInfo.size,[dispInfo.format '=>double'],dispInfo.headeroffset,dispInfo.interleave,dispInfo.machine );

读取完之后,可以在这里对数据进行处理。本文不做演示。

注:如果电脑没有multibandread函数,说明matlab版本太旧了,更换较为新的matlab版本。

三、写入ENVI头文件

这里是本博文的重点,主要是讲述如何将结构体写入到文本文件中,我以将其封装成函数,等过段时间,上传至博客中。

代码截图:

代码介绍见第五章附件。 

代码正在上传,平台审核通过就能下载。

3.1 第一步:创建并打开文件

利用fopen函数,打开文件;

fid = fopen(fileName, 'w');

3.2 第二步:提取结构体字段和数据

fields = fieldnames(stru);

value = stru.(fieldName);               % 获取结构体字段中得数据value

3.3 第三步:将数据写入到文本文件中

将字段名写入到文本文件中:

fprintf(fid, '%-26s  ', fieldName);

将数据写入到文本文件中:

% 根据类型,如果输入的数数值数组,则将之转化为字符串
    if isstruct(value)              % 如果是结构体
        fprintf(fid, '{\n');
        fprintf(fid, '%-30s', ' ');
        %disp('{\n');
        StructPrintTxt(fid,value,true);
        fprintf(fid, '%-30s', ' ');
        fprintf(fid, '}\n');
    elseif isnumeric(value)         % 如果是数值型数组
        valueStr = string(value);                   % 将数据转化为字符串
        if isempty(value)                   % 数据是否为空
            fprintf(fid, '\n');                     % 空数据,则直接打印换行符
        elseif length(value) > 1            % 若数据为数组(矩阵)
            valueStr = strjoin(valueStr,',');       % 用逗号','连接字符串
            fprintf(fid, '[%s]\n', valueStr);     % 打印数组
        else                                % 单个数据时
            fprintf(fid, '%s\n', valueStr);       % 单个数据直接打印
        end
    else                            % 其它情况
        valueStr = value;                   % 为字符串
        if isempty(value)                   % 若为''空
            fprintf(fid, '\n');                     % 直接打印换行符
        elseif length(string(value)) > 1            % 若为字符串数组时候
            valueStr = strjoin(valueStr,',');       % 用逗号','连接字符串
            fprintf(fid, ' [%s]\n', valueStr);     % 打印字符串数组
        else                                % 单个字符串
            fprintf(fid, '%s\n', valueStr);       % 直接打印字符串
        end
    end

注:StructPrintTxt函数是自己写的封装函数。 

3.4 第四步:迭代写入数据

3.2 第二步中获取的数据value可能是字符串、int(double、float……),还有可能是结构体,因此,需要对value进行判断,如果是结构体,则需要进一步判断,然后更深层次的读取。很多人第一想到在弄一个循环,然后吧前面代码在写一遍。倘若结构体中在套入n层结构体呢,不可能重复写n层这样的代码。因此,建议用跌打的原理,进行处理。

StructPrintTxt是我封装的函数,并在这个函数中调用此函数,就形成迭代。

StructPrintTxt(fid,value,true);

完整迭代代码见3.3节。

3.5 关闭文件

每次用fopen函数打开文件,都应该要关闭文件。

fclose(fid);        % 关闭文件

四、生成ENVI标准数据

 multibandwrite用法,网上很多,这里不做介绍。

% 写入数据
multibandwrite(disp,'MyOutData',dispInfo.interleave,'machfmt',dispInfo.machine,'precision',dispInfo.format);

数据打开测试:

五、附件:WriteEnviHdr、StructPrintTxt讲解

将结构体写入到文本文件hdr中,共写了两个函数。

StructPrintTxt:该函数主要是结构体写入到文本文件中,可以是文本(后缀名不限,文本文件即可),是被WriteEnviHdr函数调用的;

WriteEnviHdr:该函数根据文件名判断文件是否为hdr文件,然后创建并打开文件,接着调用StructPrintTxt函数,将结构体数据写入到文本文件中,最后关闭文件。

小提示:如果需要对数据进行一些说明,可以在WriteEnviHdr函数中添加函数字段即可。

% 添加字段(也可以修改一些字段)
infoStruct.CONTENT = 'ENVI';
infoStruct.author = 'Hulizhen';
infoStruct.phone = '15690911024';
infoStruct.organization = 'Joint Receiving Station for Remote Sensing of Xiamen University';

下面是WriteEnviHdr函数具体测试:

clear;close all;clc

%% ===============================================================
dispFilePath = "G:\DInSAR\DInSARNew\RESULT\test_disp.hdr";

% 读取头文件数据test_disp
dispInfo = read_envihdr(dispFilePath);                   % 读取头文件

WriteEnviHdr('Hulizhen.hdr', dispInfo)

运行结果:

为了美观,StructPrintTxt函数中部分代码是为了对齐。

完整的代码(WriteEnviHdr、StructPrintTxt)正在上传,等一等,平台审核通过就能下载。

 路漫漫其修远兮,吾将上下而求索!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1181534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】单链表之--无头单向非循环链表

前言:前面我们学习了动态顺序表并且模拟了它的实现,今天我们来进一步学习,来学习单链表!一起加油各位,后面的路只会越来越难走需要我们一步一个脚印! 💖 博主CSDN主页:卫卫卫的个人主页 &#x…

kafka可视化工具

Offset Explorer kafka可视化工具

Spring Boot 统一处理功能

目录 1.用户登陆权限验证 1.1 每个方法验证 1.2 Spring AOP 用户统一登陆验证 1.3 拦截器 1.3.1 自定义拦截器 1.3.2 将自定义拦截器配置到系统设置中,并且设置拦截规则 1.3.3 排除所有的静态资源 1.4 登录拦截器(练习) 1.5 拦截器原…

二叉树—相关计算题

目录 一、概念题 二、计算题 1、节点数 2、深度 3、遍历序列 一、概念题 1、在用树表示的目录结构中,从根目录到任何数据文件,有( )通道 答案:唯一一条,树的特点是不相交,所以不可能有多…

CAN总线数据采集工具PCAN的使用教程

系列文章目录 文章目录 系列文章目录pcan使用PCAN-Explorer 5安装PCAN-USB Pro安装如下PEAK-System_Driver-Setup安转如下PCAN-View操作步骤 通讯测试检查安装成果trace 文件下载 pcan使用 PCAN-Explorer 5安装 默认路径——all user——yes——next——finish PCAN-USB Pro…

洛谷P1024 [NOIP2001 提高组] 一元三次方程求解(优雅的暴力+二分,干净利落)

P1024 [NOIP2001 提高组] 一元三次方程求解 前言题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 题目分析注意事项 代码后话额外测试用例样例输入 #2样例输出 #2 王婆卖瓜 题目来源 前言 没有前言,可能因为作者忘了编辑 题目 题目描述 有形如&…

异常断电文件损坏docker服务异常处理

问题场景 我们在某地部署信控平台,当初是在产品研发早期,采取的还是Windows服务器部署虚拟机的方式使用virtualbox导入centos7虚拟机,虚拟机里运行docker服务,使用docker-compose统一管理客户今天上午反馈,昨天断电了…

Pygame游戏实战四:打砖块

介绍模块 本游戏使用的是由Pycharm中的pygame模块来实现的,也可以在python中运行。通过Pygame制作一个打砖块,通过击打砖块来得到更多的分数,看看这个是你小时候玩的游戏吗? 最小开发框架 详情请看此文章:Pygame游戏…

界面组件Telerik UI for WinForms中文教程 - 如何自定义应用程序文件窗口?

Telerik UI for WinForms包含了一个高度可定制的组件,它取代了.NET中默认的OpenFileDialog。在下一个更新版本中,会发布一个向对话框浏览器提那家自定义位置的请求功能,本文演示了这个和另一个自定义功能,它可以帮助用户在浏览文件…

【题解】2023 DTS算法竞赛集训 第1次

比赛地址&#xff1a;https://www.luogu.com.cn/contest/143650 P1319 压缩技术 https://www.luogu.com.cn/problem/P1319 简单的签到模拟题 #include <iostream>//c标准库 using namespace std; int main(){int a,n,t0,i0,b,s0;//t判断有没有回车&#xff0c;i判断输…

分支限界法求解迷宫问题

问题描述 从入口出发&#xff0c;按某一方向向前探索&#xff0c;若能走通(未走过的&#xff09;&#xff0c;即某处可以到达&#xff0c;则到达新点&#xff0c;否则试探下一方向&#xff1b;若该点所有的方向均没有通路&#xff0c;则沿原路返回到前一点&#xff0c;换下一个…

一台抵得上多种测量仪器-B1500A半导体参数分析仪

一台抵得上多种测量仪器-B1500A半导体参数分析仪 B1500A 半导体器件分析仪 卓越的测量能力&#xff0c; 完美的一体化解决方案&#xff0c; 经济高效, 出色的软件。 #B1500A 3步表征设备 使用B1500A半导体参数分析仪或PC上随附的EasyEXPERT group 表征软件。EasyEXPERT …

如何卸载在linux下通过rpm安装的mysql

目录 1.先关闭MySQL服务并查看运行状态 2.使用 rpm 管道命令的方式查看已安装的mysql 3. 使用rpm -ev 命令移除安装 4. 删除MySQL数据库内容 1.先关闭MySQL服务并查看运行状态 如果之前安装过并已经启动&#xff0c;则需要卸载前请先关闭MySQL服务 systemctl stop mysqld…

Juniper Networks Junos OS EX远程命令执行漏洞(CVE-2023-36845)

Juniper Networks Junos OS EX远程命令执行漏洞&#xff08;CVE-2023-36845&#xff09; 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: body"J-web" || title"Juniper Web Device Manager" 漏洞复现1. 构造poc2. 查看文件3. 执行命令 免责声明 仅用于技…

【编译原理】LL(1)文法

文章目录 语法分析基本概念自上而下语法分析自上而下语法分析的问题 消除文法左递归消除直接左递归消除间接左递归消除左递归的算法 解决回溯问题FIRST集与提出公共左因子FIRST集提取左公共因子 FOLLOW集合 构造FIRST集和FOLLOW集构造FIRST集合构造每个文法符号的FIRST集合构造…

新书稿费终于下来了!你猜有多少?

我的新书《从零开始学ARM》从正式出版到现在已经有半年时间了&#xff01; 第一批印刷的几千册已经基本销售完&#xff0c; 第二版会对其中勘误进行修正&#xff0c;并继续继续印刷。 前两年写书、审稿&#xff0c; 所有业余时间都耗在这上面了&#xff0c; 在下面这篇文章…

人大金仓KingbaseES_V008R006C008B0014安装

人大金仓安装 一、安装前准备工作 1、硬件环境要求 KingbaseES支持通用X86_64、龙芯、飞腾、鲲鹏等国产CPU硬件体系架构。 2、软件环境要求 KingbaseES支持各种主流的Linux操作系统64位发行版本&#xff0c;包括CentOS、中标麒麟、银河麒麟、统信UOS、Deepin、凝思、中科方…

基于springboot+vue开发的教师工作量管理系

教师工作量管理系 springboot31 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了教师工作量管理系统的开发全过程。通过分析教师工作量管理系统管理的不足&#xff0c;创建了一个计算机管理教师工作量管理系…

EtherCAT转EtherNET/IP协议网关控制EtherCAT伺服驱动器的方法

只需一步&#xff0c;将你的EtherCAT协议设备转换为EthernetIP协议&#xff01; 捷米特JM-ECTM-EIP网关&#xff0c;这款专为EtherCAT协议设备设计的转接装置&#xff0c;可以轻松地将EtherCAT设备数据采集的数据转换成EthernetIP协议。而且&#xff0c;我们的网关接口非常灵活…

同星智能亮相2023北美汽车测试展,国产替代的前方是“星辰大海”!

01 圆满落幕 2023年10月24日至10月26日&#xff0c;为期三天的2023北美汽车测试展览会&#xff08;Automotive Testing Expo&#xff09;在美国密歇根 Surburban Collection Showplace 成功举行。同星智能作为一家具备全球影响力的中国工业软件企业亮相了本次展会&#xff0c;…