遮蔽云和云雾函数

简介

这是一个在 Google Earth Engine 中用于遮蔽 Sentinel-2 数据中云和云雾的函数。该函数首先选择 Sentinel-2 数据中的云量标志(QA60波段),然后通过位操作来确定是否存在云或云雾。

具体步骤如下:

  • 选择 Sentinel-2 数据中的 QA60 波段,该波段包含了云量信息。
  • 定义了云和云雾的位掩码。在 Sentinel-2 的 QA60 波段中,第 10 位表示云,第 11 位表示云雾。
  • 使用位操作(位与)来检查云和云雾的位是否被设置为 1。如果位掩码中的相应位为 1,则说明存在云或云雾。
  • 创建一个遮蔽图层,将云和云雾所在的像素设置为无效值(NaN)。
  • 将遮蔽图层应用到原始图像上,然后将像素值除以 10000,以获得真实的地表反射率。
    这个函数可以用于 Sentinel-2 数据的预处理,以去除图像中的云和云雾,使得后续分析更加准确。

源代码

function maskS2clouds(image) {
  var qa = image.select('QA60');

  // Bits 10 and 11 are clouds and cirrus, respectively.
  var cloudBitMask = 1 << 10;
  var cirrusBitMask = 1 << 11;

  // Both flags should be set to zero, indicating clear conditions.
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
      .and(qa.bitwiseAnd(cirrusBitMask).eq(0));

  return image.updateMask(mask).divide(10000);
}

详细的函数说明

.select()

在 Google Earth Engine 中,select() 方法用于从图像对象中选择指定的波段或属性,并返回一个包含所选波段或属性的新图像对象。

cloudBitMask = 1 << 10 -[操作符]

这行代码是用来创建一个掩码,用于识别 Sentinel-2 数据中的云层。在 Sentinel-2 的数据中,云层信息保存在 QA60 波段中的特定位上。具体来说,第 10 位(从右往左数)表示云层的存在与否。

这行代码执行了位移操作,将数字 1 左移 10 位,得到了一个具有如下形式的二进制数:

0000000001

经过左移 10 位后:

0000010000

这个二进制数表示了一个掩码,用于在 QA60 波段中提取云层信息。掩码的二进制表示中只有第 10 位是 1,其他位都是 0。在进行位与操作时,这个掩码与 QA60 波段中的像素值进行位与操作,结果为 0 表示该位置没有云层,结果为非 0 表示该位置有云层。

这种位操作的技巧是用来提取 Sentinel-2 数据中特定信息的常见做法,例如提取云层、云影、雪覆盖等信息。

qa.bitwiseAnd(cloudBitMask).eq(0)

这行代码是用来从 Sentinel-2 数据的 QA60 波段中提取云层信息的一部分。具体来说,它通过位与操作和相等比较来确定图像中的像素是否被标记为云层。

在这行代码中,qa 是一个代表 QA60 波段的图像对象,cloudBitMask 是一个表示云层的掩码,它通过左移操作创建。

让我们来解释一下这行代码:

qa.bitwiseAnd(cloudBitMask):这一部分执行了位与操作,将 QA60 波段中的像素值与云层掩码进行位与操作。位与操作的结果是将两个二进制数的对应位进行逻辑与运算,如果两个对应位都是 1,则结果为 1,否则为 0。这个操作的结果是得到一个新的图像,其中云层的像素被标记为非 0,其他像素为 0。

.eq(0):这一部分执行了相等比较,将位与操作结果中的像素值与 0 进行相等比较。相等比较的结果是一个布尔值图像,其中像素值为 1 表示原始图像中对应像素值为 0(即非云层),像素值为 0 表示原始图像中对应像素值不为 0(即云层)。

因此,整个表达式 qa.bitwiseAnd(cloudBitMask).eq(0) 的含义是,确定图像中哪些像素没有被标记为云层,结果为真表示该像素不是云层,结果为假表示该像素是云层。

.and()

.and() 是逻辑与操作,用于将两个布尔值进行逻辑与运算,并返回一个新的布尔值。

在你提供的代码中,.and() 方法被用于将两个布尔值图像进行逻辑与操作,其中第一个布尔值图像表示云层掩码,第二个布尔值图像表示云雾掩码。逻辑与操作的结果是将两个图像的对应像素进行逻辑与运算,如果两个对应像素值都为 true,则结果为 true,否则为 false。

