GEE:对Sentinel-2遥感影像进行处理,水体提取与可视化

news2025/1/15 16:51:00

作者:CSDN @ _养乐多_

本文介绍了通过Google Earth Engine平台,并使用哨兵数据提取水体掩膜的方法和代码。通过裁剪和去除云等处理步骤,最终得到具有水体掩膜的影像,并进行可视化和导出。这种方法基于归一化水体指数(NDWI)和OTSU阈值计算技术,无需复杂的图像处理算法,适用于快速获取水体信息的需求。

图1 彩色合成
图2 水体掩膜

文章目录

      • 一、代码详解
      • 二、代码链接


一、代码详解

var roi = table          
Map.centerObject(roi,10)

// 可视化参数
var palette = ['FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718',
               '74A901', '66A000', '529400', '3E8601', '207401', '056201',
               '004C00', '023B01', '012E01', '011D01', '011301'];
               
//可视化参数,按843波段合成                
var rgbVis = {
  min: 0.0,
  max: 0.35,
  bands: ['B8', 'B4', 'B3'],
};
               
//按矢量边界裁剪
function roiClip(image){
  return image.clip(roi)
}

//S2_SR去云
function remove_cloud(image) {
  var qa = image.select('QA60')
  var cloudBitMask = 1 << 10;
  var cirrusBitMask = 1 << 11;
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0).and(qa.bitwiseAnd(cirrusBitMask).eq(0))
  return image.updateMask(mask).divide(10000).select("B.*").copyProperties(image, ["system:time_start"])
}

//时间范围
var startDate = ee.Date('2020-01-01');
var endDate = ee.Date('2020-02-01');

//数据集选择
var S2 = ee.ImageCollection("COPERNICUS/S2_SR")
           .filterDate(startDate, endDate)
           .select('B3', 'B4', 'B8', 'B11', 'QA60')
           .filterBounds(roi)
           .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 5))
           .map(remove_cloud)
           .map(roiClip)


//运行同一天影像
var newImgS2 = S2.max();
print(newImgS2)
Map.addLayer(newImgS2, rgbVis, 'newImg_RGB'); 

//计算NDWI
function calNDWI(image)
{
  var NDWI = image.normalizedDifference(['B3', 'B11']).rename('NDWI');
  NDWI = NDWI.updateMask(NDWI.gt(-1).and(NDWI.lt(1)));
  return image.addBands(NDWI);
}

//OTSU计算阈值
function otsu(histogram) {
  var counts = ee.Array(ee.Dictionary(histogram).get('histogram'));
  var means = ee.Array(ee.Dictionary(histogram).get('bucketMeans'));
  var size = means.length().get([0]);
  var total = counts.reduce(ee.Reducer.sum(), [0]).get([0]);
  var sum = means.multiply(counts).reduce(ee.Reducer.sum(), [0]).get([0]);
  var mean = sum.divide(total);
  var indices = ee.List.sequence(1, size);
  var bss = indices.map(function(i) {
    var aCounts = counts.slice(0, 0, i);
    var aCount = aCounts.reduce(ee.Reducer.sum(), [0]).get([0]);
    var aMeans = means.slice(0, 0, i);
    var aMean = aMeans.multiply(aCounts)
        .reduce(ee.Reducer.sum(), [0]).get([0])
        .divide(aCount);
    var bCount = total.subtract(aCount);
    var bMean = sum.subtract(aCount.multiply(aMean)).divide(bCount);
    return aCount.multiply(aMean.subtract(mean).pow(2)).add(
           bCount.multiply(bMean.subtract(mean).pow(2)));
  });
  return means.sort(bss).get([-1]);
}

//计算水体掩膜
function calWaterMask(image){
  var MNDWI_S2 = image.select("NDWI");
  var histogram = MNDWI_S2.reduceRegion({
    reducer: ee.Reducer.histogram(), 
    geometry: roi, 
    scale: 30,
    maxPixels: 1e13,
    tileScale: 8
  });
  var threshold_S2 = otsu(histogram.get("NDWI"));
  var mask = MNDWI_S2.gte(threshold_S2);
  return image.addBands(mask.rename('mask'));
}

//运行水体掩模函数
newImgS2 = calNDWI(newImgS2)
newImgS2 = calWaterMask(newImgS2).select('mask')
print(newImgS2)
Map.addLayer(newImgS2, {min:0, max:1, palette:['#DDDDDD', '#0099FF']}, 'S2_Water_body_mask');

//下载非水体概率影像
Export.image.toDrive({
  image:newImgS2,
  description: 'S2_water_mask',
  scale:30,
  region:roi,
  fileFormat: 'GeoTIFF',
  maxPixels:1e13,
});

