IDL根据Landsat QA波段去云处理【代码】
IDL根据Landsat QA波段去云处理【代码】
landsat QA波段(质量评估波段)是Landsat卫星影像数据中的一个特殊波段,他在Landsat5-9的每个产品中都存在。虽然我们常用的Landsat影像数据有B1-B7波段,但QA波段并不是其中之一。它可以反映出云、云阴影、雪等类别的像素,常常应用在影像处理中对云像素去除。
最近有在写landsat像素去云处理,查了网上许多QA波段值解释说明,发现都是基于二进制的,但IDL不同于GEE的算法,没有>>这种的按位运算符,只能先转成二进制,再自己写算法处理。算法写好后,为了发博客就去查了官网,又发现官网更新的QA波段值解释说明已经更新到了十进制,于是又写了一下根据十进制的去云处理(真的大哭)。
方法一:根据QA给定的二进制值解释进行处理

上面的图片列出了QA波段的每一位所代表的含义,该含义为二进制存储的信息。
QA波段的存储方式为十进制,所以转换为二进制值进行判断,下图为某一像素二进制值说明。该像素为云的可能性很大。

代码思路:
- 读取图像,将十进制的数据转换为二进制格式
- 云像素识别,并标记,例如(只去除云像素和云阴影像素),为了方便,只使用了bit为3和4的两个为参考,并未加入置信值(confidence)
- 创建掩膜,对原图像进行掩膜
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给定的十进制值解释进行处理
十进制值解释含义如下:
![]()
代码思路:
- 读取图像
- 云像素识别,并标记,例如(只去除云像素和云阴影像素),为了方便,只使用了高置信值云22280、和高置信值云阴影23888为参考,
- 创建掩膜,对原图像进行掩膜
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波段去云处理【代码】的更多相关文章
- Google Earth Engine——基于新的Landsat SR数据集去云处理
根据GEE官方公告,明年原来的Landsat/LT05/C01/T1_SR和Landsat/LC08/C01/T1_SR数据集将停止更新,并提供了新的地表反射率数据,就是LANDSAT/LT05/C0 ...
- 码云私人代码 SSH 设置----https://blog.csdn.net/kkaazz/article/details/78667573
码云私人代码 SSH 设置 https://blog.csdn.net/kkaazz/article/details/78667573
- 前端与编译原理 用js去运行js代码 js2run
# 前端与编译原理 用js去运行js代码 js2run 前端与编译原理似乎相隔甚远,各种热门的框架都学不过来,那能顾及到这么多底层呢,前端开发者们似乎对编译原理的影响仅仅是"抽象语法树&qu ...
- git之sourceTree使用github和码云的代码小结
16.使用git出现的错误记录 15. Permission denied (publickey)错误: git远程库与本地库同步 git设置ssh公钥 Bad escape character ' ...
- Git从码云Clone代码到本地
Git从码云或者Github 克隆代码到本地 1.下载安装Git,傻瓜式下一步下一步即可... 2.配置Git: 2.1.选择你要clone到本地的路径:右键--->$ Git Bash Her ...
- duilib 的IE浏览器控件去边框和去滚动条的代码
近些天在duilib群里经常有朋友问起,怎么让duilib的IE控件可以去边框,去滚动条的问题,或者是如何去控件IE控件的行为.为了避免重复的回答,我就写一篇博文,把处理方法说明一下. duilib中 ...
- windows 系统使用 git 和码云管理代码(本地已有项目)
1. 为本地项目创建本地仓 找到项目所在的根目录(目录下有解决方案那个),右击目录,点击右键菜单中的“Git Bash Here”(前提是你的电脑已经装了Git,我用的是TortoiseGit) 然后 ...
- FPGA按键去抖verilog代码
按键去抖的原因及其分类就不罗嗦了. 在这里解释一段代码,代码是网上找的,看了半天没懂,无奈查了半天想了半天,终于明白了... module sw_debounce(clk,rst_n,sw1,sw2, ...
- 剖析nsq消息队列(二) 去中心化代码源码解析
在上一篇帖子剖析nsq消息队列(一) 简介及去中心化实现原理中,我介绍了nsq的两种使用方式,一种是直接连接,还有一种是通过nslookup来实现去中心化的方式使用,并大概说了一下实现原理,没有什么难 ...
- 纯前端实现词云展示+附微博热搜词云Demo代码
前言 最近工作中做了几个数据可视化大屏项目,其中也有用到了词云展示,以前做词云都是用python库来生成图片显示的,这次用了纯前端的实现(Ctrl+V真好用),同时顺手做个微博热搜的词云然后记录一下~ ...
随机推荐
- jq data方法
data() 是 jQuery 的方法之一,用于在元素上存储和获取数据.它允许你将任意类型的数据附加到一个或多个元素上,并且可以通过选择器或元素对象来访问和操作这些数据. 代码中,_t.selectB ...
- php分组查询和聚合函数 数据显示的顺序
// 分组查询和聚合函数 // 分组查询 : 将指定字段中的数据,按照不同的具体数值,进行分组 // 数据相同的分在一个分组中 ...
- Linux扩展篇-shell编程(五)-流程控制(二)-case语句
基本语法: case expression in pattern1) statement1 ;; pattern2) statement2 ;; *) statement3 ;; esac 注意事项: ...
- rsync备份
备份工具rsync 备份是太常见.且太重要的一个日常工作了. 备份源码.文档.数据库.等等. 类似cp命令拷贝,但是支持服务器之间的网络拷贝,且保证安全性. 学习背景 超哥游戏公司要每天都要对代码备份 ...
- 前台往后台传id
js页面var stuid;$(function () { var request = { QueryString : function(val) { var uri = window.locatio ...
- XTuner大模型单卡低成本微调实战
Smiling & Weeping ---- 有趣是片难寻的土,灵魂是朵难养的花 一些关于的模型训练的小tips: 1.ctrl+c中断 2.tmux new -s 名称 3.ctrl+ ...
- MongoDB文档存储
非关系型数据库存储 NoSQL,全称 Not Only SQL,意为不仅仅是 SQL,泛指非关系型数据库.NoSQL 是基于键值对的,而且不需要经过 SQL 层的解析,数据之间没有耦合性,性能非常高. ...
- js中对对象经行判空
1.for (... in ...) for(var i in obj){ return true; //如果不为空,返回true } return false; //如果为空,返回false 2.J ...
- Sql Server中Cross Apply关键字的使用
Sql Server中Cross Apply关键字的使用 前言 在写一个业务的时候,有1列数据如下: 车牌号 湘A00001/湘G00001 湘A00002/湘G00002 湘A00003/湘G000 ...
- 基于 Linux 2.6的 硬中断 / 软中断的原理以及实现
Author:zhangskd @ csdn blog 概述 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器. 如果中断的线是激活的,中断控制 ...