基于GEE的Landsat 7ETM+条带填补

news2024/11/10 12:10:59

项目简介

该项目使用Google Earth Engine (GEE)平台,对Landsat 5和Landsat 7卫星影像进行预处理与影像填补操作。主要功能包括影像的选取、波段处理、缺失影像的填补以及最终影像的导出。代码中的核心功能是通过空间回归方法对Landsat 7和Landsat 5影像进行时序配准与插值填补。

主要步骤

1. 定义感兴趣区域 (ROI):
    - 使用四个坐标点绘制矩形多边形,确定需要处理的地理区域。

2. 选择影像数据集:
    - 使用Landsat 5和Landsat 7数据集 (`ee.ImageCollection`),分别选择时间范围为2010年5月1日至2010年5月31日之间的影像。

3. 影像预处理:
    - 定义影像预处理函数,将选择的波段进行裁剪、波段重命名,并转换像元值范围,以便与其他数据进行处理和分析。

4. 影像填补:
    - 使用空间回归方法,计算两个影像集之间的关系,通过滑动窗口对像元进行回归分析并填补缺失区域。主要步骤包括:
      - 选择匹配的填补影像;
      - 计算回归模型,生成比例和偏移量;
      - 处理填补失败的情况,使用默认值填补。

5. 显示与导出结果:
    - 显示原始Landsat 7、Landsat 5影像和填补后的Landsat 5影像,并将结果导出为影像文件,便于后续分析。

核心代码说明

- 预处理函数 `preprocessImage`:
  该函数处理Landsat影像集中的波段并应用裁剪区域。通过乘以系数与增加偏移量将影像值缩放至0-1范围。

- 影像填补函数 `GapFill`:
  这是实现影像插值填补的主要函数,输入Landsat 7影像集和Landsat 5影像集,并对它们进行空间回归分析,最终生成无缺失的填补影像。

- 导出函数 `Export.image.toDrive`:
  使用GEE的导出功能将填补后的影像导出为文件,以便本地存储和处理。

如何运行

1. 打开Google Earth Engine的代码编辑器,并将上述代码粘贴到编辑器中。
2. 修改`startDate`和`endDate`参数以更改需要处理的影像时间范围。
3. 运行代码,预处理并显示影像,同时将填补后的影像导出为本地文件。

var roi = 
    /* color: #b50000 */
    /* shown: false */
    /* displayProperties: [
      {
        "type": "rectangle"
      }
    ] */
    ee.Geometry.Polygon(
        [[[117.29699355756334, 40.12436832412577],
          [117.29699355756334, 39.890323465395774],
          [117.65610915814928, 39.890323465395774],
          [117.65610915814928, 40.12436832412577]]], null, false);

// 定义数据集
var landsat7 = ee.ImageCollection('LANDSAT/LE07/C02/T1_L2');
var landsat5 = ee.ImageCollection('LANDSAT/LT05/C02/T1_L2');
var landsat8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2');

// 定义波段
var bands = ['red', 'green', 'blue', 'nir', 'swir'];
var percentile = 30;
var imageParams = {min: 0.0, max: 0.3, bands: ['red', 'green', 'blue']};

// 输入时间范围
var startDate = '2010-05-01';
var endDate = '2010-05-31';

// 影像预处理函数
var preprocessImage = function(image) {
  var percentileImage = image
    .select(['SR_B3', 'SR_B2', 'SR_B1', 'SR_B4', 'SR_B5'])
    .multiply(2.75e-05).add(-0.2)
    .clip(roi)
    .rename(bands);  // 重命名波段,使其保持与原始影像一致
  return percentileImage
  //.updateMask(image.select(0).mask().focal_min(90, 'circle', 'meters'))
  .copyProperties(image, ['system:time_start']);  // 复制时间等属性;
};

// 选择 Landsat 7 影像
var landsat7Collection = landsat7
  //.select(['B3', 'B2', 'B1', 'B4', 'B5'], bands)
  .filterDate(startDate, endDate)
  .map(preprocessImage);