具体地,在地球引擎中,.and() 方法可以直接应用于图像对象上,而不仅仅是布尔值。在这种情况下,它执行了逐像素的逻辑与操作。如果两个图像对象具有相同的形状和大小,则 .and() 方法将逐像素地将它们进行逻辑与运算,并返回一个新的图像对象,其中每个像素的值都是对应位置上两个输入图像像素值进行逻辑与运算后的结果。

image.updateMask()

image.updateMask(mask) 方法用于根据给定的遮蔽图层(掩码)更新图像的遮蔽,即将图像中的像素根据掩码的情况进行更新。在更新遮蔽时,如果掩码中的像素值为 0,则对应的图像像素将被遮蔽(即设置为无效值),如果掩码中的像素值为非 0,则对应的图像像素保持不变。

具体来说,image.updateMask(mask) 方法将使用给定的遮蔽图层 mask 对图像 image 进行遮蔽。遮蔽操作会将图像中的像素根据掩码的情况进行更新,即将掩码中对应像素值为 0 的位置在图像中进行遮蔽,而保留其他像素不变。

以下是一个示例,演示了如何使用 image.updateMask(mask) 方法根据遮蔽图层更新图像的遮蔽:

// 创建一个示例图像
var image = ee.Image.constant(1).clip(geometry);

// 创建一个遮蔽图层
var mask = ee.Image.constant(0);

// 更新图像的遮蔽
var maskedImage = image.updateMask(mask);

// 打印结果
print('Masked image:', maskedImage);

在这个示例中,我们首先创建了一个示例图像 image,并创建了一个遮蔽图层 mask,其中所有像素值都为 0。然后,我们使用 image.updateMask(mask) 方法根据遮蔽图层更新了图像的遮蔽,得到了一个新的图像 maskedImage。最后,我们打印了结果图像对象。

.divide(10000)

在Google Earth Engine中,.divide(10000)方法用于对图像中的每个像素值进行除以10000的操作。通常情况下,这是因为在遥感影像中,像素值通常表示的是反射率或辐射亮度等物理量,这些值通常被放大到一个很大的范围。因此,为了得到真实的物理量,需要对这些像素值进行归一化处理,将其缩小到一个合适的范围。

在Sentinel-2影像中,像素值通常是以整数形式表示,范围通常在0到10000之间。除以10000将像素值缩小到0到1之间的范围内,这是一种常见的归一化操作,有助于进行后续的分析和可视化。

以下是一个示例,演示了如何使用.divide(10000)方法对Sentinel-2影像进行归一化处理:

函数应用

var dataset_sentinel2=ee.ImageCollection("COPERNICUS/S2_SR")
                        .filterDate('2019-01-01','2019-12-31')
                        .filterBounds(wuhan)//
                        .filterMetadata('CLOUDY_PIXEL_PERCENTAGE',"less_than",20)
                        .map(maskS2clouds)

.map(maskS2clouds):对满足条件的影像集合中的每张影像应用了名为 maskS2clouds 的函数,该函数用于去除 Sentinel-2 数据中的云和云雾。

相关推荐

  1. 遮蔽云雾函数

    2024-03-10 02:10:01       25 阅读
  2. Kotlin作用域函数引发的遮蔽问题

    2024-03-10 02:10:01       13 阅读
  3. 7-原生监控体系-PromQL-函数功能示例

    2024-03-10 02:10:01       11 阅读
  4. 云端安全新纪元:WAF的崛起

    2024-03-10 02:10:01       7 阅读

最近更新

  1. opencv 设置超时时间

    2024-03-10 02:10:01       0 阅读
  2. Nginx Websocket 协议配置支持

    2024-03-10 02:10:01       0 阅读
  3. Perl语言入门到高级学习

    2024-03-10 02:10:01       0 阅读
  4. 【 HTML基础知识】

    2024-03-10 02:10:01       0 阅读
  5. Vue3框架搭建3:配置说明-prettier配置

    2024-03-10 02:10:01       1 阅读

热门阅读

  1. Linux Shell 函数详解

    2024-03-10 02:10:01       21 阅读
  2. Elasticsearch:了解人工智能搜索算法

    2024-03-10 02:10:01       25 阅读
  3. 金融产业化,应当是产业互联网的有机组成部分

    2024-03-10 02:10:01       21 阅读
  4. 贪心算法 —— 字典序删除字符

    2024-03-10 02:10:01       19 阅读
  5. 【老文新说】C++读取.shp文件

    2024-03-10 02:10:01       23 阅读
  6. 获取通知细节信息

    2024-03-10 02:10:01       24 阅读
  7. linux禁止被ping的方法

    2024-03-10 02:10:01       25 阅读