GEE的QA

6/27/2020

目前大多数遥感数据产品都具有QA波段,主要用于辅助用户对数据进行质量评估,得到质量较好的数据,便于后续的应用。QA波段的组织通常是以位来标识,在使用过程中通常都是位运算,难以直接解读。因此本文将以位运算角度展开,介绍QA波段的组织方式和如何利用QA波段创建质量掩膜对数据进行质量过滤。

# QA波段组织

MOD11A1.006 Terra Land Surface Temperature and Emissivity Daily Global 1km (opens new window)为例,它的QA波段组织方式如下所示。

img

上述QA波段是一个8位无符号的整数,也就是其像素值域范围在0到255。这里有4个位标识,每个标识有4种可能的值。这些值会以不同方式组合产生一个8位的无符号整数。

我们可以通过一个具体的例子来解释某个QA像素值对应的含义。假如QA波段的某个像素的值为145,这是代表什么含义?我们通过下图来解释。

img

我们需要将145(十进制)转化为10010001(二进制),然后将每一位与QA波段位标识对应,例如前2位的二进制为01,其十进制对应的值为1,则代表了Bit 0-1标识位的值为1的情况,1: LST produced, other quality, recommend examination of more detailed QA。依此类推,其他位的含义如图所示。因此145像素值,代表的该像素的质量情况为:

  • Bit(0-1)=1:LST produced, other quality, recommend examination of more detailed QA
  • Bit(2-3)=0:Good data quality
  • Bit(4-5)=1:Average emissivity error ≤ 0.02
  • Bit(6-7)=2:Average LST error ≤ 3K

# QA波段使用

如果我们要特定标识位特定值的所有像素,例如要查询上述QA波段种Bit 4-5的值为1的所有像素,同时忽略所有其他位的情况,要如何实现呢?

这就需要使用到位运算来实现,简单来说就是,获取到一个位掩码将感兴趣位的信息保留,其他位的信息忽略或者说设置为0。

位掩码(掩膜)实现需要使用到位左移(<<)和右移(>>)运算操作,在GEE内可以通过其提供的leftShift()rightShift()函数。此外还需要一个特定的位与运算的操作,在GEE内可通过bitwiseAnd()函数实现。具体实现代码如下所示。

// Helper function to extract the values from specific bits
// The input parameter can be a ee.Number() or ee.Image()
// Code adapted from https://gis.stackexchange.com/a/349401/5160
var bitwiseExtract = function(input, fromBit, toBit) {
  var maskSize = ee.Number(1).add(toBit).subtract(fromBit)
  var mask = ee.Number(1).leftShift(maskSize).subtract(1)
  return input.rightShift(fromBit).bitwiseAnd(mask)
}
1
2
3
4
5
6
7
8

要理解上述代码,我们接着以145像素值为例,目的是查询Bit 4-5的值为1的所有像素,同时忽略其他位的情况,可以通过下图解释。

首先,我们来看一下145中Bit 4-5的值是多少?能看到其二进制是01,对应十进制为1。

image-20220627204842196

接着,我们创建一个二进制位掩码,这个掩码以1为开始,然后向左移2位(maskSize)就会变为100,然后再减去1,就得到了特定二进制掩码。

image-20220627205055902

最后,我们将QA波段原始像素的二进制值10010001(145)中的Bit 4-5向右移4位(fromBit)的结果(00001001)与特定二进制掩码(00000011)进行位且(Bitwise And),得到结果二进制(00000001),转为为十进制为1。

image-20220627210213662

# 一个QA波段具体实例.

现在我们将所有内容整合在一起,以一个具体的示例来详细说明QA波段具体使用。

假设我们利用QA波段,将MODIS LST(地表温度)影像中质量较差的像素剔除,限定条件为:

  • QA Flag (Bits 0-1) 为0或者1(LST produced of both good and other quality)
  • Data Quality Flag (Bits 2-3)为0(Good data quality)
  • LST Error Flag (Bits 6-7) 为0(Average LST error ≤ 1K)

那么具体实现代码如下。

var modisLST = ee.ImageCollection("MODIS/006/MOD11A1")
var lsib = ee.FeatureCollection("USDOS/LSIB_SIMPLE/2017")
var australia = lsib.filter(ee.Filter.eq('country_na', 'Australia'))
var geometry = australia.geometry()
var terra = modisLST
  .filter(ee.Filter.date('2001-01-01', '2010-01-01'))
  .select('LST_Day_1km','QC_Day');
// Get a single image for testing
var image = ee.Image(terra.first())
var lstDay = image.select('LST_Day_1km')
var qcDay = image.select('QC_Day')
// Let's extract all pixels from the input image where
// Bits 0-1 <= 1 (LST produced of both good and other quality)
// Bits 2-3 = 0 (Good data quality)
// Bits 4-5 Ignore, any value is ok
// Bits 6-7 = 0 (Average LST error ≤ 1K)
var qaMask = bitwiseExtract(qcDay, 0, 1).lte(1)
var dataQualityMask = bitwiseExtract(qcDay, 2, 3).eq(0)
var lstErrorMask = bitwiseExtract(qcDay, 6, 7).eq(0)
var mask = qaMask.and(dataQualityMask).and(lstErrorMask)
var lstDayMasked = lstDay.updateMask(mask)  
var visParams = {min:13000, max:16000, palette: ['green', 'yellow', 'red']}
Map.addLayer(lstDay.clip(geometry), visParams, 'Original LST Image');
Map.addLayer(lstDayMasked.clip(geometry), visParams, 'LST Masked');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

img

上述代码也可以利用map()函数应用在collection对所有影像进行质量掩膜。

# 参考

  • 原文:https://spatialthoughts.com/2021/08/19/qa-bands-bitmasks-gee/
  • 代码:https://code.earthengine.google.co.in/e21636e7db4a3f757be2f51ed261719f
  • 译文:https://blog.csdn.net/qq_32497109/article/details/122840882

# 后记

这是一篇从外网翻译和整理的关于GEE QA波段的资料。这篇博客内容图文并茂,十分生动形象,并且结合代码可以直观感受,因此对这个网站进一步了解一下,发现它是一个分享和教学QGIS、GEE、GDAL以及Python等与空间数据处理相关的知识网站。

image-20220627214148923

这篇资料的内容不错,按理来说,其他的资料也不差,因此有时间可以再多多学习。

  • YouTube:https://www.youtube.com/c/SpatialThoughts
  • 官网:https://spatialthoughts.com/
Last Updated: 8/6/2023, 3:51:38 PM