print('landsat7Collection:',landsat7Collection.limit(10))


// 选择 Landsat 5 影像
var landsat5Collection = landsat5
  //.select(['SR_B3', 'SR_B2', 'SR_B1', 'SR_B4', 'SR_B5'], bands)
  .filterDate(startDate, endDate)
  //.reduce(ee.Reducer.percentile([percentile]))
  .map(preprocessImage);
print('landsat5Collection:',landsat5Collection.limit(10))

/*// 选择 Landsat 8 影像
var landsat8Collection = landsat8
  .select(['SR_B4', 'SR_B3', 'SR_B2', 'SR_B5', 'SR_B6'], bands)
  .filterBounds(roi)
  .filterDate(startDate, endDate)
  .reduce(ee.Reducer.percentile([percentile]))
  .rename(bands)
  .map(preprocessImage);
*/
// 填补函数
var GapFill = function(srcCollection, fillCollection, kernelSize) {
  var MIN_SCALE = 1/3;
  var MAX_SCALE = 3;
  var MIN_NEIGHBORS = 144;
  var kernel = ee.Kernel.square(kernelSize * 30, "meters", false);

  var fillFunction = function(image) {
    var date = ee.Date(image.get('system:time_start'));

    // 筛选匹配的填补影像
    var fillImage = fillCollection
      .filterBounds(roi)
      .filterDate(date.advance(-10, 'day'), date.advance(10, 'day'))
      .median()
      .select(bands);

    var srcImage = srcCollection
      .filterBounds(roi)
      .filterDate(date.advance(-10, 'day'), date.advance(10, 'day'))
      .median()
      .select(bands);
      
    // 计算共同掩膜
    var commonMask = srcImage.mask().and(fillImage.mask());
    var fillMasked = fillImage.updateMask(commonMask);
    var srcMasked = srcImage.updateMask(commonMask);

    // 进行回归计算
    var regression = fillMasked.addBands(srcMasked);
    regression = regression.select(regression.bandNames().sort());
    var fit = regression.reduceNeighborhood(ee.Reducer.linearFit().forEach(srcImage.bandNames()), kernel, null, false);
    var offset = fit.select(".*_offset");
    var scale = fit.select(".*_scale");

    // 计算二级比例因子
    var reducer = ee.Reducer.mean().combine(ee.Reducer.stdDev(), null, true);
    var srcStats = srcImage.reduceNeighborhood(reducer, kernel, null, false);
    var fillStats = fillImage.reduceNeighborhood(reducer, kernel, null, false);
    var scaleFactor = srcStats.select(".*stdDev").divide(fillStats.select(".*stdDev"));
    var offsetFactor = srcStats.select(".*mean").subtract(fillStats.select(".*mean").multiply(scaleFactor));
    var invalidScale = scale.lt(MIN_SCALE).or(scale.gt(MAX_SCALE));
    scale = scale.where(invalidScale, scaleFactor);
    offset = offset.where(invalidScale, offsetFactor);

    // 处理所有其他方法都失败的情况
    var fallbackScale = scale.lt(MIN_SCALE).or(scale.gt(MAX_SCALE));
    scale = scale.where(fallbackScale, 1);
    offset = offset.where(fallbackScale, srcStats.select(".*mean").subtract(fillStats.select(".*mean")));
    var neighborCount = commonMask.reduceNeighborhood(ee.Reducer.count(), kernel, null, true, "boxcar");
    var scaledImage = fillImage.multiply(scale).add(offset).updateMask(neighborCount.gte(MIN_NEIGHBORS));

    return image.unmask(scaledImage, true).copyProperties(image, ['system:time_start']);
  };

  return srcCollection.map(fillFunction);
};

// 应用填补函数
var filledLandsat5 = GapFill(landsat7Collection, landsat5Collection, 10);
print('filledLandsat5:',filledLandsat5.limit(10))

//var filledLandsat8 = GapFill(landsat7Collection, landsat8Collection, 10);

