基于 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 运行结果

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

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

相关推荐
F——8 小时前
云计算——AWS Solutions Architect – Associate(saa)4.安全组和NACL
安全·云计算·aws
007php0078 小时前
Docker、Ollama、Dify 及 DeepSeek 安装配置与搭建企业级本地私有化知识库实践
运维·服务器·开发语言·后端·docker·容器·云计算
AWS官方合作商10 小时前
海外直播场景下的AWS技术架构设计与实践
网络·云计算·aws
云算计10 小时前
谈谈云计算、DeepSeek和哪吒
云计算
KubeSphere 云原生11 小时前
云原生周刊:DeepSeek 颠覆人工智能
云计算·k8s·容器平台·kubesphere
在云上(oncloudai)16 小时前
15 大 AWS 服务
云计算·aws
佛州小李哥18 小时前
在亚马逊云科技上云原生部署DeepSeek-R1模型(下)
人工智能·ai·语言模型·云计算·aws·亚马逊云科技·deepseek
AWS官方合作商19 小时前
AWS vs Azure vs 阿里云:出海企业全球扩张的技术选型指南(2024深度对比)
阿里云·云计算·aws
@HNUSTer19 小时前
基于 GEE Landsat 与 Sentinel 数据的归一化水体指数 NDWI 计算和水体提取
云计算·数据集·遥感大数据·gee·云平台