GEE|Google Earth Engine中的位运算
简介
在Google Earth Engine(以下简称GEE)中进行质量控制时,需要使用位运算生成掩膜,实现去云等操作。
下面以官方的landsat8去云函数为例,介绍一下位运算一般用来做什么、以及怎么做的。
完整的示例代码在如图所示的位置:
代码实现
去云函数如下所示(选用的数据集为{LANDSAT/LC08/C02/T1_L2}):
function maskL8sr(image) {
// Bit 0 - Fill
// Bit 1 - Dilated Cloud
// Bit 2 - Cirrus
// Bit 3 - Cloud
// Bit 4 - Cloud Shadow
var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0);
var saturationMask = image.select('QA_RADSAT').eq(0);
// Apply the scaling factors to the appropriate bands.
var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
// Replace the original bands with the scaled ones and apply the masks.
return image.addBands(opticalBands, null, true)
.addBands(thermalBands, null, true)
.updateMask(qaMask)
.updateMask(saturationMask);
}
去云流程
这里针对第一行代码,也即var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0)
这段代码对GEE中的位运算做一个说明。
第一步操作,从影像中选取'QA_PIXEL'波段,前面提到了例子选用的数据集为{LANDSAT/LC08/C02/T1_L2},查看该数据集中的这一波段。如下表所示:
QA_PIXEL Bitmask | Pixel quality attributes generated from the CFMASK algorithm |
Bit 0 | Fill |
Bit 1 | Dilated Cloud |
Bit 2 | Cirrus(high confidence) |
Bit 3 | Cloud |
Bit 4 | Cloud Shadow |
Bit 5 | Snow |
Bit 6 |
Clear 0: Cloud or Dilated Cloud bits are set |
Bit 7 |
Water |
Bits 8-9 |
Cloud Confidence 0: None |
Bits 10-11 |
Cloud Shadow Confidence 0: None |
Bits 12-13 |
Snow/Ice Confidence |
Bits 14-15 |
Cirrus Confidence |
从表中我们能了解到,该波段每个像素都是一个16位的二进制数字,每一位或两位数字代表不同的含义,比如第三位,0代表该位置的像素正常,1代表该位置的像素很有可能受到云的遮挡(GEE没有介绍0~7位数字的含义,具体说明见USGS操作文档)。
第二步操作,.bitwiseAnd(parseInt('11111', 2)),这一步我们从里到外说。首先是parseInt('11111', 2),这一步在GEE中运行的结果是:31。不难看出,这一步是将'11111'这个2进制数字转化成了十进制数字31。
接下来的.bitwiseAnd()即“按位与”,功能为:“对应的两个二进位都为1时,结果位才为1”(摘自百度百科)。我举一个例子介绍它的功能:取10与6两个数字(十进制),它们转化为二进制后分别为1010与0110,对其进行按位与,得到的结果为0010。
第三步操作,.eq()是常用的一步操作,但要注意在参数为0的时候不要犯晕,参数为0时,即.eq(0)是将影像中等于0的像素变为1,其它像素变为0。
总结
综合以上介绍的内容,第一行代码的具体操作为:
第一步,选取影像的'QA_PIXEL'波段;
第二步,对其中的每一个像素和'0000 0000 0001 1111'进行按位与运算(不到16位就往左补0);
第三步,将值等于0的像素变为1,其它像素变为0。我们不难看出,第二步中,只有'XXXX XXXX XXX0 0000'(X代表0或1)这样的像素,在进行位运算后的结果为0,最终的结果为1。结合第一步中展示的表格,我们最终得到的影像中,值为0的像素就是函数中注释提到的需要筛去的像素。
了解了这一过程后,就可以按照自己的需求进行质量控制了。
本文作者:Weltㅤ
本文链接:https://www.cnblogs.com/tangjielin/p/16714820.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~