为了账号安全,请及时绑定邮箱和手机立即绑定

在 Google Earth Engine 中的 imageCollection 上对每个图像执行

在 Google Earth Engine 中的 imageCollection 上对每个图像执行

qq_花开花谢_0 2022-10-08 17:06:01
我需要对图像集合执行每个图像的 PCA。然后,我只想保留主组件轴 1,并将其作为一个带添加到我的图像集中的每个图像中。最终,我想导出一个 .csv 文件,其中行标题处的 GPS 采样位置和图像 ID 作为列标题,平均主成分轴 1 作为值。这样做背后的想法是,我想要一个代理(光谱异质性)用于 R 中的进一步统计分析。这是我到目前为止的代码://Create an test image to extract information to be used during PCAvar testImage =ee.Image('LANDSAT/LC08/C01/T1_SR/LC08_168080_20130407').select(['B2', 'B3', 'B4', 'B5', 'B6', 'B7'],        ['Blue', 'Green', 'Red', 'NIR', 'SWIR1', 'SWIR2']);// Define variables for PCAvar region = Extent;var scale = testImage.projection().nominalScale();var bandNames = testImage.bandNames();Map.centerObject(region);// Function for performing PCAfunction doPCA(image){  // This code is from https://code.earthengine.google.com/7249153a8a0f5c79eaf562ed45a7adadvar meanDict = image.reduceRegion({    reducer: ee.Reducer.mean(),    geometry: region,    scale: scale,    maxPixels: 1e9});var means = ee.Image.constant(meanDict.values(bandNames));var centered = image.subtract(means);// This helper function returns a list of new band names.var getNewBandNames = function(prefix) {  var seq = ee.List.sequence(1, bandNames.length());  return seq.map(function(b) {    return ee.String(prefix).cat(ee.Number(b).int());  });};// [START principal_components]var getPrincipalComponents = function(centered, scale, region) {  var arrays = centered.toArray();  var covar = arrays.reduceRegion({    reducer: ee.Reducer.centeredCovariance(),    geometry: region,    scale: scale,    maxPixels: 1e9  });Extent是我的 ROI,而LandsatCol是经过预处理的图像集。尝试将 PCA 映射到图像集合(代码的倒数第二行)时,此处的代码会产生错误。错误显示:“数组:需要参数‘值’”。关于如何处理这个问题的任何建议?以及如何在图像集合上添加主分量轴 1 作为每个图像的带?
查看完整描述

1 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

我想到了。错误“Array: Parameter 'values' is required”与稀疏矩阵有关,稀疏矩阵是执行 PCA 的过滤、裁剪和指定区域的产物。Earth Engine 无法处理稀疏矩阵。


这是工作代码。LandsatCol是我的预处理图像集。


// Display AOI

var point = ee.Geometry.Point([30.2261, -29.458])

Map.centerObject(point,10);


// Prepairing imagery for PCA

var Preped = LandsatCol.map(function(image){

  var orig = image;

  var region = image.geometry();

  var scale = 30;

  var bandNames = ['Blue', 'Green', 'Red', 'NIR', 'SWIR1', 'SWIR2'];

  var meanDict = image.reduceRegion({

    reducer: ee.Reducer.mean(),

    geometry: region,

    scale: scale,

    maxPixels: 1e9

  });

  var means = ee.Image.constant(meanDict.values(bandNames));

  var centered = image.subtract(means);

  var getNewBandNames = function(prefix) {

  var seq = ee.List.sequence(1, 6);

  return seq.map(function(b) {

    return ee.String(prefix).cat(ee.Number(b).int());

    });

  };


  // PCA function

  var getPrincipalComponents = function(centered, scale, region) {

    var arrays = centered.toArray();

    var covar = arrays.reduceRegion({

      reducer: ee.Reducer.centeredCovariance(),

      geometry: region,

      scale: scale,

      maxPixels: 1e9

    });

    var covarArray = ee.Array(covar.get('array'));

    var eigens = covarArray.eigen();

    var eigenValues = eigens.slice(1, 0, 1);

    var eigenVectors = eigens.slice(1, 1);

    var arrayImage = arrays.toArray(1);

    var principalComponents = ee.Image(eigenVectors).matrixMultiply(arrayImage);

    var sdImage = ee.Image(eigenValues.sqrt())

    .arrayProject([0]).arrayFlatten([getNewBandNames('sd')]);

    return principalComponents.arrayProject([0])

    .arrayFlatten([getNewBandNames('pc')])

    .divide(sdImage);

    };


  var pcImage = getPrincipalComponents(centered, scale, region);

  return ee.Image(image.addBands(pcImage));

});

print("PCA imagery: ",Preped);


查看完整回答
反对 回复 2022-10-08
  • 1 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信