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】基础笔记 - 类和对象&#…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