这段代码的目的是对Sentinel-2遥感影像进行处理,提取水体掩膜,并将结果可视化和导出。

  • 首先,定义了一个变量roi,表示感兴趣区域(Region of Interest),这是一个表格(table)对象。然后使用Map.centerObject(roi,10)将该区域设置为地图的中心,并指定缩放级别为10。

  • 接下来,定义了一个调色板(palette)数组,用于可视化图像时的颜色映射。

  • 然后,定义了一个可视化参数rgbVis,设置了最小值(min)和最大值(max),以及要显示的波段(bands)。

  • 之后,定义了一个函数roiClip,用于将图像按照矢量边界进行裁剪。

  • 接着是一个函数remove_cloud,用于去除图像中的云和雾。函数内部使用了位掩码(bitmask)的方式来选择需要保留的像素,然后将图像的像素值除以10000并选择特定波段,最后将处理后的图像的时间属性复制到结果中。

  • 然后定义了起始日期和结束日期,用于选择要处理的影像时间范围。

  • 接下来,使用ee.ImageCollection函数选择了名为"COPERNICUS/S2_SR"的Sentinel-2影像集合,并通过一系列操作对影像进行筛选、裁剪和去除云,最后将结果映射到ROI区域,并存储在变量S2中。

  • 之后,使用S2.max()函数选取ROI区域内同一天的影像,并将结果存储在变量newImgS2中。

  • 接着,定义了一个名为calNDWI的函数,用于计算归一化水体指数(NDWI)。

  • 然后,定义了一个名为otsu的函数,用于计算阈值,该阈值用于将图像的像素分为水体和非水体。

  • 接下来,定义了一个名为calWaterMask的函数,该函数通过计算NDWI的直方图,并使用OTSU方法计算阈值来生成水体掩膜。

  • 然后,分别调用calNDWI和calWaterMask函数对newImgS2进行处理,并将结果可视化。

  • 最后,使用Export.image.toDrive函数将非水体概率影像导出到Google Drive中。

二、代码链接

https://code.earthengine.google.com/f145e92abf2d0196aba61655745bad9c?noload=true

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

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

相关文章

MIT 6.S081 (BOOK-RISCV-REV1)教材第一章内容

MIT 6.S081 教材第一章内容 引言第一章 操作系统接口进程和内存I/O和文件描述符管道文件系统真实世界 引言 MIT 6.S081 2020 操作系统 本文为MIT 6.S081课程第一章教材内容翻译加整理。 本课程前置知识主要涉及: C语言(建议阅读C程序语言设计—第二版)RISK-V汇编推荐阅读: 程…

JavaScript 数据透视表 DHTMLX Pivot Crack

DHTMLX Pivot JavaScript 数据透视表 - 强大的数据汇总和报告 使用我们的高速 JavaScript/HTML5 Pivot 组件可视化您的复杂数据&#xff0c;从而提高您的商业智能。 它可以帮助您以方便的方式汇总大型数据集。 主要特征 纯 JavaScript 库&#xff0c;可轻松与任何服务器端集成…

Linux安装Mysql8,过程详细(离线安装mysql)

因公司需要&#xff0c;需要在服务器上安装一个mysql&#xff0c;但是机器没有外网权限&#xff0c;所以记录一下安装过程&#xff0c;供大家参考。 官网下载安装包 地址&#xff1a;https://dev.mysql.com/downloads/ 如图示&#xff0c;选择MySQL Community Server 如图示&a…

git新手将网页设计代码提交到github上

以下是将代码提交到Github上的一些步骤。如果中途遇到问题或不会的需要我帮忙&#xff0c;可以文章底部联系我。 1. 创建Github账户 首先&#xff0c;您需要在Github上注册一个账户。 如果您已经有账户了&#xff0c;请跳过这一步。 2. 创建一个新的repository 在您的Githu…

格式化数字的实用命令:numfmt

在 Linux 系统中&#xff0c;numfmt 是一个用于格式化数字的实用工具。它可以将数字转换为不同的表示方式&#xff0c;如十进制、二进制、字节单位等。本文将详细介绍 numfmt 命令的使用方法&#xff0c;并提供一些适合初学者的示例。 Numfmt 命令语法 numfmt 命令的基本语法如…

搭建stm32电机控制代码框架(四)——单路PWM生成

STM32中单路PWM的生成一般是基于某一个通用定时器&#xff0c;本次小实验选取TIM2通用定时器&#xff0c;选择PA5作为PWM端口输出。配置步骤如下&#xff1a; 第一步&#xff1a;配置外部晶振与基本的时钟&#xff0c;如下图所示。 &#xff08;1&#xff09;选择外部晶振 &a…

关于java k8s容器环境中的jvm配置与优化

1. 前言 环境 版本 备注 k8s v1.22 配置cpu/mem limit、健康/就绪检查 openjdk 8 openjdk version "1.8.0_342" k8s容器化&#xff08;docker&#xff09;环境更好的解决了 java app 运行环境的封装问题。但存在着一些限制&#xff0c;比如 Java 并不能发现…

流马平台连接数据库

