ENVI IDL:如何生成FY4A快照

01 数据说明

在这里插入图片描述

FY4A全圆盘(DISK,全球)多光谱影像,panoply软件打开数据层次结构如下:

在这里插入图片描述

我们生成快照主要使用到其中的NOMChannel01NOMChannel02NOMChannel03进行快照显示,注意我并没有进行辐射定标。

02 生成JPG快照

代码如下:

; @Author	: ChaoQiezi
; @Time		: 2023年11月13日-上午8:40:16
; @Email	: chaoqiezi.one@qq.com

; 该程序用于 生成风云4A快照(.png)

function read_band, h5_path, ds_name, range_name
    ds = read_h5(h5_path, ds_name=ds_name, /double)
    ds_range = read_h5(h5_path, ds_name=ds_name, attr_name=range_name, /double)
    invalid_pos = where((ds lt ds_range[0]) or (ds gt ds_range[1]), /null)
    ds[invalid_pos] = !values.F_NAN
    
    return, ds
end

pro fy4a_quicklook
    ; 准备
    in_dir = 'D:\Objects\JuniorFallTerm\IDLProgram\Experiments\ExperimentalData\Week8\FY4A\'
    out_dir = 'D:\Objects\JuniorFallTerm\IDLProgram\Experiments\ExperimentalData\Week8\out_fy4a_quicklook\'
    if ~file_test(out_dir, /directory) then file_mkdir, out_dir
    band1_name = 'NOMChannel01'
    band2_name = 'NOMChannel02'
    band3_name = 'NOMChannel03'
    range_name = 'valid_range'
    
    ; 检索和循环
    h5_paths = file_search(in_dir, '*DISK*.hdf')
    foreach h5_path, h5_paths do begin
        ; 数据集和属性
        band1 = read_band(h5_path, band1_name, range_name)
        band2 = read_band(h5_path, band2_name, range_name)
        band3 = read_band(h5_path, band3_name, range_name)
        bands = make_array([3, size(band1, /dimensions)], /uint)
        
        band1 = bytscl(band1, /nan)
        band2 = bytscl(band2, /nan)
        band3 = bytscl(band3, /nan)
        
        bands[0, *, *] = band3
        bands[1, *, *] = band2
        bands[2, *, *] = band1
        
        ; 输出png
        jpg_path = out_dir + file_basename(h5_path, '.hdf') + '.jpg'
        png_path = out_dir + file_basename(h5_path, '.hdf') + '.png'
        write_jpeg, jpg_path, bands, true=1, /order
    endforeach
end

里面涉及的read_h5函数我之前一直在封装,所以移植不太方便了,但是还是贴出来,大家自己写一些比较简单的会更好:

;+
;   函数用途:
;       (私有函数)用于读取HDF5文件指定ID(HDF文件ID或数据集ID)下的属性
;   函数参数:
;       h5_id: HDF5文件ID或数据集ID
;       attr_name: 属性名称
;-
function _read_h5_attribute, h5_id, attr_name
    ; 获取属性ID
    attr_id = h5a_open_name(h5_id, attr_name)
    
    ; 获取属性
    attr = h5a_read(attr_id)
    h5a_close, attr_id
    
    return, attr
end

;+
;   函数用途:
;       (私有函数)用于读取HDF5文件下的数据集
;   函数参数:
;       h5_id: HDF5文件ID
;       ds_name: 数据集名称
;-
function _read_h5_dataset, h5_id, ds_name
    ; 获取数据集
    ds_id = h5d_open(h5_id, ds_name)
    data = h5d_read(ds_id)
    h5d_close, ds_id
    
    return, data
end

;+
;   函数用途:
;       该函数用于读取HDF5文件的数据集及其属性
;   函数参数:
;       h5_path: HDF5文件的输入路径
;       ds_name(关键字传参): 读取数据集的路径(注意: 路径为文件内路径)
;       attr_name(关键字传参): 读取属性的名称
;       double(关键字传参): 输出数据的类型是否为双精度浮点
;-
function read_h5, h5_path, ds_name=ds_name, attr_name=attr_name, double=double
    ; 获取HDF5文件数据集ID
    h5_id = h5f_open(h5_path)
    
    if keyword_set(ds_name) && keyword_set(attr_name) then begin
        ds_id = h5d_open(h5_id, ds_name)
        data = _read_h5_attribute(ds_id, attr_name)
        h5d_close, ds_id
    endif else if keyword_set(ds_name) then begin
        data = _read_h5_dataset(h5_id, ds_name)
    endif else if keyword_set(attr_name) then begin
        data = _read_h5_attribute(h5_id, attr_name)
    endif else begin
        return, -1
    endelse
    
    if keyword_set(double) then data = double(data)
    
    ; 关闭资源
    h5f_close, h5_id
    
    return, data