// 组合填补结果
//var resultCollection = ee.ImageCollection.fromImages([filledLandsat5, filledLandsat8]);
//var finalResult = resultCollection.mosaic();

// 显示结果
Map.centerObject(roi, 12); // 调整地图中心和缩放级别
Map.addLayer(landsat7Collection.mean(), imageParams, "Landsat 7");
Map.addLayer(landsat5Collection.mean(), imageParams, "Landsat 5");
Map.addLayer(filledLandsat5.mean(), imageParams, "Landsat 5 Filled");
//Map.addLayer(filledLandsat8, imageParams, "Landsat 8 Filled");
//Map.addLayer(finalResult, imageParams, "Combined Filled");

// 导出处理后的影像
Export.image.toDrive({
  image: filledLandsat5.mean(), // 选择Landsat 5填补结果进行导出
  description: 'landsat7_filled_landsat5',
  folder: 'landsat7',
  scale: 30,
});

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

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

相关文章

Oracle 19c异常恢复—ORA-01209/ORA-65088---惜分飞

由于raid卡bug故障,导致文件系统异常,从而使得数据库无法正常启动,客户找到我之前已经让多人分析,均未恢复成功,查看alert日志,发现他们恢复的时候尝试resetlogs库,然后报ORA-600 kcbzib_kcrsds_1错误 2024-09-15T17:07:32.55321508:00 alter database open resetlogs 2024-09-…

YOLOv9改进策略【损失函数篇】| Shape-IoU:考虑边界框形状和尺度的更精确度量

一、本文介绍 本文记录的是改进YOLOv9的损失函数,将其替换成Shape-IoU。现有边界框回归方法通常考虑GT(Ground Truth)框与预测框之间的几何关系,通过边界框的相对位置和形状计算损失,但忽略了边界框本身的形状和尺度等…

复习:指针

目录 指针变量 指针变量的内容 引入 指针变量的值 间接访问操作符 概念 运算 基本运算 指针/-整数 指针-指针 引入 算术运算和间接访问操作 自增自减运算符 前置 后置 应用 指针数组 语法 指针数组 数组指针 多级指针 引入 语法 章节问题 指针变量 指针…

Java数据结构(十一)——归并排序、计数排序

文章目录 归并排序算法介绍代码实现非递归实现复杂度和稳定性 计数排序算法介绍代码实现复杂度和稳定性 归并排序 算法介绍 归并排序是一种分而治之的排序算法。基本思想是: 将一个数组分成两半,对每半部分递归地应用归并排序先进行分解,然…

数据权限的设计与实现系列9——前端筛选器组件Everright-filter集成框架开发2

