当前位置: 首页 > news >正文

matlab 读写ENVI标准数据

本博客主要讲解如何读、生成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);       % 单个数据直接打印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 左上角新建会话,输入名称和主机 点击左侧菜单“用户身份验证”&#xff0c…...

在直播系统中使用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】基础笔记 - 类和对象&#…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

LLMs 系列实操科普(1)

写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...