end

封装的比较复杂了,需要自己多多体会了。

里面涉及的关键只有两个,一个是write_jpeg函数,一个是bytscl函数。

2.1 write_jpeg函数说明:

在这里插入图片描述

/order参数表示绘制的顺序,默认就是从上到下绘制。如果设置了就是从下往上绘制,我们的栅格矩阵一般最上面就是北边,正常的,不需要设置该参数。
true表示输入Image数组(三维)中波段维度的位置。如果Image数组的形式为(波段数,列数,行数),那么true为1;如果Image数组的形式为(列数,波段数,行数),那么true为2;如果Image数组的形式为(列数,行数,波段数),那么true为3;
quality表示压缩的质量,默认是75的压缩。

2.2 bytscl函数说明:

在这里插入图片描述
这个函数非常关键,由于我们自己的数组可能是浮点型或者双精度等,在生成JPEG时实际上会导致输出的图片特别失真或者直接全黑或者全白等,我们需要将数组转换为字节型数组,即范围是0~255的整型范围。

bytscl函数通过下方公式进行类似归一化的缩放到0~255:

在这里插入图片描述
默认Top是255。

/nan在数组中存在NAN无效值时使用。

最终处理结果如下:

在这里插入图片描述

仅仅用来查看一下FY4A,不可用于数据分析,因为像元值完全发生变化,经过映射到0~255等操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

瑞吉外卖Day02

小张推荐:瑞吉外卖Day01,瑞吉外卖Day03 1.登陆功能 1.1结果封装类 导入返回结果类R此类是一个通用结果类。服务端响应的所有结果最终都会包装成此种类型返回给前端页面 注意属性名,莫要写错,不然与前端很难对接!!&…

openlayers 注册投影

注册投影 openlayers 默认支持的坐标系有4326(基于美国wgs84坐标系)和3857(墨卡托投影)两种。 所以如果我们想要使用比如4490坐标系,或者4547坐标系,就需要先注册, 注册4490示例代码如下 如…

抖音商城双11好物节,从供需两侧重新定义“好货”

【潮汐商业评论/原创】 你用的第一款护肤品是什么? 大部分人回忆起童年的时候,想起来的都是那款有着牛奶香味的、塑料包装的小袋白色乳霜——郁美净儿童霜。 但是不知何时,它逐渐淡出了很多人、特别是年轻人的视野,直到今年在互…

20 个好用的一行 Java代码

今天分享给大家20个 令人惊叹的 Java一行代码,让你们的工作更轻松。一起来看看吧! 1. 获取浏览器 Cookie 的值 使用document.cookie 来获取 Cookie 的值。 2. 将 RGB 转换为十六进制 3. 复制到剪贴板 使用 navigator.clipboard.writeText 轻松将任何文本…

高并发架构设计(三大利器:缓存、限流和降级)

引言 高并发背景 互联网行业迅速发展,用户量剧增,系统面临巨大的并发请求压力。 软件系统有三个追求:高性能、高并发、高可用,俗称三高。三者既有区别也有联系,门门道道很多,全面讨论需要三天三夜&#…

使用Inis搭配内网穿透实现Ubuntu上快速搭建博客网站远程访问

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总…

软件外包开发需求整理需要注意的问题

在整理软件开发需求时,注意以下问题可以有助于确保需求的准确性、完整性和可行性。通过认真考虑这些问题,您可以确保整理出一份清晰、全面且具有可行性的软件开发需求文档,有助于项目的成功实施。北京木奇移动技术有限公司,专业的…

LabVIEW中NIPackageManager功能介绍

LabVIEW中PackageManager功能介绍 使用NIPackage Manager可安装、更新、修复和删除NI软件。 安装NI软件 使用PackageManager浏览和安装NI软件。 1. 在浏览产品选项卡上,单击产品类别以显示该类别中的可用产品。 2. 选择要安装的产品,然后单击…

Jenkins入门——安装docker版的Jenkins 配置mvn,jdk等 使用案例初步 遇到的问题及解决

