首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

IDL根据Landsat QA波段去云处理【代码】

编程知识
2024年08月01日 13:25

IDL根据Landsat QA波段去云处理【代码】

​ landsat QA波段(质量评估波段)是Landsat卫星影像数据中的一个特殊波段,他在Landsat5-9的每个产品中都存在。虽然我们常用的Landsat影像数据有B1-B7波段,但QA波段并不是其中之一。它可以反映出云、云阴影、雪等类别的像素,常常应用在影像处理中对云像素去除。

​ 最近有在写landsat像素去云处理,查了网上许多QA波段值解释说明,发现都是基于二进制的,但IDL不同于GEE的算法,没有>>这种的按位运算符,只能先转成二进制,再自己写算法处理。算法写好后,为了发博客就去查了官网,又发现官网更新的QA波段值解释说明已经更新到了十进制,于是又写了一下根据十进制的去云处理(真的大哭)。

方法一:根据QA给定的二进制值解释进行处理

​ 上面的图片列出了QA波段的每一位所代表的含义,该含义为二进制存储的信息。

​ QA波段的存储方式为十进制,所以转换为二进制值进行判断,下图为某一像素二进制值说明。该像素为云的可能性很大。

代码思路:

  1. 读取图像,将十进制的数据转换为二进制格式
  2. 云像素识别,并标记,例如(只去除云像素和云阴影像素),为了方便,只使用了bit为3和4的两个为参考,并未加入置信值(confidence)
  3. 创建掩膜,对原图像进行掩膜
PRO LANDSAT_MASK_CLOUD
  COMPILE_OPT IDL2
  e = ENVI()
  
  raster = e.OpenRaster('F:\gbytemp\LC09_L2SP_127031_20220509_20220511_02_T1\LC09_L2SP_127031_20220509_20220511_02_T1_MTL.xml')
  qaPixelRaster = e.OpenRaster('F:\gbytemp\LC09_L2SP_127031_20220509_20220511_02_T1\LC09_L2SP_127031_20220509_20220511_02_T1_QA_PIXEL.TIF')
  data = qaPixelRaster.GetData()
  dimensions = SIZE(data, /DIMENSIONS)
  dataBit = data.toBits()
;  QA Bit    Description                values
;     0      Fill
;     1      Dilated Cloud              1
;     2      Cirrus                     1
;     3      Cloud                      1
;     4      Cloud Shadow               1
;     5      Snow                       1
;     8-9    Cloud Confidence           01Low 10Reserved 11 High
;     10-11  Cloud Shadow Confidence    01Low 10Reserved 11 High
;     12-14  Snow/Ice Confidence        01Low 10Reserved 11 High
;     14-15  Cirrus Confidence          01Low 10Reserved 11 High

  stop
  mask = MAKE_ARRAY(dimensions, VALUE=1, /INTEGER)
  FOR N = 0, dimensions[0]-1 DO BEGIN
    FOR M = 0, dimensions[1]-1 DO BEGIN
;      本文只用到bit 3(云)、bit 5(云阴影)进行去云操作
;      其中3和4表示二进制的位置,从右往左数(0开始)所以3和4的索引位置为-4和-5
      IF dataBit[-4, N, M] EQ 1 OR dataBit[-5, N, M] EQ 1 THEN BEGIN
        mask[N, M] = 0
      ENDIF
    ENDFOR
  ENDFOR
  

  file = e.GetTemporaryFilename()
  maskRaster = ENVIRaster(mask, URI=file)
  maskRaster.Save
  maskedRaster = ENVIMaskRaster(raster[0], maskRaster)

  e.Data.Add, maskedRaster
  view=e.GetView()
  layer=view.CreateLayer(maskedRaster)
  stop
END

去云结果对比图:

方法二:根据QA给定的十进制值解释进行处理

​ 十进制值解释含义如下:

代码思路:

  1. 读取图像
  2. 云像素识别,并标记,例如(只去除云像素和云阴影像素),为了方便,只使用了高置信值云22280、和高置信值云阴影23888为参考,
  3. 创建掩膜,对原图像进行掩膜
