GEE入门篇|图像处理(三):阈值处理、掩膜和重新映射图像

阈值处理、掩膜和重新映射图像

        本章前一节讨论了如何使用波段运算来操作图像, 这些方法通过组合图像内的波段来创建新的连续值。 本期内容使用逻辑运算符对波段或索引值进行分类,以创建分类图像。

1.实现阈值

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

// Create an NDVI image using Sentinel 2.
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']);
// And map it.
Map.centerObject(seaPoint, 10);
var vegPalette = ['red', 'white', 'green'];
Map.addLayer(seaNDVI,{min: -1,max: 1,palette: vegPalette},'NDVI Seattle');

图1 美国华盛顿州西雅图上空 Sentinel-2 图像的 NDVI 图像 

        检查图像, 我们可以看到,植被区域呈深绿色,无植被区域呈白色,水呈粉红色。 如果我们使用 Inspector 查询图像,我们可以看到公园和其他森林地区的 NDVI 大约超过 0.5。 因此,将 NDVI 值大于 0.5 的区域定义为森林覆盖区域,将低于该阈值的区域定义为非森林覆盖区域是有意义的。 现在,让我们将该值定义为阈值,并用它来确定植被区域的阈值。

// Implement a threshold.
var seaVeg = seaNDVI.gt(0.5);
// Map the threshold.
Map.addLayer(seaVeg,
{min: 0,max: 1,palette: ['white', 'green']
},
'Non-forest vs. Forest');

        gt 方法来自布尔运算符系列,也就是说,gt 是一个在每个像素中执行测试的函数,如果测试结果为 true,则返回值 1,否则返回 0。 这里,对于图像中的每个像素,它测试 NDVI 值是否大于 0.5。 当满足此条件时,seaVeg 层将获得值 1。当条件为 false 时,它将获得值 0(图 2)。使用 Inspector 工具探索这个新层。 如果单击绿色位置,则 NDVI 应大于 0.5。 如果单击白色像素,则 NDVI 值应等于或小于 0.5。该布尔族中的其他运算符包括小于 (lt)、小于或等于 (lte)、等于 (eq)、不等于 至 (neq),并且大于或等于 (gte) 及以上。 

图2 美国华盛顿州西雅图基于NDVI的阈值森林和非森林图像

2.使用 .where 构建复杂的分类

        对 NDVI 进行分类的二值图非常有用,但是,在某些情况下,您可能希望将图像拆分为两个以上类别。 Earth Engine 提供了一个工具,即 where 方法,可以根据测试结果有条件地评估每个像素内的 true 或 false。 这类似于其他语言中常见的 if 语句。 然而,为了在 Earth Engine 编程时执行此逻辑,我们避免使用 JavaScript if 语句。 重要的是,JavaScript 如果命令不是在 Google 的服务器上计算的,并且在运行代码时可能会产生严重的问题,实际上,服务器会尝试将所有要执行的信息发送到您自己计算机的浏览器,而浏览器对于如此庞大的数据量来说是非常不足的。 任务。 相反,我们使用 where 子句来实现条件逻辑。
        假设我们不只是将 NDVI 中的森林区域与非森林区域分开,而是希望将图像分为可能的水域、非森林区域和森林区域。 我们可以使用 where 和阈值 -0.1 和 0.5。 我们将首先使用 ee.Image 创建图像。 然后,我们裁剪新图像,使其覆盖与 seaNDVI 图层相同的区域(图 3)。

// Implement .where.
// Create a starting image with all values = 1.
var seaWhere = ee.Image(1)
// Use clip to constrain the size of the new image..clip(seaNDVI.geometry());
// Make all NDVI values less than -0.1 equal 0.
seaWhere = seaWhere.where(seaNDVI.lte(-0.1), 0);
// Make all NDVI values greater than 0.5 equal 2.
seaWhere = seaWhere.where(seaNDVI.gte(0.5), 2);
// Map our layer that has been divided into three classes.
Map.addLayer(seaWhere,
{min: 0,max: 2,palette: ['blue', 'white', 'green']
},
'Water, Non-forest, Forest');

        关于这段代码,有一些您以前可能没有见过的有趣的事情需要注意。 首先,我们没有为每个 where 调用定义一个新变量。 因此,我们可以执行许多 where 调用,而无需每次都创建新变量并需要跟踪它们。 其次,当我们创建起始图像时,我们将值设置为 1。这意味着我们可以轻松地分别使用一个 where 子句设置底部和顶部值。 最后,虽然我们在这里没有这样做,但我们可以使用 and 和 or 组合多个 where 子句。 例如,我们可以使用seaNDVI.gte(−0.1).and(seaNDVI.lt(0.5))来识别具有中等水平的NDVI的像素。 

图3 美国华盛顿州西雅图基于NDVI阈值的水、森林和非森林图像

3.屏蔽图像中的特定值

        屏蔽图像是一种将图像的特定区域(被掩膜覆盖的区域)从显示或分析中删除的技术。Earth Engine允许您查看当前掩码和更新掩膜(图4)。        