前言 Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。 官网:https://www.jenkins.io/zh/ 本篇博客介绍docker版的jenkins的安装和使用,maven、jdk,汉语的配置…

MobileSAM论文笔记

摘要 自Meta研究团队发布SAM(Segment Anything Model)项目依赖,因其令人惊艳的零样本迁移特性和与其他视觉应用兼容的高通用性,引起了极大的关注。由于大多数类似的应用都需要运行在资源限制的边缘设备,如手机&#x…

HashMap源码分析(三)

迭代&遍历 HashMap总共有3种遍历容器的方式&#xff1a; 1.使用Iterator迭代&#xff08;推荐&#xff09; Iterator<Map.Entry<String, String>> iterator hashMap.entrySet().iterator(); while (iterator.hasNext()){System.out.println(iterator.next(…

C++算法: 最大化数组末位元素的最少操作次数

涉及知识点 数学 题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;这两个数组的长度都是 n 。 你可以执行一系列 操作&#xff08;可能不执行&#xff09;。 在每次操作中&#xff0c;你可以选择一个在范围 [0, n - 1] 内的下标 i &#xff0c;并交换 num…

uniapp: 实现pdf预览功能

目录 第一章 实现效果 第二章 了解并解决需求 2.1 了解需求 2.2 解决需求 2.2.1 方法一 2.2.2 方法二 第三章 资源下载 第一章 实现效果 第二章 了解并解决需求 2.1 了解需求 前端需要利用后端传的pdf临时路径实现H5端以及app端的pdf预览首先我们别像pc端一样&#…

webgoat-Challenges

AdminLostpassword 这一题密码藏在logo图片里 请求GET /WebGoat/challenge/logo 搜索admin看到密码&#xff0c;使用账号admin和这个密码登录拿到flag Without password 题目要求&#xff1a;在不知道Larry的密码情况下登录 考虑使用SQL注入 密码输入 123 or 11 -- Admin p…

CSRF漏洞

文章目录 CSRF(跨站请求伪造漏洞&#xff09;关键点目标CSRF类别GET方式post方式 CSRF验证CSRF 实战与 XSS 漏洞相结合 CSRF 防御无效防御有效防御 案例CSRF 漏洞实战 CSRF(跨站请求伪造漏洞&#xff09; ​ 跨站请求伪造(Cross Site Request Forgery&#xff0c;CSRF)是一种攻…

2023最新版JavaSE教程——第6天:面向对象编程(基础)

目录 一、面向对象编程概述(了解)1.1 程序设计的思路1.2 由实际问题考虑如何设计程序1.3 如何掌握这种思想&#xff1f; 二、Java语言的基本元素&#xff1a;类和对象2.1 引入2.2 类和对象概述2.3 类的成员概述2.4 面向对象完成功能的三步骤(重要)2.4.1 步骤1&#xff1a;类的定…

C# Spire.Pdf将PDF文件转换为Word文件

一.开发框架&#xff1a; .NetCore6.0 工具&#xff1a;Visual Studio 2022 二.思路&#xff1a; 1.界面上传PDF文件&#xff0c;并保存 2.PDF文件转换为Word文件并保存 3.使用SHA256Hash判断文件是否已经转换过了&#xff0c;转换过了的话&#xff0c;就返回原先转换过的文…

保姆级使用vuedraggable三方组件

第一步 引入vuedraggable npm i vuedraggable -S 第二步 直接使用&#xff0c;源码如下 <template><draggableclass"list-group"tag"ul"v-model"list"v-bind"{animation: 1000,group: description,disabled: false,ghostClass:…

嵌入式养成计划-49----ARM--计算机相关理论--ARM相关内容

一百二十三、计算机相关理论 123.1 计算机的组成 目前的计算机都还是 冯诺依曼体系 &#xff0c;也就是由&#xff1a;输入、输出、运算器、存储器、控制器&#xff0c;这个五个部分构成。输入&#xff1a;Input&#xff0c;常见的输入设备&#xff0c;比如鼠标&#xff0c;键…

五、L2TPv2 VPN

L2TPv2 VPN 1、L2TPv2概述1.1.目的1.2.特点 2、L2TP原理2.1.基本概念2.2.工作原理2.2.1.协议架构2.2.2.报文结构2.2.3.报文封装2.2.4.报文传输 3、工作过程4、应用场景4.1、远程拨号用户发起L2TP隧道连接4.2、LAC接入拨号请求发起L2TP隧道连接4.3、LAC接入PPPoE用户发起L2TP隧道…