如何平滑ndvi曲线,看起来更连续。我在 GEE 中重新采样了曲线,但它变得更糟
2352 次
1 回答
4
有很多平滑算法可供使用(这是一篇比较一些的文章)。我喜欢处理它的方法是获取图像集合中的日期列表并映射到该列表,同时过滤/选择当时特定平滑算法所需的数据。这是一个使用线性回归移动窗口的快速示例:
var s2 = ee.ImageCollection("COPERNICUS/S2"),
point = ee.Geometry.Point([-122.15815487909191, 37.81983948091395]);
var filteredIC = s2.filterBounds(point)
.filterDate('2016-01-01', '2017-12-31')
.sort('CLOUD_COVER')
// function to add NDVI and time bands to image collection
var addDataBands = function(image) {
var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
return image.addBands(ndvi)
.addBands(image.metadata('system:time_start').divide(1e18).rename('time'));
};
// Function to smooth time series
// stacks windows of linear regression results
// requires that a variable 'data' exists with NDVI and time bands
function smoother(t){
// helper function to apply linear regression equation
function applyFit(img){
return img.select('time').multiply(fit.select('scale')).add(fit.select('offset'))
.set('system:time_start',img.get('system:time_start')).rename('NDVI');
}
t = ee.Date(t);
var window = data.filterDate(t.advance(-windowSize,'day'),t.advance(windowSize,'day'));
var fit = window.select(['time','NDVI'])
.reduce(ee.Reducer.linearFit());
return window.map(applyFit).toList(5);
}
// function to reduce time stacked linear regression results
// requires that a variable 'fitIC' exists from the smooter function
function reduceFits(t){
t = ee.Date(t);
return fitIC.filterDate(t.advance(-windowSize,'day'),t.advance(windowSize,'day'))
.mean().set('system:time_start',t.millis()).rename('NDVI');
}
var data = filteredIC.map(addDataBands);
print(data);
var dates = ee.List(data.aggregate_array('system:time_start'));
var windowSize = 30; //days on either side
var fitIC = ee.ImageCollection(dates.map(smoother).flatten());
var smoothed = ee.ImageCollection(dates.map(reduceFits));
// merge original and smoothed data into one image collection for plotting
var joined = ee.ImageCollection(smoothed.select(['NDVI'],['smoothed'])
.merge(data.select(['NDVI'],['original'])));
var chart = ui.Chart.image.series({
imageCollection: joined,
region: point,
reducer: ee.Reducer.mean(),
scale: 30
}).setOptions({title: 'NDVI over time'});
print(chart);
Map.addLayer(ee.Image(smoothed.sort('system:time_start',false).first()),{min:0,max:0.25,bands:['NDVI']},'Smoothed')
Map.addLayer(ee.Image(data.sort('system:time_start',false).first()),{min:0,max:0.25,bands:['NDVI']},'Original')
以及代码链接:https ://code.earthengine.google.com/3e2e1c0dfdac28a9d4230ca32cb9d7f3
您可以使用类似的方法编写自己的自定义函数来应用您想要的任何平滑算法。
我希望这有帮助!
于 2018-12-05T06:03:40.093 回答