画像領域の統計情報

reduceRegion

ee.Image の領域内のピクセル値の統計情報を取得するには、image.reduceRegion() を使用します。これにより、リージョン内のすべてのピクセルが、リージョン内のピクセルデータの統計情報またはその他のコンパクトな表現(ヒストグラムなど)に縮小されます。リージョンは Geometry として表されます。これは、多くのピクセルを含むポリゴンである場合もあれば、単一の点である場合もあります。単一の点である場合、リージョン内のピクセルは 1 つだけになります。いずれの場合も、図 1 に示すように、出力はリージョン内のピクセルから導出された統計情報です。

reduceRegion の図
図 1. 画像と領域に適用された ee.Reducer のイラスト。

reduceRegion() を使用して画像のリージョン内のピクセル統計情報を取得する例として、シエラネバダ針葉樹林の境界内にある 5 年間の Landsat 合成画像の平均スペクトル値を求めることを考えてみましょう(図 2 を参照)。

// Load input imagery: Landsat 7 5-year composite.
var image = ee.Image('LANDSAT/LE7_TOA_5YEAR/2008_2012');

// Load an input region: Sierra Nevada.
var region = ee.Feature(ee.FeatureCollection('EPA/Ecoregions/2013/L3')
  .filter(ee.Filter.eq('us_l3name', 'Sierra Nevada'))
  .first());

// Reduce the region. The region parameter is the Feature geometry.
var meanDictionary = image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region.geometry(),
  scale: 30,
  maxPixels: 1e9
});

// The result is a Dictionary.  Print it.
print(meanDictionary);

計算を強制するには、結果を出力するだけで十分です。コードエディタは、コンソールに Dictionary として結果を表示します。出力は次のようになります。

B1: 25.406029716816853
B2: 23.971497014238988
B3: 22.91059593763103
B4: 54.83164133293403
B5: 38.07655472573677
B6_VCID_2: 198.93216428012906
B7: 24.063261634961563
reduceRegion の図
図 2. カリフォルニア州とネバダ州の Landsat 画像データの疑似カラー合成。削減する領域は白で表示されます。

この例では、reduceree.Reducer.mean())、geometryregion.geometry())、scale(30 メートル)、リデューサーに入力する最大ピクセル数の maxPixels を指定して、削減を指定しています。スケールは常に reduceRegion() 呼び出しで指定する必要があります。これは、さまざまなスケールのさまざまなソースのデータが関係する複雑な処理フローでは、出力のスケールが入力から一意に決定されないためです。その場合、スケールはデフォルトで 1 度に設定されますが、通常は満足のいく結果が得られません。Earth Engine でのスケールの処理方法の詳細については、こちらのページをご覧ください。

スケールを設定するには、scale パラメータを指定する方法と、CRS と CRS 変換を指定する方法の 2 つがあります。(CRS と CRS 変換の詳細については、用語集をご覧ください)。たとえば、上記の meanDictionary 削減は次と同等です。

// As an alternative to specifying scale, specify a CRS and a CRS transform.
// Make this array by constructing a 4326 projection at 30 meters,
// then copying the bounds of the composite, from composite.projection().
var affine = [0.00026949458523585647, 0, -180, 0, -0.00026949458523585647, 86.0000269494563];

// Perform the reduction, print the result.
print(image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region.geometry(),
  crs: 'EPSG:4326',
  crsTransform: affine,
  maxPixels: 1e9
}));

一般に、スケールを指定するだけで十分であり、コードの可読性が向上します。Earth Engine は、まずリージョンをラスタライズして、リデューサーに入力するピクセルを決定します。CRS を指定せずにスケールを指定すると、指定した解像度にスケーリングされた画像のネイティブ投影でリージョンがラスタライズされます。CRS とスケールの両方が指定されている場合、リージョンはそれらに基づいてラスタライズされます。

リージョン内のピクセル

ピクセルがリージョン内にあるかどうかは、指定されたスケールと投影で適用される次のルールに従って判断されます(重み付けも行われます)。

  • 重みなしリデューサーee.Reducer.count()ee.Reducer.mean().unweighted() など): 重心が領域内にあり、画像のマスクがゼロ以外の場合、ピクセルが含まれます。
  • 重み付きリデューサーee.Reducer.mean() など): ピクセルの少なくとも 1/256(約 0.4%)がリージョン内にあり、画像のマスクがゼロ以外の場合、ピクセルが含められます。重みは、画像のマスクとリージョンで覆われているピクセルの(おおよその)割合の最小値です。ピクセルの交差の重みは、内部的には 8 ビット整数(0 ~ 255)として表され、小数部分の範囲が 256 個の離散レベルに量子化されます。

計算を成功させるには、maxPixels パラメータが必要です。このパラメータを例から省略すると、次のようなエラーが返されます。

これらのエラーを回避するには、複数の方法があります。たとえば、例のように maxPixels を増やす、scale を増やす、bestEffort を true に設定する(maxPixels を超えないように新しい(より大きな)スケールが自動的に計算されます)などです。maxPixels を指定しない場合は、デフォルト値が使用されます。