PRO LANDSAT_MASK_CLOUD
  COMPILE_OPT IDL2
  e = ENVI()
  
  raster = e.OpenRaster('F:\gbytemp\LC09_L2SP_127031_20220509_20220511_02_T1\LC09_L2SP_127031_20220509_20220511_02_T1_MTL.xml')
  qaPixelRaster = e.OpenRaster('F:\gbytemp\LC09_L2SP_127031_20220509_20220511_02_T1\LC09_L2SP_127031_20220509_20220511_02_T1_QA_PIXEL.TIF')
  data = qaPixelRaster.GetData()
  dimensions = SIZE(data, /DIMENSIONS)

  stop
  mask = MAKE_ARRAY(dimensions, VALUE=1, /INTEGER)
  FOR N = 0, dimensions[0]-1 DO BEGIN
    FOR M = 0, dimensions[1]-1 DO BEGIN
      IF data[N, M] EQ 55052 OR data[N, M] EQ 23888 THEN BEGIN
        mask[N, M] = 0
      ENDIF
    ENDFOR
  ENDFOR

  file = e.GetTemporaryFilename()
  maskRaster = ENVIRaster(mask, URI=file)
  maskRaster.Save
  maskedRaster = ENVIMaskRaster(raster[0], maskRaster)

  e.Data.Add, maskedRaster
  view=e.GetView()
  layer=view.CreateLayer(maskedRaster)
  stop
END

去云结果对比图:

From:https://www.cnblogs.com/gaogao-web/p/18336580
本文地址: http://shuzixingkong.net/article/667
0评论
提交 加载更多评论
其他文章 iOS开发基础144-逐字打印效果
在AIGC类的APP中,实现那种一个字一个字、一行一行地打印出文字的效果,可以通过多种方法来实现。下面是一些实现方法,使用Swift和OC来举例说明。 OC版 1. 基于定时器的逐字打印效果 可以使用NSTimer来逐字逐行地显示文字。 #import "ViewController.h&
利用Curl命令来发邮件的小工具
一个利用curl来发送邮件的小工具 其实可以扩展出很多其它玩法 例如: 配合系统定时任务做系统状态监控,当满足一定条件自动发送邮件 或者和笔者一样,每次加班后懒得编辑邮件,就可以直接传入相应的参数来发邮件 或者...其它可能需要发邮件的场景 字段解释 USER:邮箱帐号名称及密码,中间使用英文冒号:
费曼积分法——以一个简单的例子讲解
今天又又又刷到一个视频,很想睡觉(昨晚熬了个大夜),但是又临近午饭不能睡,只能水篇随笔来打发时间了。 什么是费曼积分法? 先看看官方解释: 费曼积分法(Feynman integral)是一种求解复变函数定积分的计算方法,由理查德·费曼(Richard P. Feynman)提出。这种方法
费曼积分法——以一个简单的例子讲解 费曼积分法——以一个简单的例子讲解 费曼积分法——以一个简单的例子讲解
Python中FastAPI项目使用 Annotated的参数设计
在FastAPI中,你可以使用PEP 593中的Annotated类型来添加元数据到类型提示中。这个功能非常有用,因为它允许你在类型提示中添加更多的上下文信息,例如描述、默认值或其他自定义元数据。 FastAPI支持Annotated类型,这使得你可以为路径操作函数的参数提供额外的元数据,例如依赖
Python中FastAPI项目使用 Annotated的参数设计
python 音频处理(1)——重采样、音高提取
python音频处理 音高提取 f0 提取pitch基频特征 torchaudio resample 重采样
python 音频处理(1)——重采样、音高提取 python 音频处理(1)——重采样、音高提取 python 音频处理(1)——重采样、音高提取
[rCore学习笔记 020]第二章作业
写在前面 本随笔是非常菜的菜鸡写的。如有问题请及时提出。 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 编程题 实现一个裸机应用程序A,能打印调用栈 首先在这里卡了我很久的是调用栈保存在哪里,回想到上一部分画的
[rCore学习笔记 020]第二章作业 [rCore学习笔记 020]第二章作业 [rCore学习笔记 020]第二章作业
SQL连续查询问题拓展—记上海拼多多非技术岗面试真题
真巧,昨天刚写了关于数据库连续问题的解决方案,没想到今天下午两点就有朋友在上海拼多多面试非技术岗位中就遇到了相似的问题。下面是原题: 一个最大连续支付失败的次数 有一张支付流水表pay;字段如下 id uid time status pay_01 1 2024-01-15 10:00:00 fail
比较基因组学流程
1、OrthoFinder 教程:用于比较基因组学的系统发育直系学推断 1.1 orthofinder介绍 OrthoFinder是一种快速、准确和全面的比较基因组学分析工具。它可以找到直系和正群,为所有的正群推断基因树,并为所分析的物种推断一个有根的物种树。OrthoFinder还为比较基因组分析
比较基因组学流程 比较基因组学流程 比较基因组学流程