点击上方蓝字关注我们
利用Google Earth Engine (GEE) 对遥感影像进行空间邻域分析可以分析遥感影像在空间上的变化特征,尤其是研究不同尺度下的分布模式和聚集情况。本教程提供了基于邻域均值、众数、标准差、加权平均值分析等方法,用于影像的平滑、降噪以及异常监测。文末,我们还对其他空间邻域分析进行了讨论。
1 内容
邻域分析是一种重要的空间分析方法,广泛应用于地理信息科学、生态环境研究和遥感分析中,主要用于理解某一像元周围空间特征的影响。
1. 平均数(Mean)&众数(Mode)
定义: 计算邻域内平均值&出现频率最高的值。
应用场景:
土地利用分类: 平滑分类结果,通过邻域众数去除孤立像元或噪声。
模式分析: 分析遥感影像的空间聚集模式,如建筑物或森林分布的主要类型。
分区优化: 在区域划分时,用众数确保分类结果的一致性。
优势: 在分类数据中效果显著。
劣势: 只适用于离散值数据。
2. 标准差(StdDev)
定义: 在邻域范围内计算像元值的标准差,衡量数据在局部范围内的离散程度或变化强度。
应用场景:
生态系统健康评估:
标准差可以反映植被覆盖的空间异质性,识别植被退化或分布不均的区域。
城市热岛效应分析:
通过地表温度的标准差计算,定位城市内部温度变化剧烈的区域。
农业监测:
评估作物生长的一致性,识别同一区域内的异常生长情况(如病害或水分不足)。
景观破碎化分析:
衡量森林、湿地等生态系统中不同区域的变化剧烈程度,用于评估景观的连通性和稳定性。
优势:
能够量化空间变化强度,为异质性评估提供参考。
可用于多个领域的空间模式分析,灵活性强。
劣势:
对极端值敏感,可能放大局部异常值的影响。
计算结果依赖邻域大小,尺度选择需谨慎调整
3. 加权平均值
定义: 通过自定义权重计算邻域加权平均值,权重通常与距离或方向有关。
应用场景:
空间平滑: 在遥感影像降噪时,根据距离对像元赋予不同的权重。
热岛效应: 分析城市中温度分布的空间扩散模式。
生态廊道分析: 结合栖息地适宜性指数,识别潜在生态廊道。
优势: 灵活性强,可根据实际需求调整权重。
劣势: 权重设置需谨慎,否则可能引入偏差。
2 代码
var roi = table.filter(ee.Filter.eq('city','beijing'));
var dataset = ee.ImageCollection('MODIS/061/MOD13Q1')
.filter(ee.Filter.date('2018-01-01', '2018-05-01'))
.median()
.clip(roi);
var ndvi = dataset.select('NDVI');
var ndviVis = {
min: 0,
max: 8000,
palette: [
'ffffff', 'ce7e45', 'df923d', 'f1b555', 'fcd163', '99b718', '74a901',
'66a000', '529400', '3e8601', '207401', '056201', '004c00', '023b01',
'012e01', '011d01', '011301'
],
};
Map.centerObject(roi,9);
Map.addLayer(ndvi, ndviVis, 'NDVI');
// 定义滑动窗口(kernel)
var kernel = ee.Kernel.square({radius: 3, units: 'pixels'}); // 3x3像素窗口
// 计算邻域平均值
var neighborhoodMean = ndvi.reduceNeighborhood({
reducer: ee.Reducer.mean(),
kernel: kernel
});
// 计算NDVI邻域标准差,反映空间异质性
var neighborhoodStdDev = ndvi.reduceNeighborhood({
reducer: ee.Reducer.stdDev(),
kernel: kernel
}).rename('NDVI_StdDev');
// 定义高斯核(Gaussian Kernel)
var gaussianKernel = ee.Kernel.gaussian({
radius: 3, // 核半径(以像素为单位)
sigma: 2, // 标准差
units: 'pixels',
normalize: true // 核权重归一化
});
// 计算加权平均值
var weightedMean = ndvi.convolve(gaussianKernel).rename('NDVI_WeightedMean');
// 可视化邻域平均NDVI
Map.addLayer(neighborhoodMean, ndviVis, 'Neighborhood Mean NDVI');
Map.addLayer(neighborhoodStdDev, ndviVis, 'NDVI_StdDev');
Map.addLayer(weightedMean, ndviVis, 'NDVI_WeightedMean');
3 讨论
往期回顾
点个在看你最好看