// Implement masking.
// View the seaVeg layer's current mask.
Map.centerObject(seaPoint, 9);
Map.addLayer(seaVeg.mask(), {}, 'seaVeg Mask');

        您可以使用Inspector来查看黑色区域被遮盖,而白色区域的常量值为 1。这意味着数据值仅在白色区域内被映射并可用于分析。 现在假设我们只想在森林中显示和进行分析地区。 让我们从图像中屏蔽掉非森林区域,首先,我们使用 equals (eq) 方法创建一个二进制掩膜。

// Create a binary mask of non-forest.
var vegMask = seaVeg.eq(1);

        在制作掩膜时,您将想要查看和分析的值设置为大于 0 的数字。其想法是设置不需要的值以获得 0 的值。具有 0 值的像素被遮盖掉(实际上,它们 一旦我们使用 updateMask 方法将这些值添加到现有掩膜中,就根本不会出现在屏幕上。 

图 4 我们之前创建的 seaVeg 层的现有掩模

// Update the seaVeg mask with the non-forest mask.
var maskedVeg = seaVeg.updateMask(vegMask);
// Map the updated Veg layer
Map.addLayer(maskedVeg,
{min: 0,max: 1,palette: ['green']
},
'Masked Forest Layer');

        关闭所有其他层,您可以看到 maskedVeg 图层现在如何遮盖所有非森林区域(图 5)。映射该图层的更新蒙版,您可以看到这是为什么(图 6)。 

图 5 更新后的掩膜现在仅显示森林区域, 非森林地区是被遮蔽和透明的

图 6 更新后的掩模,非森林区域现在也被遮盖(图像的黑色区域)

// Map the updated mask
Map.addLayer(maskedVeg.mask(), {}, 'maskedVeg Mask');

3.重新映射图像中的值

        重新映射采用图像中的特定值并为它们分配不同的值。这对于分类数据集特别有用,让我们使用 remap 方法来更改 seaWhere 图层的值。请注意,由于我们将中间值更改为最大,因此我们还需要调整调色板。

// Remap the values from the seaWhere layer.
var seaRemap = seaWhere.remap([0, 1, 2], // Existing values.
[9, 11, 10]); // Remapped values.
Map.addLayer(seaRemap,
{min: 9,max: 11,palette: ['blue', 'green', 'white']
},
'Remapped Values');

        使用检查器比较我们原始的seaWhere(显示为Water、Non-Forest、Forest)和seaRemap(标记为“Remapped Values”)之间的值。 单击森林区域,您应该看到重新映射值应为 10,而不是 2(图 7)。 

 图 7  对于森林区域,重新映射的图层的值为 10,而原始图层的值为 2,您的Inspector中可能有更多图层

【代码链接】https://code.earthengine.google.com/496370d6752d56e39dbfe6ea10ac718b

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/715275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PXE网络启动实战(第一篇 启动WinPE)

免责声明:文中有一些图片来源自网络,如有版权请通知我删除,谢谢! 目录 一、无盘站 二、PXE启动 三、PXE启动原理 四、启动WinPE 1、服务器准备 2、客户端 3、TFTP服务 4、WinPE选择 5、具体操作: 预告 一、无盘站 网络启动最早用于无盘系统,那时的电脑只配备软…

【python量化】多种Transformer模型用于股价预测(Autoformer, FEDformer和PatchTST等)_neuralforecast

写在前面 在本文中,我们利用Nixtla的NeuralForecast框架,实现多种基于Transformer的时序预测模型,包括:Transformer, Informer, Autoformer, FEDformer和PatchTST模型,并且实现将它们应用于股票价格预测的简单例子。 …

Libero集成开发环境中Identify应用与提高

Libero集成开发环境中Identify应用与提高 Identify的安装

操作系统原理与实验——实验三优先级进程调度

实验指南 运行环境: Dev c 算法思想: 本实验是模拟进程调度中的优先级算法,在先来先服务算法的基础上,只需对就绪队列到达时间进行一次排序。第一个到达的进程首先进入CPU,将其从就绪队列中出队后。若此后队首的进程的…

多租户 TransmittableThreadLocal 线程安全问题

在一个多租户项目中,用户登录时,会在自定义请求头拦截器AsyncHandlerInterceptor将该用户的userId,cstNo等用户信息设置到TransmittableThreadLocal中,在后续代码中使用.代码如下: HeaderInterceptor 请求头拦截器 public class HeaderInterceptor implements Asyn…

阿里云国际云服务器全局流量分析功能详细介绍

进行全局流量分析时,内网DNS解析会作为一个整体模块,其他模块的边缘虚框颜色会置灰,示意作为一个整体进行全局分析,左侧Region可以展开/汇总,也可以单独选中某个Region模块进行分析(这时其他Region的流量线…

加密与安全_探索签名算法

文章目录 概述应用常用数字签名算法CodeDSA签名ECDSA签名小结 概述 在非对称加密中,使用私钥加密、公钥解密确实是可行的,而且有着特定的应用场景,即数字签名。 数字签名的主要目的是确保消息的完整性、真实性和不可否认性。通过使用私钥加…

云服务器购买教程

在购买云服务器之前,建议仔细评估自身需求和预算,并与多个云服务提供商进行比较,以确保选择到最适合的解决方案。购买云服务器的具体步骤可能因所选云服务提供商而异。以下以实际操作的方式介绍如何购买一款云服务器。 云服务器购买常见问题…

Linux进程——信号详解(上)

文章目录 信号入门生活角度的信号技术应用角度的信号用kill -l命令可以察看系统定义的信号列表信号处理常见方式概述 产生信号通过键盘进行信号的产生,ctrlc向前台发送2号信号通过系统调用异常软件条件 信号入门 生活角度的信号 你在网上买了很多件商品&#xff0…

前端面试练习24.3.2-3.3

HTMLCSS部分 一.说一说HTML的语义化 在我看来,它的语义化其实是为了便于机器来看的,当然,程序员在使用语义化标签时也可以使得代码更加易读,对于用户来说,这样有利于构建良好的网页结构,可以在优化用户体…

vue3项目中如何一个vue组件中的一个div里面的图片铺满整个屏幕样式如何设置

在Vue 3项目中,要使一个div内的图片铺满整个屏幕,你需要确保几个关键点:div元素和图片元素的样式设置正确,以及确保它们能够覆盖整个视口(viewport)。以下是一个简单的步骤和代码示例,帮助你实现…

【JavaSE】实用类——String、日期等

目录 String类常用方法String类的equals()方法String中equals()源码展示 “”和equals()有什么区别呢? StringBuffer类常用构造方法常用方法代码示例 面试题:String类、StringBuffer类和StringBuilder类的区别?日期类Date类Calendar类代码示例…

【vue3】命令式组件封装,message封装示例;(函数式组件?)

仅做代码示例;当然改进的地方还是不少的,仅作为该类组件封装方式的初步启发; 理想大成肯定是想要像 饿了么 这些组件库一样。 有的人叫这函数式组件,有的人叫这命令式组件,我个人还是偏向于命令式组件的称呼。因为以vu…

Django配置静态文件

Django配置静态文件 目录 Django配置静态文件静态文件配置调用方法 一般我们将html文件都放在默认templates目录下 静态文件放在static目录下 static目录大致分为 js文件夹css文件夹img文件夹plugins文件夹 在浏览器输入url能够看到对应的静态资源,如果看不到说明…

支持向量机算法(带你了解原理 实践)

引言 在机器学习和数据科学中,分类问题是一种常见的任务。支持向量机(Support Vector Machine, SVM)是一种广泛使用的分类算法,因其出色的性能和高效的计算效率而受到广泛关注。本文将深入探讨支持向量机算法的原理、特点、应用&…

13. Springboot集成Protobuf

目录 1、前言 2、Protobuf简介 2.1、核心思想 2.2、Protobuf是如何工作的? 2.3、如何使用 Protoc 生成代码? 3、Springboot集成 3.1、引入依赖 3.2、定义Proto文件 3.3、Protobuf生成Java代码 3.4、配置Protobuf的序列化和反序列化 3.5、定义…

【中英对照】【自译】【精华】麻省理工学院MIT技术双月刊(Bimonthly MIT Technology Review)2024年3/4月刊内容概览

一、说明 Notation 仅供学习、参考,请勿用于商业行为。 二、本期封面、封底 Covers 本期杂志购于新加坡樟宜机场Changi Airport Singapore,售价为20.50新元。 本期仍然关注伦敦的AI大会。(笔者十分想去,在伦敦和MIT校园均设有会…

IDEA的安装教程

1、下载软件安装包 官网下载:https://www.jetbrains.com/idea/ 2、开始安装IDEA软件 解压安装包,找到对应的idea可执行文件,右键选择以管理员身份运行,执行安装操作 3、运行之后,点击NEXT,进入下一步 4、…

GraphPad Prism 10: 你的数据,我们的魔法 mac/win版

GraphPad Prism 10是GraphPad Software公司推出的一款功能强大的数据分析和可视化软件。它集数据整理、统计分析、图表制作和报告生成于一体,为科研工作者、学者和数据分析师提供了一个高效、便捷的工作平台。 GraphPad Prism 10软件获取 Prism 10拥有丰富的图表类…

2023义乌最全“电商+跨境+直播”数据总结篇章!

值得收藏|2023义乌最全“电商跨境直播”数据总结篇章! 麦琪享资讯2024-01-20 14:28浙江 新年伊始,央视就把镜头对准了义乌电商,以电商的蓬勃之势展现这座国际商城的开放与活力。 过去的一年 义乌电商量质齐升 实力出圈 跑出了…