GEE(12):使用移动窗口对影像进行计算

问题描述:“在GEE中想对图像窗口进行一些计算,比如3x3像元窗口,计算整个图像的某个公式,比如计算这个窗口像元的总平均值的来作为每个像元的新值”

解决方法:在GEE中使用移动窗口的方法来对影像进行计算主要用到了ee.Kernel.square/ee.Kernel.rectangleneighborhoodToArray函数

Kernel用来确定核,即移动窗口的大小,单位可以是像素,也可以是米,使用方法如下:

var kernel = ee.Kernel.square({
    radius:3, //移动窗口半径
    units:"pixels", //单位
    normalize:false, 
})

定义完移动窗口大小以后,使用neighborhoodToArray函数来对移动窗口范围内的值进行计算,比如要使用3x3像元窗口内的平均值来作为新的值代替原像元值,可以使用如下方法:

var img_neiborhood_mean2 = img.reduceNeighborhood({
  reducer:ee.Reducer.mean(), // 平均值
  kernel:kernel, // 前面定义的kernel
}).rename('mean2');

返回的就是使用移动窗口对整个影像计算后的新影像。

这里以SRTM DEM为例计算,完整计算代码如下:

//定义roi范围
var roi = ee.Geometry.Polygon(
        [[[110.51894680483909, 36.61075542452372],
          [110.51894680483909, 33.98398879058431],
          [113.97964016421409, 33.98398879058431],
          [113.97964016421409, 36.61075542452372]]], null, false);
// 读取 DEM          
var DEM = ee.Image("CGIAR/SRTM90_V4");
var img = DEM.clip(roi);
// 定义kernel
var kernel = ee.Kernel.square({
    radius:3,
    units:"pixels",
    normalize:false,
});
// 移动窗口计算
var img_neiborhood_mean2 = img.reduceNeighborhood({
  reducer:ee.Reducer.mean(),
  kernel:kernel,
}).rename('mean2');
Map.addLayer(img_neiborhood_mean2,{min:0,max:1000},'mean2');

原始DEM:
在这里插入图片描述
移动窗口计算后:
在这里插入图片描述
这里只是使用简单的移动窗口内的平均值来代替,如果想要其他的也可以。比如计算这个窗口每个像元与窗口像元的总平均值的差,作为每个像元的新值,就可以先通过上述方法计算每个像元窗口内的平均值,然后使用原始影像减去平均值影像,就得到了需要的影像。ee.Reducer里面还有很多其他的函数,基本能够满足需要。

在网上看见也有其他方法,是使用Array的相关操作来实现,贴上使用Array的相关代码以供学习:

//定义roi范围
var roi = ee.Geometry.Polygon(
        [[[110.51894680483909, 36.61075542452372],
          [110.51894680483909, 33.98398879058431],
          [113.97964016421409, 33.98398879058431],
          [113.97964016421409, 36.61075542452372]]], null, false);
// 读取 DEM          
var DEM = ee.Image("CGIAR/SRTM90_V4");
var img = DEM.clip(roi);
// 邻域转为Array,包括x和y两个轴
var img_neiborhood = img.neighborhoodToArray({
    kernel:kernel,
});
// 计算移动窗口x和y轴的平均值
var img_neiborhood_mean = img_neiborhood.arrayReduce({
    reducer:ee.Reducer.mean(),
    axes:[0],
}).arrayReduce({
    reducer:ee.Reducer.mean(),
    axes:[1],
}).arrayProject([0]).arrayFlatten({
    coordinateLabels:[['mean']],
//  separator:"_",
})
Map.centerObject(roi);
Map.addLayer(img,{min:0,max:1000},'img');
Map.addLayer(img_neiborhood,{min:0,max:1000},'img_neiborhood');
Map.addLayer(img_neiborhood_mean,{min:0,max:1000},'img_neiborhood_mean');
  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是利用Google Earth Engine (GEE)实现移动窗口主成分分析计算遥感生态指数的代码示例。代码实现了对Landsat 8影像进行分块处理,并计算了每个分块的NDVI、EVI、以及PCA指数。 ```javascript // 设置分析区域 var region = ee.Geometry.Rectangle([116.3, 39.8, 117, 40.5]); // 加载Landsat 8影像 var image = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA') .filterDate('2019-01-01', '2019-12-31') .filterBounds(region) .median(); // 计算NDVI指数 var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI'); // 计算EVI指数 var evi = image.expression( '2.5 * (nir - red) / (nir + 6 * red - 7.5 * blue + 1)', { 'nir': image.select('B5'), 'red': image.select('B4'), 'blue': image.select('B2') }).rename('EVI'); // 将NDVI和EVI合并为一个图像 var vegIndex = ndvi.addBands(evi); // 定义移动窗口大小和步长 var kernelSize = 256; var kernelStep = 128; // 定义PCA算法 var pca = ee.Reducer.pca().outputComponentNames(['PC1', 'PC2', 'PC3']); // 对每个分块进行PCA分析 var pcaImage = vegIndex.neighborhoodToBands( ee.Kernel.square(kernelSize, 'meters'), ee.Reducer.mean() ).reduceNeighborhood(pca, ee.Kernel.square(kernelSize, 'meters'), true); // 将PCA指数合并到原始图像中 var resultImage = image.addBands(pcaImage); // 将结果可视化 Map.centerObject(region, 12); Map.addLayer(resultImage, {bands: ['B4', 'B3', 'B2'], max: 0.3}, 'Landsat 8'); Map.addLayer(pcaImage.select('PC1'), {min: -2, max: 2}, 'PCA'); ``` 上述代码通过加载Landsat 8影像计算NDVI和EVI指数,并将它们合并为一个图像。然后,对每个分块进行PCA分析,并将PCA指数合并到原始图像中。最后,将结果可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GISerQ.

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值