新增数据库配置 在环境管理处对于环境下新增数据库配置 编辑SQL 在用例管理-步骤编辑-逻辑控件处添加前置SQL&#xff0c;编辑SQL 选择数据库名称&#xff0c;查询语句&#xff0c;填写要保存的变量名&#xff0c;并在下方填写查询语句 示例从user表中取出username和passwo…

Semi-supervised Learning(半监督学习)

目录 Introduction Why semi-supervised learning help&#xff1f; Semi-supervised Learning for Generative Model Supervised Generative Model Semi-supervised Generative Model Low-density Separation Assumption Self Training Entropy-based Regularization(基…

docker启动MYSQL8并挂载数据目录

1.创建需要docker挂载的数据目录 mkdir -p /datah/mydata/mysql/conf mkdir -p /datah/mydata/mysql/data mkdir -p /datah/mydata/mysql/log mkdir -p /datah/mydata/mysql/mysql-files 2. 在目录下面 /datah/mydata/mysql/conf 创建配置文件 my.cnf [client] default-charact…

VH6501使用

目录 1.VH6501接口介绍 2.使用场景 2.1当VH6501作为硬件接口卡作通信/监测使用时&#xff0c;使用CH1的任意接口与总线连接即可 2.2针对单节点干扰时&#xff0c;使用CH1的任意接口与被测节点连接即可 2.3针对多节点干扰时&#xff0c;需要通过CH1的两个接口将VH6501串联到…

C++ ---- 模板

目录 泛型编程 函数模板 函数模板语法 模板使用 函数模板原理 函数模板的实例化 隐式实例化 显示实例化 模板参数的匹配原则 类模板 类模板的定义语法 类模板的实例化 非类型模板参数 类模板的特化 全特化 半特化&#xff08;部分特化&#xff09; 两个参数偏…

排查Javascript内存泄漏案例(一)

Chrome DevTools里的Performance面板和Memory面板可以用来定位内存问题。 如何判断应用发生内存泄漏&#xff1f; 为了证明螃蟹的听觉在腿上&#xff0c;一个专家捉了只螃蟹并冲它大吼&#xff0c;螃蟹很快就跑了。然后捉回来再冲它吼&#xff0c;螃蟹又跑了。最后专家把螃蟹的…

浅谈 ChatGPT —— 现代巴别塔

theme: nico 一、用 ChatGPT 一搜就到你这了 ChatGPT 在去年 11 月发布以后&#xff0c;上线 5 天后就有了 100 万用户&#xff0c;上线两个月后已有上亿用户&#xff0c;可谓一炮而红。起初我对 ChatGPT 是没有什么感知的&#xff0c;我单纯认为人工智能还没有发展到完全超越人…

数字经济等相关概念与官方文档

一、数字经济 数字经济&#xff0c;作为一个内涵比较宽泛的概念&#xff0c;凡是直接或间接利用数据来引导资源发挥作用&#xff0c;推动生产力发展的经济形态都可以纳入其范畴。在技术层面&#xff0c;包括大数据、云计算、物联网、区块链、人工智能、5G通信等新兴技术。在应…

美食菜谱类APP小程序开发功能有哪些?

想要开发出一款靠谱好用的美食菜谱APP小程序系统&#xff0c;需要具备哪些基本功能呢&#xff1f; 1、视频教学。对于美食的教学教学方法最直接受用的就是视频教学&#xff0c;用户浏览起来更加方便而且可以直接跟着视频操作&#xff0c;效果更佳。用户也可以自己拍摄制…

JVM垃圾回收篇之相关概念和算法

垃圾回收相关概念 什么是垃圾 垃圾就是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收掉的垃圾,如果不及时进行清理,越积越多就会导致内存溢出. 为什么需要GC 不进行回收,早晚会导致内存溢出,Java自动管理垃圾回收,不需要开发人员手动干预,这就有可能导致开…

【记录】OLAP和OLTP

下面为提炼的重点内容&#xff0c;全部内容参考&#xff1a;OLAP和OLTP OLAP和OLTP的不同设计要求 对于OLTP系统和OLAP系统有哪些不同的要求&#xff1f;要说清楚这个&#xff0c;首先需要分析一下这两个系统的关键特征。 对于OLTP系统来说&#xff0c;最重要的事情是&#…

LIS系统字典模块功能

字典管理模块&#xff1a; 系统参数功能简介&#xff1a;集中设置系统使用过程中所需的参数值&#xff0c;一般由开发或实施人员进行设置。 标本管理功能简介&#xff1a;标本管理是对检验业务中涉及的检验标本类型进行初始化设置&#xff0c; …

Spring Cloud Zuul 是什么?如何使用它来实现 API 网关?

Spring Cloud Zuul 是什么&#xff1f;如何使用它来实现 API 网关&#xff1f; 在微服务架构中&#xff0c;服务之间的通信变得非常频繁和复杂。为了简化服务之间的通信和管理&#xff0c;很多企业都采用了 API 网关的架构模式。API 网关可以帮助我们统一处理服务的入口、路由…