晋江文学城
下一章 上一章  目录  设置

8、八识 第 1节: ...

  •   第 1节:在 Earth Engine 中过滤图像集合
      过滤器、映射、归约范式的第一部分是“过滤”以从较大的ImageCollection 中获取较小的 ImageCollection与牛奶示例一样,过滤器采用大量项目,通过某种标准对其进行限制,然后返回较小的一组以供考虑。在这里,过滤器采用ImageCollection ,通过日期、位置或图像特征的某些标准对其进行限制,并返回较小的ImageCollection。

      Earth Engine API 为ImageCollection类型提供了一组过滤器过滤器可以根据空间、时间或属性特征来限制ImageCollection。可将图像从 ImageCollection 中分离出来以进行检查或操作。下面的信息应该提供对这项工作的看法,同时介绍一些用于过滤图像集合的新工具。

      以下是通过特征限制 Landsat 5 ImageCollection 并评估结果集大小的三个示例。
      FilterDate这将ImageCollection 作为输入并返回其成员满足指定日期条件的ImageCollection。

      var imgCol=ee.ImageCollection(\'LANDSAT/LT05/C02/T1_L2\');
      // How many Tier 1 Landsat 5 images have ever been collected?
      print(\"All images ever: \", imgCol.size()); // A very large number

      // How many images were collected in the 2000s?
      var startDate=\'2000-01-01\';
      var endDate=\'2010-01-01\';

      var imgColfilteredByDate=imgCol.filterDate(startDate, endDate);
      print(\"All images 2000-2010: \", imgColfilteredByDate.size());
      // A smaller (but still large) number

      运行代码后,你应该获得非常大的整组图像。你还可能会在十年尺度的时间间隔内获得大量图像子集。

      FilterBounds与牛奶示例类似,可能只有靠近感兴趣地点的图像对你有用。filterBounds 将ImageCollection 作为输入并返回其图像围绕指定位置的ImageCollection。如果我们获取按日期过滤的ImageCollection ,然后按边界过滤它,我们将把集合过滤到指定日期间隔内指定点附近的那些图像。使用下面的代码,我们将计算首次访问的上海附近的图像数量。

      从 2000 年代初开始:
      var ShanghaiImage=ee.Image(
      \'LANDSAT/LT05/C02/T1_L2/LT05_118038_20000606\');
      Map.centerObject(ShanghaiImage, 9);

      var imgColfilteredByDateHere=imgColfilteredByDate.filterBounds(Map
      .getCenter());
      print(\"All images here, 2000-2010: \", imgColfilteredByDateHere
      .size()); // A smaller number

      如果你愿意,你可以花几分钟来探索脚本在世界不同地区的行为。为此,你需要注释掉Map。centerObject 命令可防止每次运行脚本时地图移动到该位置。

      图像的日期和位置是与每个图像一起存储的特征。图像处理中的另一个重要因素是云量,这是为许多集合(包括 Landsat 和 Sentinel-2集合)中的每张图像计算的图像级值。总体云度分数可能存储在不同数据集中的不同元数据标签名称下。例如,对于 Sentinel-2,此总体云量分数存储在CLOUDY_PIXEL_PERCENTAGE 元数据字段中。对于 Landsat 5(我们在本例中使用的ImageCollection),图像级云度分数使用标签CLOUD_COVER存储。如果你不熟悉如何查找此信息,这些技能首先在 F1 部分中介绍。

      在这里,我们将使用filterBounds 和filterDate访问刚刚构建的ImageCollection ,然后使用filterMetadata函数通过图像级云覆盖分数进一步过滤图像。

      接下来,让我们删除任何云度达到或超过50%的图像。正如使用每像素云度信息的后续章节中将描述的那样,如果你认为云度图像中的某些值可能有用,你可能希望在现实研究中保留这些图像。现在,为了说明过滤概念,我们只保留图像级云量值表明云覆盖率低于50%的图像。在这里,我们将采用已经按边界和日期过滤的集合,并使用云百分比进一步将其过滤到新的ImageCollection中。将此行添加到脚本中以按云量进行过滤并将大小打印到控制台。

      var L5FilteredLowCloudImages=imgColfilteredByDateHere
      .filterMetadata(\'CLOUD_COVER\', \'less_than\', 50);
      print(\"Less than 50% clouds in this area, 2000-2010\",
      L5FilteredLowCloudImages.size()); // A smaller number

      以有效的顺序进行过滤正如你之前在假设的牛奶示例中看到的那样,我们通常按该顺序进行过滤、映射、然后缩减。就像我们不想呼叫地球上的每个商店,而是更愿意首先缩小潜在商店列表的范围一样,我们首先在 Earth Engine 的工作流程中过滤图像。此外,你可能已经注意到,过滤阶段中过滤器的顺序在牛奶示例中也很重要。Earth Engine 中也是如此。对于要使用filterBounds的非全局空间组件的问题,首先进行空间过滤是最有效的。

      在下面的代码中,你将看到可以“链接”过滤器命令,然后从左到右执行这些命令。下面,我们按照你上面指定的顺序链接过滤器。请注意,它提供的ImageCollection 的大小与一次应用一个滤镜时的大小相同。

      var chainedFilteredSet=imgCol.filterDate(startDate, endDate)
      .filterBounds(Map.getCenter())
      .filterMetadata(\'CLOUD_COVER\', \'less_than\', 50);
      print(\'Chained: Less than 50% clouds in this area, 2000-2010\',
      chainedFilteredSet.size());

      在下面的代码中,我们以更有效的顺序链接过滤器,首先实现filterBounds。这也提供了与以效率较低的顺序应用过滤器时相同大小的ImageCollection ,无论过滤器是否链接。

      var efficientFilteredSet=imgCol.filterBounds(Map.getCenter())
      .filterDate(startDate, endDate)
      .filterMetadata(\'CLOUD_COVER\', \'less_than\', 50);
      print(\'Efficient filtering: Less than 50% clouds in this area, 2000-2010\',
      efficientFilteredSet.size());

      对于图像数量,两组链式操作中的每一个都会给出与之前相同的结果。虽然第二个顺序更有效,但对于这个非常小的示例,两种方法都可能大致同时将答案返回到代码编辑器。在较大的问题中,操作的顺序是最重要的,在这些问题中,你可能会面临仔细管理内存的挑战。正如在牛奶示例中首先缩小地理范围一样,在 Earth Engine 中,最好先使用 filterBounds 对过滤器进行排序,然后按照特异性递减的顺序对元数据过滤器进行排序。

      现在,有了满足我们选择标准的有效过滤集合,我们接下来将探索第二阶段:对集合中的所有图像执行函数。

      第 2 节:在 Earth Engine 中映射图像集合

      我们以非常小的步长计算了增强植被指数 (EVI),以说明卫星图像上的波段运算。代码在单个图像上被调用一次。如果我们想以相同的方式计算整个ImageCollection的每个图像的EVI该怎么办?在这里,我们使用 Earth Engine 工作流程第二部分的关键工具,即地图命令。这大致类似于本章开始的牛奶示例中打电话的步骤,在该示例中,你获取了商店名称列表,并通过努力将其转换为牛奶价格列表。

      在开始编写EVI 功能之前,值得注意的是,在基于云的遥感过程中,在多种设置中都会遇到“地图”一词,能够区分用途非常重要。一个好的思考方式是,“地图”在 Earth Engine 中可以充当动词或名词。“地图”作为名词有两种用法。我们可能会随意提及“地图”,或更准确地说是“地图面板”;这些术语指的是图像在代码界面中显示的位置。“地图”用作名词的第二种方式是指 Earth Engine 对象,该对象具有可以调用的函数。这方面的例子是熟悉的Map。添加图层和地图。设置中心。如果打算使用该词,它将以紫色文本显示并在代码编辑器中大写。我们这里讨论的是的使用。map 作为动词,表示在一组上重复执行一组动作的想法。这通常称为“集合上的映射”。

      为了在整个ImageCollection上有效地映射一组给定的操作,需要以特定的方式设置处理。熟悉其他编程语言的用户可能希望看到“循环”代码来执行此操作,但 Earth Engine 中的处理并不是完全按照这种方式完成的。相反,我们将创建一个函数,然后将其映射到ImageCollection上。首先,设想创建一个只接受一个参数ee 的函数。图像。然后,该函数被设计为对输入ee执行一组指定的操作。图像,然后,重要的是,返回一个ee图像作为函数的最后一步。当我们将该函数映射到ImageCollection时,效果是我们从 ImageCollection 开始,对每个图像执行操作,并接收处理后的ImageCollection 作为输出。

      我们可以创建什么类型的函数?例如,你可以想象一个函数获取图像并返回一个图像,当给定波段的值低于某个阈值时,该图像的像素值为1,否则返回0。映射此函数的效果将是图像的整个ImageCollection ,其中的零和一代表每个图像上的测试结果。或者你可以想象一个函数计算复杂的自定义索引并发送回在每个像素中计算的该索引的图像。在这里,我们将创建一个函数来计算任何输入 Landsat 5图像的 EVI,并返回为每个像素计算索引的单波段图像。将下面的函数定义复制并粘贴到代码编辑器中,将其添加到上一节脚本的末尾。

      var makeLandsat5EVI=function(oneL5Image){
      // compute the EVI for any Landsat 5 image. Note it\'s specific to
      // Landsat 5 images due to the band numbers. Don\'t run this exact
      // function for images from sensors other than Landsat 5.

      // Extract the bands and divide by 1e4 to account for scaling done.
      var nirScaled=oneL5Image.select(\'SR_B4\').divide(10000);
      var redScaled=oneL5Image.select(\'SR_B3\').divide(10000);
      var blueScaled=oneL5Image.select(\'SR_B1\').divide(10000);

      // Calculate the numerator, note that order goes from left to right.
      var numeratorEVI=(nirScaled.subtract(redScaled)).multiply(
      2.5);

      // Calculate the denominator
      var denomClause1=redScaled.multiply(6);
      var denomClause2=blueScaled.multiply(7.5);
      var denominatorEVI=nirScaled.add(denomClause1).subtract(
      denomClause2).add(1);

      // Calculate EVI and name it.
      var landsat5EVI=numeratorEVI.divide(denominatorEVI).rename(
      \'EVI\');
      return (landsat5EVI);
      };

      值得强调的是,一般来说,带名称是特定于每个ImageCollection的。因此,例如,如果该函数在没有带\'SR_B4\'的图像上运行,则函数调用将会失败。在这里,我们在函数名称中强调了它是专门为 Landsat 5创建EVI 的。

      函数makeLandsat5EVI 用于接收单个图像,选择适当的波段来计算 EVI,进行计算并返回单波段图像。如果我们有组成ImageCollection的每张图像的名称,我们可以将名称输入到代码编辑器中,并为每张图像一次调用一个函数,将图像组装成变量,然后将它们组合成ImageCollection 这将非常乏味并且很容易出错:项目列表可能会输入错误,图像可能会丢失等。相反,如上所述,我们将使用地图。使用下面的代码,让我们打印有关云过滤的集合的信息并显示它,执行地图命令,并探索生成的ImageCollection。

      var L5EVIimages=efficientFilteredSet.map(makeLandsat5EVI);
      print(\'Verifying that the .map gives back the same number of images: \',
      L5EVIimages.size());
      print(L5EVIimages);

      Map.addLayer(L5EVIimages,{}, \'L5EVIimages\', 1, 1);

      输入并执行此代码后,你将看到一个灰度图像。如果仔细观察图像的边缘,你可能会发现其后面绘制的其他图像,看起来有点像桌子上的一叠纸。这是由makeLandsat5EVI函数绘制的ImageCollection的图你可以选择“检查器”面板并单击其中一个灰度像素来查看整个ImageCollection的值。单击像素后,通过打开和关闭项目列表来查找系列标签。当你打开该标签时,你将看到该像素处的 EVI 值图表,该图表是通过映射 makeLandsat5EVI 创建的过滤后的ImageCollection 上的函数。

      第 3节 :减少图像集合
      过滤器、映射、归约范式的第三部分是“减少”ImageCollection 中的值以提取有意义的值(图 F4.0.1)。在牛奶示例中,我们减少了一大堆牛奶价格以找到最小值。Earth Engine API 提供了大量的缩减器,用于将一组值缩减为汇总统计数据。

      在这里,你可以在通过.EVI 计算执行后想到每个位置。map 命令,因为上面有一个 EVI 值列表。每个像素包含一组可能非常大的 EVI 值;一个位置的堆栈可能有15个项目,而另一个位置的堆栈可能有200、2000 或 200,000个项目,尤其是在使用了一组较宽松的过滤器的情况下。

      下面的代码计算上面创建的ImageCollection L5EVIimages在每个像素处的平均值。将其添加到代码的底部。
      var L5EVImean=L5EVIimages.reduce(ee.Reducer.mean());
      print(L5EVImean);
      Map.addLayer(L5EVImean,{
      min: -1,
      max: 2,
      palette: [\'red\', \'white\', \'green\']
      }, \'Mean EVI\');
      使用相同的原理,下面的代码计算并绘制每个像素中ImageCollection的中值 。
      var L5EVImedian=L5EVIimages.reduce(ee.Reducer.median());
      print(L5EVImedian);
      Map.addLayer(L5EVImedian,{
      min: -1,
      max: 2,
      palette: [\'red\', \'white\', \'green\']
      }, \'Median EVI\');

      两个减速器对过滤后的ImageCollection 中映射的 EVI 值的影响:平均图像和中值图像

      还有更多的缩减程序可以与ImageCollection一起使用来生成各种摘要统计信息。缩减器不限于仅从缩减中返回一项。例如,minMax减速器为给定的每个波段返回一个两波段图像,一个代表最小值,一个代表最大值。这里描述的缩减器独立地处理每个像素。

  • 昵称:
  • 评分: 2分|鲜花一捧 1分|一朵小花 0分|交流灌水 0分|别字捉虫 -1分|一块小砖 -2分|砖头一堆
  • 内容:
  •             注:1.评论时输入br/即可换行分段。
  •                 2.发布负分评论消耗的月石并不会给作者。
  •             查看评论规则>>