功能实现 ‍ 规则转换为 SQL 片段‍ 规则解析 首先我们来构造一个典型的规则,包括两个条件组,每个组由两个条件组成,由且与或两种逻辑关系,如下图: 然后看看生成的规则,如下: {"filt…

spring中对于servlet API的封装---springWeb

目录 一.springweb概述 二.springweb的特点 三.springweb的运行流程 四.springweb组件 五.springweb的搭建 1.导包 2.配置 DispatcherServlet 3.开启 springweb 注解 4.处理器的搭建 六.springweb注解 七.springweb拦截器 1.拦截器概述 2.拦截器的实现 (1)添加 servelt api 依赖…

开源 AI 智能名片链动 2+1 模式 O2O 商城小程序在社群活动中的应用与时机选择

摘要:本文探讨了开源 AI 智能名片链动 21 模式 O2O 商城小程序在社群经济中的重要性,着重分析了如何借助该小程序适时举办大型活动以维持和引爆社群活跃度。通过对活动时机选择的研究,强调了针对社群用户量身定制活动时机的必要性&#xff0c…

基于python+django+vue的外卖管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的外…

C/C++笔记

C/CPP笔记 杂记 struct msg_train和typedef struct msg_train 大小不一样 cstdio和stdio #include <stdio.h>int main() {printf("Hello, World!\n");return 0; } #include <cstdio>int main() {std::printf("Hello, World!\n");return 0; } 命…

20个Python入门基础语法要点

今天&#xff0c;我们将聚焦于Python的20个基础语法要点&#xff0c;让你的编程之旅更加顺畅。 第一部分&#xff1a;环境搭建与基本概念 1. Hello, World! 你的第一行代码&#xff1a;这是编程旅程的传统起点。 这行代码告诉Python显示文本&#xff0c;print是关键函数&…

常耀斌:AI赋能企业数字化转型(清华社发行)

新书地址&#xff1a; 清华出版社&#xff1a;清华大学出版社-图书详情-《AI赋能企业数字化转型》 京东&#xff1a;《AI赋能企业数字化转型 常耀斌 清华大学出版社 9787302669081》【摘要 书评 试读】- 京东图书 内容简介&#xff1a; 在数字经济时代&#xff0c;企业发…

曲线图如何绘制美观,曲线图10种美化方法

曲线图是比较常用的图形&#xff0c;本文以二维曲线图为例&#xff0c;展示曲线的图的不同美化方法&#xff0c;如图1所示&#xff0c;是一个标准的曲线图&#xff0c;横坐标为x&#xff0c;纵坐标为y, 图1 标准曲线图 调整方法1 首先可以通过改变线的颜色&#xff0c;不同…

从零开始学PostgreSQL (十四):高级功能

目录 1. 简介 2. 视图 3. 外键 4. 事务 5. 窗口函数 6. 继承 7. 结论 简介 PostgreSQL是一个强大且开源的关系型数据库管理系统&#xff0c;以其稳定性、功能丰富性和对SQL标准的广泛支持而闻名。它不仅提供了传统的关系型数据库功能&#xff0c;如事务处理、外键约束和视图&am…

递归基础训练-路径总和

路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 我们可以把之前的…

【图虫创意-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

R语言统计分析——散点图2(散点图矩阵、高密度散点图)

参考资料&#xff1a;R语言实战【第2版】 1、散点图矩阵 pairs()函数可以创建基础的散点图矩阵。下面代码用于绘制一个散点图矩阵&#xff0c;包含mtcars数据集中的mpg、disp、drat和wt四个变量&#xff1a; pairs(~mpgdispdratwt,datamtcars,main"Basic Scatter Plot M…

输煤传送带异物识别检测数据集 yolo数据集 2400张

输煤传送带异物识别检测数据集 yolo数据集 2400张 输煤传送带异物识别检测数据集介绍 数据集名称 输煤传送带异物识别检测数据集&#xff08;Conveyor Belt Foreign Object Detection Dataset&#xff09; 数据集概述 该数据集专为输煤传送带上的异物识别检测设计&#xff0…

Unity携程Coroutine用法

一.携程概述 官方的解释是&#xff0c;携程允许你可以在多个帧中执行任务。在Unity中&#xff0c;携程是一个可以暂停并在后续帧中从暂停处继续执行的方法。 二.携程写法 下面示例使用携程和Update打印前5帧的时间间隔&#xff0c;展示了携程的基础写法 using System.Colle…

vmware + ubuntu + 初始配置(超级用户权限、vim安装、ssh登陆、共享文件夹、git)

1 VMware Ubuntu下载与安装 下载与安装 2 使用超级用户权限 &#xff08;1&#xff09;执行命令&#xff1a;sudo passwd root 然后在弹出的密码中输入密码即可&#xff0c;具体如下&#xff1a; 第一个密码是当前用户密码 后面两个是root用户密码 //推荐使用一个密码 3 vi…

SEMIDRIVE X9E Flash 调试要点

一、前言 客户采用芯驰 X9E 平台做的 T-BOX 产品&#xff0c;因为客户选用的 Flash 型号不在 SemiDrive_Memory 支持列表里面&#xff0c;出现机器能烧录不能启动的问题。接下来我们对这个问题进行调试。 二、SEMIDRIVE X9E Flash 调试要点 ① 客户的板子 Flash 型号为 GD25LQ…