matlab 读写ENVI标准数据
本博客主要讲解如何读、生成ENVI标准格式的数据。主要分为四部分:读取ENVI头文件、读取ENVI数据、写入ENVI头文件、生成ENVI标准数据,最后附加讲解了本人写的生成hdr文本文件代码。此外,文中还具体介绍写代码的一些思路。
一、读取ENVI头文件
可以用MathWorks官网公开的read_envihdr函数进行读取,并将头文件的数据保存为一个结构体。点击下载read_envihdr函数。
下面给出一个实例:
hdr文件“test_disp.hdr”
| ENVI samples = 17634 |
利用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); % 单个数据直接打印endelse % 其它情况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); % 直接打印字符串endend
注: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)正在上传,等一等,平台审核通过就能下载。

路漫漫其修远兮,吾将上下而求索!
相关文章:
matlab 读写ENVI标准数据
本博客主要讲解如何读、生成ENVI标准格式的数据。主要分为四部分:读取ENVI头文件、读取ENVI数据、写入ENVI头文件、生成ENVI标准数据,最后附加讲解了本人写的生成hdr文本文件代码。此外,文中还具体介绍写代码的一些思路。 一、读取ENVI头文件…...
如何对ppt文件设置修改权限?
PPT文件会应用在会议、演讲、课件等工作生活中,当我们制作好了PPT之后,保护内容防止在演示时出错是很重要的,那么如何将PPT文件设置成禁止修改模式呢?今天分享几个方法给大家。 方法一 将PPT文件直接保存或者另存为一份文件&…...
STM32G030F6P6 芯片实验 (二)
STM32G030F6P6 芯片实验 (二) Hello World - GPIO LED 尝试了下, 从 0 开始建 MDK HAL M0plus Project, 成功点亮 LED了。 但是 ST-LINK跑着跑着, 码飞了! 不知飞哪去了。 只好拿 MX 建了个 MDK Base。 呼叫 SysTick HAL_Delay(), 切换 LED。 基本上都是一样的用法, 只是换…...
时间序列预测模型实战案例(七)(TPA-LSTM)结合TPA注意力机制的LSTM实现多元预测
论文地址->TPA-LSTM论文地址 项目地址-> TPA-LSTM时间序列预测实战案例 本文介绍 本文通过实战案例讲解TPA-LSTM实现多元时间序列预测,在本文中所提到的TPA和LSTM分别是注意力机制和深度学习模型,通过将其结合到一起实现时间序列的预测,本文利用…...
Mysql多表设计
前言 多表查询中要给每一表起别名 tableA as 别名1 , tableB as 别名2 ; (111111推荐) tableA 别名1 , tableB 别名2 ; 例子: select emp.name , dept.name from tb_emp emp inner join tb_dept dept on emp.dept_id dept.id; 一对一 在任…...
第九章:最新版零基础学习 PYTHON 教程—Python 元组(第五节 -清除元组的5种方式方法)
有时,在处理记录数据时,我们可能会遇到需要执行数据记录清除的问题。元组是不可变的,无法修改,因此使这项工作变得困难。让我们讨论执行此任务的某些方法。 目录 方法 #1:使用 list() + clear() + tuple() 方法#2:使用 tuple() 重新初始化...
学习笔记4——JVM运行时数据区梳理
学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/contents/3/192489.html 类装载器classLoader: 将本地的字节码文件.class 加载到内存方法区中成为元数据模板(两个class对象是否为同一个类要求:完整…...
Splunk 创建特色 dashboard 报表
1: 背景: 对原有的dashboard 进行增加点东西,特别是文字部分: 比如: 增加:“this is a guidline for how to use performance". 这段话,就不能写在title, 那样,这段文字,会出现在dashboard 的PDF 文件的分割线的上面,不符合要求。 2: 解决问题: 正确的做法是…...
如何在校园跑腿系统小程序中构建稳健的订单处理与分配系统?
1. 数据库设计 首先,设计订单数据结构。使用数据库(例如MySQL、MongoDB等),创建订单表以存储订单相关信息,包括订单ID、用户信息、交付地址、订单状态等。 CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMAR…...
数据结构与算法—双链表
前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以单链表为主,但在实际应用中双链表有很多应用场景,例如大家熟知的LinkedList。 双链表与单链表区别 单链表和双链表都是线性表的链式实现,它们的主要区别在于节点结构…...
linux继续循环案例测试ping网络,目录下的文件权限循环输出
第一:查看本机ip #ip addr 通过脚本访问本机ip1-100,是否可以ping通,并显示结果,上图 知识点 ping -c 数字1 -w 数字1,向目的ip发送1个数据包,等待1秒,无回复中止 &>/dev/null 知…...
关于SSP3D复现
关于SSP3D复现的问题 准备工作 下载Xshell和XFTP:家校免费版下载链接连接服务器(可能需要与服务器处在相同网络下)GitHub上下载源码:SSP3D 左上角新建会话,输入名称和主机 点击左侧菜单“用户身份验证”,…...
在直播系统中使用RTSP协议传递视频
目录 概述 1、环境准备 2、拉流URL地址 3、导播软件取流 (1)OBS中拉取RTSP流 (2)芯象中拉取RTSP流 (3)vMix中拉取RTSP流 写在最后 概述 提到RTSP协议,很容易想到RTMP协议,它…...
Notion汉化
Notion真无语,汉化版都没有。真的无力吐槽。 2023.11.7汉化经历 教程链接:github Reamd7/notion-zh_CN at 2.4.20-handmade (github.com) 网页版: 油猴下载插件。 Notion中文汉化 浏览器插件下载 windows: github realse 这…...
echarts有背景的柱状图,鼠标滑过提示信息都是展示背景柱状图的值
// 上一篇文章介绍了如何实现有背景的柱状图,现在又遇到一个问题,鼠标滑过柱子,提示信息是背景柱子的值,解决方案,自定义tooltip的formatter,上代码tooltip: {//鼠标悬浮提示数据formatter: function (para…...
华为防火墙基本原理工作方法总结
防火墙只会对tcp首包syn建立会话表,其它丢掉,如synack,ack udp直接建立会话表 icmp只对首包请求包建立会话表,其它包,如应答的不会建立直接丢掉 防火墙状态查看: rule name trust_untrust source-zone tru…...
Spring Cloud之多级缓存
目录 传统缓存 多级缓存 JVM进程缓存 Caffeine 缓存驱逐策略 实现进程缓存 常用Lua语法 数据类型 变量声明 循环使用 定义函数 条件控制 安装OpenResty 实现Nginx业务逻辑编写 请求参数解析 实现lua访问tomcat JSON的序列化和反序列化 Tomcat的集群负载均衡 …...
融云荣登「2023 年度 PaaS 企业排行榜」
11 月 2 日,中国科学院旗下《互联网周刊》颁布“2023 年度 PaaS 企业排行榜”,融云荣登榜单。关注【融云全球互联网通信云】了解更多 根据中国信息通信研究院《云计算白皮书 2023》:2022 年,PaaS 增长强势,总收入 342 …...
YOLOv8轻量化模型:模型轻量化设计 | 轻量级可重参化EfficientRep| 来自YOLOv6思想
💡💡💡本文解决什么问题:在几乎不保证精度下降的前提下,轻量级模型创新设计 EfficientRep 在关键点检测任务中 | GFLOPs从9.6降低至8.5, mAP50从0.921下降至0.912,mAP50-95从0.697提升至0.779 YOLO轻量化模型专栏:http://t.csdnimg.cn/AeaEF 1.YOLOv6介绍 论文…...
【JavaSE】基础笔记 - 类和对象(下)
目录 1、this引用 1.1、为什么要有this引用 1.2、什么是this引用 1.3、 this引用的特性 2、 对象的构造及初始化 2.1、 如何初始化对象 2.2、构造方法 2.2.1、概念 2.2.2、特性 2.3、默认初始化 2.4、就地初始化 上篇:【JavaSE】基础笔记 - 类和对象&#…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...
【多线程初阶】单例模式 指令重排序问题
文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...
