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
1: Cloud and Dilated Cloud bits are not set

Bit 7

Water

Bits 8-9

Cloud Confidence

0: None
1: Low
2: Medium
3: High

Bits 10-11

Cloud Shadow Confidence

0: None
1: Low
2: Medium
3: High

Bits 12-13

 Snow/Ice Confidence
0: None
1: Low
2: Medium
3: High

Bits 14-15

 Cirrus Confidence
0: None
1: Low
2: Medium
3: High

 

从表中我们能了解到,该波段每个像素都是一个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的像素就是函数中注释提到的需要筛去的像素。

了解了这一过程后,就可以按照自己的需求进行质量控制了。

posted @ 2022-09-21 10:47  Weltㅤ  阅读(746)  评论(0编辑  收藏  举报