ENVI IDL:如何生成FY4A快照

news2025/1/11 22:53:22

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等操作。

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

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

相关文章

《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件

1、正常信息提示 QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);消息框按钮判断: if(QMessageBox::Ok QMessageBox::warning(this,"温馨提示","是否保存设置?…

【Android】TabLayout设置使用自定义的样式的图片显示问题

序言 TabLayout我们经常使用,用来和ViewPager2进行组合使用,做多Fragment切换页面效果。 TabLayout我们经常看到的的显示效果是上面文字,下面一个线段,在各大浏览器/新闻类APP可以看到,这个效果也是对TabLayout配置参…

2609. 最长平衡子字符串

2609. 最长平衡子字符串 难度: 简单 来源: 每日一题 2023.11.08 给你一个仅由 0 和 1 组成的二进制字符串 s 。 如果子字符串中 所有的 0 都在 1 之前 且其中 0 的数量等于 1 的数量,则认为 s 的这个子字符串是平衡子字符串。请注意,空子字符串也…

【数据结构】树与二叉树(十四):二叉树的基础操作:查找给定结点的父亲(算法Father )

文章目录 5.2.1 二叉树二叉树性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点,其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

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

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

数据——最为直接的答案

身处于这样一个数字化快速发展、竞争强烈的时代,不管是企业还是个人,大家都需要及时获取前沿动态信息,密切关注市场的变化。但是,在不计其数的企业中,到底行业top 是哪些企业引领潮流? 只有数据能告诉你最…

一款免费好用的制作电子杂志网站,发现新大陆~

你是不是也厌倦了传统纸质杂志的限制,想要尝试一种全新的阅读体验?那么,今天我要向你推荐的这款免费好用的制作电子杂志网站,绝对能让你眼前一亮! 这款网站就是FLBOOK在线制作电子杂志平台,并且界面简洁、操…

设计模式之模版方法(TemplateMethod)

模版方法 钩子函数 回调函数 在父类里面有一个模版方法,在这个方法里面调用了op1,op2,op3… 在子类里面如果想要改变父类的op1和op2 只需要重写op1和op2,那么这个重写之后的方法,可以在父类里面直接调用的到 例子: J…

LabVIEW中NIPackageManager功能介绍

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

20 个好用的一行 Java代码

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

Cesium 点线面实体

1.点 const point viewer.entities.add({ id: point, position: Cesium.Cartesian3.fromDegrees(113, 30), point: { pixelSize: 20, //像素 color: Cesium.Color.DEEPPINK, outlineColor: Cesium.Color.fromCssColorString(#fff), outlineWidth: 2, // 像素 }, }); 2.图标标注…

医院等级评审,离不开医院不良事件报告系统

医院不良事件报告系统全套源码 不良事件管理系统源码 不良事件上报系统对事件的报告、处置、跟踪、评价、分析、改进、学习等进行了综合管理,通过双向互评机制实现临床科室与职能部门之间的进一步互动,加强不良事件报告处置过程中的信息互通能力。 围绕…

Sonatype Nexus部署docker安装nexus3

Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。 1、查看可用的 Nexus3版本 可以通过 Sort by 查看其他版本的 nexus3,默认是最新版本 sonatype/nexus3:latest。 https://hub.docker.com/r/sonatype/nexus3/tags…

猫罐头如何选择?最受欢迎的5款猫罐头推荐!新手养猫速看!

对于一个刚入门的养猫新手来说,面对市面上琳琅满目的猫罐头选择确实让人头大。我们总想选到营养价值高的罐头,但又怕猫咪不喜欢吃,还担心选到不安全的产品。 作为家里有5只猫猫的铲屎官来说,养猫的这几年可以说是血泪史了&#x…

为什么你应该学习Go语言?

终于等到你!Go语言——让你用写Python代码的开发效率编写C语言代码。 一、为什么互联网世界需要Go语言 世界上已经有太多太多的编程语言了,为什么又出来一个Go语言? 硬件限制:摩尔定律已然失效 摩尔定律:当价格不变…

LeetCode题94,44,145,二叉树的前中后序遍历,非递归

注意:解题都要用到栈 一、前序遍历 题目要求 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入:root [] 输出:[…

LiveMedia视频监控汇聚管理平台功能中的CS客户端

平台具备独立的CS客户端可供客户使用,包含实时播放、监视组轮询、云镜控制、语音对讲、录像回放、报警查询、报警联动等。 实时视频 客户端支持单画面多画面显示,用户可选择任意一路或多路视频观看,视频窗口数量 1、3、6、8、9 直至 64 个可…

安装显卡驱动、安装cuda toolkit、安装cudnn

nvidia-smi查看,CUDA可以向下兼容,以我为例,可以安装12.0以下的版本: cuda toolkit https://developer.nvidia.com/cuda-toolkit-archive 如果 你前面没有安装vs,直接安装的这个,需要把CUDA里面的 Visua…

LLM大语言模型(典型ChatGPT)入门指南

文章目录 一、基础概念学习篇1.1 langchain视频学习笔记1.2 Finetune LLM视频学习笔记 二、实践篇2.1 预先下载模型:2.2 LangChain2.3 Colab demo2.3 text-generation-webui 三、国内项目实践langchain-chatchat 一、基础概念学习篇 1.1 langchain视频学习笔记 lan…

《005.SpringBoot之仓库管理系统》【有文档】

《005.SpringBoot之仓库管理系统》【有文档】 项目简介 [1]本系统涉及到的技术主要如下: 推荐环境配置:IDEA jdk1.8 Maven MySQL8.0 技术栈; 后台:SpringBootMybatisPlus; 前端:thymeleaf; [2]功能模块展示: 1.基础…