Google Earth Engine:从S2 NDVI图像集合中移除价值5%和95%

问题描述

我正在计算Sentinel2上NDVI图像收集的统计信息。

我在定义的时间段内和特定区域获得了S2_SR的图像集合,然后去除了云层。

    var S2 = ee.ImageCollection('copERNICUS/S2_SR')

//filter start and end date
.filterDate('2019-03-01','2020-03-31')

//filter according to drawn boundary
.filterBounds(ROI);

var palettes = require('users/gena/packages:palettes');
var palette = palettes.colorbrewer.Spectral[8];

// Function to mask cloud from built-in quality band
// @R_855_4045@ion on cloud
var computeQAbits = function(image,start,end,newName) {
    var pattern = 0;

    for (var i=start; i<=end; i++) {
        pattern += Math.pow(2,i);
    }

    return image.select([0],[newName]).bitwiseAnd(pattern).rightShift(start);
};

var sentinel2 = function(image) {

  var cloud_mask = image.select("QA60");
  var opaque = computeQAbits(cloud_mask,10,"opaque");
  var cirrus = computeQAbits(cloud_mask,11,"cirrus");
  var mask = opaque.or(cirrus);

  return image.updateMask(mask.not());
}

然后我已经计算出每个日期的NDVI和NDWI;

   var addNDVI = function(image) {
      var ndvi = image.normalizedDifference(['B5','B4']).multiply(10000).rename('NDVI');
    
      return image.addBands(ndvi);
    };
    
    var addNDWI = function(image) {
      var ndwi = image.normalizedDifference(['B3','B8']).multiply(10000).rename('NDWI');
      return image.addBands(ndwi);
    };
    // Add NDVI band to image collection
    var S2 = S2.map(addNDVI);
    var S2 = S2.map(addNDWI);
    var NDVI = S2.select(['NDVI']);
    var NDWI = S2.select(['NDWI']);
    

然后,我计算了我的统计数据,最小值,最大值,平均值,中位数,标准偏差。 这样一来,我就可以得出一段时间内单个像素的NDVI和NDWI指数的最小值,最大值,平均值,中位数,标准偏差。

 // Add indices bands to image collection
    
    var reducer1 = ee.Reducer.mean();
    
    var reducers = reducer1.combine({reducer2: ee.Reducer.median(),sharedInputs: true})
                           .combine({reducer2: ee.Reducer.max(),sharedInputs: true})
                           .combine({reducer2: ee.Reducer.min(),sharedInputs: true})
                           .combine({reducer2: ee.Reducer.stdDev(),sharedInputs: true});
    
    
    var results_NDVI = NDVI.reduce(reducers);
    var results_NDWI = NDWI.reduce(reducers);
    
    var results = results_NDVI.addBands(results_NDWI);
    
    var results_integer = results.int16();

但是,我注意到由于云的缘故,还有一些剩余的异常值。在计算统计数据之前,我想删除NDVI和NDWI的值,这些值低于第5个百分点,但高于第95个百分点。为了确保我的统计数据不受异常值的偏见。

谢谢

解决方法

我建议使用化简器(即ee.Reducer.percentile([95]))计算第95个百分位数和第5个百分位数,然后对图像进行遮罩:

results = results.updateMask(results.gt(bottomPercentile).and(results.lt(topPercentile)));