基于 GEE 利用插值方法填补缺失影像

目录

[1 完整代码](#1 完整代码)

[2 运行结果](#2 运行结果)


利用GEE合成NDVI时,如果研究区较大,一个月的影像覆盖不了整个研究区,就会有缺失的地方,还有就是去云之后,有云量的地区变成空值。

所以今天来用一种插值的方法来填补缺失的影像,以NDVI为例,主要实现原理其实就是用前后两个月的NDVI的均值进行填补。

1 完整代码

javascript 复制代码
var roi = table;
Map.centerObject(roi,7)
var styling = {color:"red",fillColor:"00000000"};
Map.addLayer(roi.style(styling),{},"geometry")
var img_normalize = function(img){ 
  var minMax = img.reduceRegion({ 
    reducer:ee.Reducer.minMax(), 
    geometry: roi, 
    scale: 30, 
    maxPixels: 10e13, 
    tileScale: 16 }) 
var year = img.get('year') 
var normalize = ee.ImageCollection.fromImages( 
  img.bandNames().map(function(name){ 
    name = ee.String(name); 
    var band = img.select(name); 
    return band.unitScale(ee.Number(minMax.get(name.cat('_min'))), ee.Number(minMax.get(name.cat('_max')))); }) 
        ).toBands().rename(img.bandNames()); 
        return normalize;
  
}
function maskL457sr(image) {//l57去云
  // Bit 0 - Fill
  // Bit 1 - Dilated Cloud
  // Bit 2 - Unused
  // Bit 3 - Cloud
  // Bit 4 - Cloud Shadow
  var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0);
  var saturationMask = image.select('QA_RADSAT').eq(0);

  // Apply the scaling factors to the appropriate bands.
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBand = image.select('ST_B6').multiply(0.00341802).add(149.0);

  // Replace the original bands with the scaled ones and apply the masks.
  return image.addBands(opticalBands, null, true)
      .addBands(thermalBand, null, true)
      .updateMask(qaMask)
      .updateMask(saturationMask);
}
/*function maskL8sr(image) {
  // Bit 0 - Fill
  // Bit 1 - Dilated Cloud
  // Bit 2 - Cirrus
  // Bit 3 - Cloud
  // Bit 4 - Cloud Shadow
  var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0);
  var saturationMask = image.select('QA_RADSAT').eq(0);

  // Apply the scaling factors to the appropriate bands.
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);

  // Replace the original bands with the scaled ones and apply the masks.
  return image.addBands(opticalBands, null, true)
      .addBands(thermalBands, null, true)
      .updateMask(qaMask)
      .updateMask(saturationMask);
}*/
var imageCollection = ee.ImageCollection('LANDSAT/LT05/C02/T1_L2').filterBounds(roi);//1111111
var monthCount = ee.List.sequence(0, 11);



// 通过图像收集,生成每月NDVI中值图像
var composites = ee.ImageCollection.fromImages(monthCount.map(function(m) {
  var startMonth = 1; // 从1月开始
  var startYear = ee.Number(2000); // 1993-1
  
  var month = ee.Date.fromYMD(startYear, startMonth, 1).advance(m,'month').get('month');
  var year = ee.Date.fromYMD(startYear, startMonth, 1).advance(m,'month').get('year')
  
  // 按年筛选,然后按月筛选
  var filtered = imageCollection.filter(ee.Filter.calendarRange({
    start: year.subtract(1), // 过去两年的平均数
    end: year,
    field: 'year'
  })).filter(ee.Filter.calendarRange({
    start: month,
    field: 'month'
  }));
  // mask for clouds and then take the median///
  var composite = filtered.map(maskL457sr).median().clip(roi);
  return composite.normalizedDifference(['SR_B4', 'SR_B3']).rename('NDVI')
      .set('month', ee.Date.fromYMD(startYear, startMonth, 1).advance(m,'month'))
      .set('system:time_start', ee.Date.fromYMD(startYear, startMonth, 1).advance(m,'month').millis());
}));
print(composites);
var stackCollection = function(collection) {
  // 创建一个初始图像.
  var first = ee.Image(collection.first()).select([]);

  // Write a function that appends a band to an image.
  var appendBands = function(image, previous) {
    return ee.Image(previous).addBands(image);
  };
  return ee.Image(collection.iterate(appendBands, first));
};
var compos = stackCollection(composites);
print('插值前', compos);


// 用上个月和下个月的平均值替换被遮挡的像素 
var replacedVals = composites.map(function(image){
  var currentDate = ee.Date(image.get('system:time_start'));
  var meanImage = composites.filterDate(
                currentDate.advance(-2,'month'), currentDate.advance(2, 'month')).mean();//33333333333333333333333max min median
  // 替换所有被屏蔽的值
  return meanImage.where(image, image);
});

// 将ImageCollection堆叠成一个多波段的光栅,以便下载
var stackCollection = function(collection) {
  // 创建一个初始图像.
  var first = ee.Image(collection.first()).select([]);

  // Write a function that appends a band to an image.
  var appendBands = function(image, previous) {
    return ee.Image(previous).addBands(image);
  };
  return ee.Image(collection.iterate(appendBands, first));
};
var stacked = stackCollection(replacedVals);
print('stacked image', stacked);
var Vis = {

  min: -1,

  max: 1.0,

  palette: [

    'FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718', '74A901',

    '66A000', '529400', '3E8601', '207401', '056201', '004C00', '023B01',

    '012E01', '011D01', '011301'

  ],

};
Map.addLayer(compos.select(6), Vis, '插值前');
// .0-11  分别代表1-12个月
Map.addLayer(stacked.select(6), Vis, 'NDVI');//555555555

Export.image.toDrive({
  image: stacked.select(0),//选择导出影像的波段0-11  分别代表1-12个月
  description: 'NDVI',//选择导出云盘的文件夹名称
  crs: "EPSG:4326",//坐标系
  scale: 30,//空间分辨率
  region: roi,//研究区
  maxPixels: 1e13,//最大像元个数
  folder: 'NDVI'
});

2 运行结果

填补空值之前的效果
填补空值之后的效果

可以看出,填补的效果还是非常明显的。

相关推荐
wanhengidc15 小时前
巨 椰 云手机稳定挂机 搬砖
运维·服务器·游戏·智能手机·云计算
全栈工程师修炼指南17 小时前
奇技淫巧 | 巧用阿里云免费 ESA:获取用户真实IP地址与地理位置
数据库·阿里云·云计算
Apache Flink17 小时前
打造可编程可集成的实时计算平台:阿里云实时计算 Flink被集成能力深度解析
大数据·阿里云·flink·云计算
x***J34820 小时前
云计算解决方案
云计算
科技云报道1 天前
AI+云计算互融共生,2025AI云产业发展大会即将举行
人工智能·云计算
AWS官方合作商1 天前
突破性价比壁垒!AWS Graviton2驱动的C6g实例,为计算密集型工作负载注入“核”动力
云计算·aws
AWS官方合作商1 天前
HPC性能新纪元!AWS Hpc7g实例: Graviton3E芯片开启200Gbps超算之旅
云计算·aws
竹君子1 天前
研发管理知识库(13)阿里云的DevOps工具介绍
阿里云·云计算·devops
小毅&Nora1 天前
【云计算】【Kubernetes】 ① K8S的架构、应用及源码解析 - 核心架构与组件全景图
架构·kubernetes·云计算
suki_lynn1 天前
Facebook 引流脚本:功能、风险与合规使用指南
android·云计算