NDVI谐波拟合(基于GEE实现)
在遥感影像中,我们常用 NDVI(归一化植被指数)来衡量地表植被的绿度。它简单直观,是生态监测、农情分析的基础工具。但你是否注意到:
NDVI 虽然“绿”,却常常“乱”。
因为云层、观测频率、天气干扰,NDVI 的时间序列往往是锯齿状、断裂的,很难反映植物真实的生长节奏。
那么,能不能让 NDVI 曲线变得平滑、优雅?更重要的是,让我们看出植物一年中什么时候最绿、什么时候开始变黄?
答案就是:谐波拟合(Harmonic Regression)
我们用一套简单的数学模型——正弦函数 + 余弦函数的组合,就可以模拟 NDVI 的自然波动,就像听诊器一样,听出绿地的“心跳”与“节奏”。
这套方法不仅可以:
-
去除 NDVI 的噪声、缺值干扰
-
提取“年最大 NDVI 值”与“峰值出现时间”
-
还可以看出城市、公园、农田中绿意的季节差异
一串函数,就能复刻大地的春夏秋冬。
我们在 GEE(Google Earth Engine)中完成了这项分析,原始 NDVI 和谐波拟合 NDVI 的对比图已经生成。未来我们还可以进一步提取出“绿期长度”、“相位差异”等生态指标。
📌 想获取脚本 or 全套实操教学?欢迎关注【全域智图】公众号。
部分代码,完整代码关注公众号// 1. 设置研究区域(成都点位,可自行替换)
var region = ee.Geometry.Point([104.07, 30.67]);
Map.centerObject(region, 8);// 2. 加载 MODIS NDVI 数据(MOD13Q1)
var modis = ee.ImageCollection('MODIS/006/MOD13Q1').filterDate('2020-01-01', '2021-01-01').filterBounds(region).select('NDVI').map(function(img) {return img.multiply(0.0001).copyProperties(img, ['system:time_start']);});// 3. 添加时间变量(以天为单位)
var withTime = modis.map(function(img) {var t = ee.Date(img.get('system:time_start')).difference(ee.Date('2020-01-01'), 'day');return img.addBands(ee.Image.constant(t).rename('t').toFloat());
});print(chart);
// 9. 显示 NDVI 原始图像(选择其中一个时间点)
var exampleRaw = modis.filterDate('2020-07-01', '2020-07-15').median();
Map.addLayer(exampleRaw, {min: 0.1, max: 0.8, palette: ['white', 'green']}, '原始 NDVI');// 10. 显示拟合 NDVI(同一时期)
var exampleFitted = fittedSeries.filterDate('2020-07-01', '2020-07-15').median();
Map.addLayer(exampleFitted, {min: 0.1, max: 0.8, palette: ['white', 'blue']}, '拟合 NDVI');
拟合NDVI
真实NDVI