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

去云结果对比图:

IDL根据Landsat QA波段去云处理【代码】的更多相关文章

  1. Google Earth Engine——基于新的Landsat SR数据集去云处理

    根据GEE官方公告,明年原来的Landsat/LT05/C01/T1_SR和Landsat/LC08/C01/T1_SR数据集将停止更新,并提供了新的地表反射率数据,就是LANDSAT/LT05/C0 ...

  2. 码云私人代码 SSH 设置----https://blog.csdn.net/kkaazz/article/details/78667573

    码云私人代码 SSH 设置 https://blog.csdn.net/kkaazz/article/details/78667573

  3. 前端与编译原理 用js去运行js代码 js2run

    # 前端与编译原理 用js去运行js代码 js2run 前端与编译原理似乎相隔甚远,各种热门的框架都学不过来,那能顾及到这么多底层呢,前端开发者们似乎对编译原理的影响仅仅是"抽象语法树&qu ...

  4. git之sourceTree使用github和码云的代码小结

    16.使用git出现的错误记录  15. Permission denied (publickey)错误: git远程库与本地库同步 git设置ssh公钥 Bad escape character ' ...

  5. Git从码云Clone代码到本地

    Git从码云或者Github 克隆代码到本地 1.下载安装Git,傻瓜式下一步下一步即可... 2.配置Git: 2.1.选择你要clone到本地的路径:右键--->$ Git Bash Her ...

  6. duilib 的IE浏览器控件去边框和去滚动条的代码

    近些天在duilib群里经常有朋友问起,怎么让duilib的IE控件可以去边框,去滚动条的问题,或者是如何去控件IE控件的行为.为了避免重复的回答,我就写一篇博文,把处理方法说明一下. duilib中 ...

  7. windows 系统使用 git 和码云管理代码(本地已有项目)

    1. 为本地项目创建本地仓 找到项目所在的根目录(目录下有解决方案那个),右击目录,点击右键菜单中的“Git Bash Here”(前提是你的电脑已经装了Git,我用的是TortoiseGit) 然后 ...

  8. FPGA按键去抖verilog代码

    按键去抖的原因及其分类就不罗嗦了. 在这里解释一段代码,代码是网上找的,看了半天没懂,无奈查了半天想了半天,终于明白了... module sw_debounce(clk,rst_n,sw1,sw2, ...

  9. 剖析nsq消息队列(二) 去中心化代码源码解析

    在上一篇帖子剖析nsq消息队列(一) 简介及去中心化实现原理中,我介绍了nsq的两种使用方式,一种是直接连接,还有一种是通过nslookup来实现去中心化的方式使用,并大概说了一下实现原理,没有什么难 ...

  10. 纯前端实现词云展示+附微博热搜词云Demo代码

    前言 最近工作中做了几个数据可视化大屏项目,其中也有用到了词云展示,以前做词云都是用python库来生成图片显示的,这次用了纯前端的实现(Ctrl+V真好用),同时顺手做个微博热搜的词云然后记录一下~ ...

随机推荐

  1. jq data方法

    data() 是 jQuery 的方法之一,用于在元素上存储和获取数据.它允许你将任意类型的数据附加到一个或多个元素上,并且可以通过选择器或元素对象来访问和操作这些数据. 代码中,_t.selectB ...

  2. php分组查询和聚合函数 数据显示的顺序

      // 分组查询和聚合函数         // 分组查询 : 将指定字段中的数据,按照不同的具体数值,进行分组         //           数据相同的分在一个分组中          ...

  3. Linux扩展篇-shell编程(五)-流程控制(二)-case语句

    基本语法: case expression in pattern1) statement1 ;; pattern2) statement2 ;; *) statement3 ;; esac 注意事项: ...

  4. rsync备份

    备份工具rsync 备份是太常见.且太重要的一个日常工作了. 备份源码.文档.数据库.等等. 类似cp命令拷贝,但是支持服务器之间的网络拷贝,且保证安全性. 学习背景 超哥游戏公司要每天都要对代码备份 ...

  5. 前台往后台传id

    js页面var stuid;$(function () { var request = { QueryString : function(val) { var uri = window.locatio ...

  6. XTuner大模型单卡低成本微调实战

    Smiling & Weeping ---- 有趣是片难寻的土,灵魂是朵难养的花 一些关于的模型训练的小tips: 1.ctrl+c中断  2.tmux new -s 名称   3.ctrl+ ...

  7. MongoDB文档存储

    非关系型数据库存储 NoSQL,全称 Not Only SQL,意为不仅仅是 SQL,泛指非关系型数据库.NoSQL 是基于键值对的,而且不需要经过 SQL 层的解析,数据之间没有耦合性,性能非常高. ...

  8. js中对对象经行判空

    1.for (... in ...) for(var i in obj){ return true; //如果不为空,返回true } return false; //如果为空,返回false 2.J ...

  9. Sql Server中Cross Apply关键字的使用

    Sql Server中Cross Apply关键字的使用 前言 在写一个业务的时候,有1列数据如下: 车牌号 湘A00001/湘G00001 湘A00002/湘G00002 湘A00003/湘G000 ...

  10. 基于 Linux 2.6的 硬中断 / 软中断的原理以及实现

    Author:zhangskd @ csdn blog 概述 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器. 如果中断的线是激活的,中断控制 ...