GEE——利用sentinel-2影像NDVI进行阈值区分

举报
此星光明 发表于 2022/11/07 15:43:19 2022/11/07
【摘要】 ​实现阈值使用数字(阈值)和逻辑运算符来帮助我们将图像的可变性划分为类别。例如,回想一下我们的 NDVI 地图。大量植被的 NDVI 值接近 1,非植被区域接近 0。如果我们想查看地图的哪些区域有植被,我们可以使用阈值将每个像素中的 NDVI 值概括为“无植被” ”或“植被”。可以肯定的是,这是一个实质性的简化,但可以帮助我们更好地理解地球表面的丰富变化。这种类型的分类可能很有用,例如,如果...

实现阈值使用数字(阈值)和逻辑运算符来帮助我们将图像的可变性划分为类别。例如,回想一下我们的 NDVI 地图。大量植被的 NDVI 值接近 1,非植被区域接近 0。如果我们想查看地图的哪些区域有植被,我们可以使用阈值将每个像素中的 NDVI 值概括为“无植被” ”或“植被”。可以肯定的是,这是一个实质性的简化,但可以帮助我们更好地理解地球表面的丰富变化。这种类型的分类可能很有用,例如,如果我们想查看一个城市的植被比例。让我们在美国华盛顿州西雅图附近创建 NDVI 的 Sentinel-2 地图。

gt 方法来自布尔运算符系列——也就是说,gt 是一个函数,它在每个像素中执行测试,如果测试结果为 true,则返回值 1,否则返回 0。在这里,对于图像中的每个像素,它测试 NDVI 值是否大于 0.5。当满足这个条件时,图层 seaVeg 得到值 1。当条件为假时,它接收到值 0。

使用 Inspector 工具探索这个新层。如果单击绿色位置,则 NDVI 应大于 0.5。如果单击白色像素,则 NDVI 值应等于或小于 0.5。

该布尔系列中的其他运算符包括小于 (lt)、小于等于 (lte)、等于 (eq)、不等于 (neq)、大于等于 (gte) 等等。

使用 .where 构建复杂的分类
对 NDVI 进行分类的二进制地图非常有用。但是,在某些情况下,您可能希望将图像拆分为两个以上的 bin。 Earth Engine 提供了一种工具,即 where 方法,它根据测试结果在每个像素内有条件地评估为真或假。这类似于在其他语言中常见的 if 语句。但是,为了在为 Earth Engine 编程时执行此逻辑,我们避免使用 JavaScript if 语句。重要的是,如果命令不是在 Google 的服务器上计算的,JavaScript 会在运行您的代码时产生严重的问题——实际上,服务器会尝试将所有要执行的信息发送到您自己计算机的浏览器上,而对于如此庞大的浏览器来说,它的设备非常不足任务。相反,我们将 where 子句用于条件逻辑。

假设我们不只是将 NDVI 中的森林区域与非森林区域分开,而是希望将图像拆分为可能的水域、非森林区域和森林区域。我们可以使用 -0.1 和 0.5 的位置和阈值。我们将从使用 ee.Image 创建图像开始。然后我们剪辑新图像,使其覆盖与我们的 seaNDVI 层相同的区域。

where(测试,值)
执行值的条件替换。

对于'input'的每个band中的每个像素,如果'test'中的对应像素不为零,则输出value中对应的像素,否则输出输入像素。

如果在给定像素处,测试或值被屏蔽,则使用输入值。如果输入被屏蔽,则什么也不做。

输出波段与输入波段具有相同的名称。每个波段的输出类型是输入和值类型中较大的一个。输出图像保留输入图像的元数据和足迹。

论据:
这:输入(图像):
输入图像。

测试(图片):
测试图像。此图像的像素确定返回哪个输入像素。如果这是单个波段,则将其用于输入图像中的所有波段。这可能不是数组图像。

价值(图片):
在 test 不为零时使用的输出值。如果这是单个波段,则将其用于输入图像中的所有波段。

返回:图片


代码:

// 用Sentinel 2影像构建NDVI影像.
var seaPoint = ee.Geometry.Point(-122.2040, 47.6221);
var seaImage = ee.ImageCollection('COPERNICUS/S2')
    .filterBounds(seaPoint)
    .filterDate('2020-08-15', '2020-10-01')
    .first();

var seaNDVI = seaImage.normalizedDifference(['B8', 'B4']);

// 加载到地图上
Map.centerObject(seaPoint, 10);
var vegPalette = ['red', 'white', 'green'];
Map.addLayer(seaNDVI,
    {
        min: -1,
        max: 1,
        palette: vegPalette
    },
    'NDVI Seattle');

//利用条件来划分影像阈值
// 创建所有值 = 1 的起始图像。
var seaWhere = ee.Image(1)
    // 使用剪辑来限制新图像的大小。
    .clip(seaNDVI.geometry());

// 使所有小于 -0.1 的 NDVI 值等于 0。
seaWhere = seaWhere.where(seaNDVI.lte(-0.1), 0);

// 使所有大于 0.5 的 NDVI 值等于 2。
seaWhere = seaWhere.where(seaNDVI.gte(0.5), 2);

// 映射我们已分为三类的图层。
Map.addLayer(seaWhere,
    {
        min: 0,
        max: 2,
        palette: ['blue', 'white', 'green']
    },
    'Water, Non-forest, Forest');


结果:

我们设定3个值,分别对应水体,植被和其它部分,结果如下图所示:

 结果为0和1区分植被和水体的分析

 往期推荐:​

GEE云平台——Landsat 7 影像数据集合详解

会议通知|第六届全国地球空间大数据与云计算前沿会议与集中学习

GEE——Landsat 8 数据集影像集合具体介绍

GEE数据集——瑞士0.1米超清分辨率影像数据

GEE在线计算23类指数APP:VEGETATION INDICES CALCULATOR

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。