首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谷歌地球引擎:从S2 NDVI图像集合中删除值(5%和95%)

谷歌地球引擎:从S2 NDVI图像集合中删除值(5%和95%)
EN

Stack Overflow用户
提问于 2020-10-12 12:28:57
回答 1查看 756关注 0票数 0

我正在计算Sentinel2上NDVI图像收集的统计数据。

我得到了一段时间内和特定区域上的S2_SR图像集合,然后移除云层。

代码语言:javascript
复制
        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
    // information 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, 10, "opaque");
      var cirrus = computeQAbits(cloud_mask, 11, 11, "cirrus");
      var mask = opaque.or(cirrus);
    
      return image.updateMask(mask.not());
    }

Then I've calculated NDVI and NDWI for each date;

       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']);
var S2 = S2.map(addNDVI);
var S2 = S2.map(addNDWI);
var NDVI = S2.select(['NDVI']);
var NDWI = S2.select(['NDWI']);

var P_95_NDVI = NDVI.reduce(ee.Reducer.percentile([95]));
var P_05_NDVI = NDVI.reduce(ee.Reducer.percentile([5]));

NDVI_P = NDVI.updateMask(NDVI.gt(P_05_NDVI).and(NDVI.lt(P_95_NDVI)));


var P_95_NDWI = NDWI.reduce(ee.Reducer.percentile([95]));
var P_05_NDWI = NDWI.reduce(ee.Reducer.percentile([5]));

NDWI_P = NDWI.updateMask(NDWI.gt(P_05_NDWI).and(NDWI.lt(P_95_NDWI)));

然后,我计算了我的统计量,最小,最大,均值,中值,标准差。因此,从我的输出中,我得到了我的NDVI和NDWI指数在我的时间段内窃听单个像素的最小、最大、平均值、中位数、sd。

代码语言:javascript
复制
 // 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的值,它们的值低于第五个百分位数,高于第95个百分位数。以确保我的统计数据不会受到异常值的影响。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-11 04:44:48

我建议使用reducer (即ee.Reducer.percentile(95))计算第95和第5个百分位数,然后掩蔽图像:

代码语言:javascript
复制
results = results.updateMask(results.gt(bottomPercentile).and(results.lt(topPercentile)));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64311694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档