画像演算は add()
や subtract()
などの演算子を使用して実行できますが、複数の項を含む複雑な計算の場合は、expression()
関数を使用することをおすすめします。演算子と式の詳細については、次のセクションをご覧ください。
演算子
算術演算子は、画像バンドに対して基本的な算術演算を実行します。2 つの画像または 1 つの画像と定数項の 2 つの入力を受け取ります。定数項は、マスクされたピクセルのない単一バンドの定数画像として解釈されます。オペレーションは、バンドごとにピクセル単位で実行されます。
基本的な例として、VIIRS 画像を使用して正規化植生指標(NDVI)を計算するタスクについて考えてみましょう。ここでは、add()
、subtract()
、divide()
演算子を使用します。
コードエディタ(JavaScript)
// Load a VIIRS 8-day surface reflectance composite for May 2024. var viirs202405 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter( ee.Filter.date('2024-05-01', '2024-05-16')).first(); // Compute NDVI. var ndvi202405 = viirs202405.select('SurfReflect_I2') .subtract(viirs202405.select('SurfReflect_I1')) .divide(viirs202405.select('SurfReflect_I2') .add(viirs202405.select('SurfReflect_I1')));
import ee import geemap.core as geemap
Colab(Python)
# Load a VIIRS 8-day surface reflectance composite for May 2024. viirs202405 = ( ee.ImageCollection('NASA/VIIRS/002/VNP09H1') .filter(ee.Filter.date('2024-05-01', '2024-05-16')) .first() ) # Compute NDVI. ndvi202405 = ( viirs202405.select('SurfReflect_I2') .subtract(viirs202405.select('SurfReflect_I1')) .divide( viirs202405.select('SurfReflect_I2').add( viirs202405.select('SurfReflect_I1') ) ) )
2 つの入力のマスクされていないピクセルの交差点のみが考慮され、マスクされていない状態で返されます。それ以外はすべてマスクされます。通常、どちらかの入力に 1 つのバンドしかない場合は、そのバンドがもう一方の入力のすべてのバンドに対して使用されます。入力のバンド数が同じで、名前が同じでない場合は、自然な順序でペアで使用されます。出力バンドの名前は、2 つの入力のうち長い方の名前が付けられます。長さが同じ場合は、最初の入力の順序で名前が付けられます。出力ピクセルの型は、入力型のユニオンです。
マルチバンド画像減算の次の例は、バンドが自動的に一致し、共存するバンドごとにピクセルごとの「変化ベクトル」が生成される仕組みを示しています。
コードエディタ(JavaScript)
// Load a VIIRS 8-day surface reflectance composite for September 2024. var viirs202409 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter( ee.Filter.date('2024-09-01', '2024-09-16')).first(); // Compute multi-band difference between the September composite and the // previously loaded May composite. var diff = viirs202409.subtract(ndvi202405); Map.addLayer(diff, { bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'], min: -1, max: 1 }, 'difference'); // Compute the squared difference in each band. var squaredDifference = diff.pow(2); Map.addLayer(squaredDifference, { bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'], min: 0, max: 0.7 }, 'squared diff.');
import ee import geemap.core as geemap
Colab(Python)
# Load a VIIRS 8-day surface reflectance composite for September 2024. viirs202409 = ( ee.ImageCollection('NASA/VIIRS/002/VNP09H1') .filter(ee.Filter.date('2024-09-01', '2024-09-16')) .first() ) # Compute multi-band difference between the September composite and the # previously loaded May composite. diff = viirs202409.subtract(ndvi202405) m = geemap.Map() m.add_layer( diff, { 'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'], 'min': -1, 'max': 1, }, 'difference', ) # Compute the squared difference in each band. squared_difference = diff.pow(2) m.add_layer( squared_difference, { 'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'], 'min': 0, 'max': 0.7, }, 'squared diff.', ) display(m)
この例の 2 番目の部分では、image.pow(2)
を使用して差の二乗が計算されます。基本的な算術、三角関数、指数関数、丸め、型変換、ビット演算などを処理する数学演算子の一覧については、API ドキュメントをご覧ください。
式
より複雑な数式を実装するには、数学演算のテキスト表現を解析する image.expression()
の使用を検討してください。次の例では、expression()
を使用して Enhanced Vegetation Index(EVI)を計算します。
コードエディタ(JavaScript)
// Load a Landsat 8 image. var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318'); // Compute the EVI using an expression. 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') }); Map.centerObject(image, 9); Map.addLayer(evi, {min: -1, max: 1, palette: ['a6611a', 'f5f5f5', '4dac26']});
import ee import geemap.core as geemap
Colab(Python)
# Load a Landsat 8 image. image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318') # Compute the EVI using an expression. 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'), }, ) # Define a map centered on San Francisco Bay. map_evi = geemap.Map(center=[37.4675, -122.1363], zoom=9) # Add the image layer to the map and display it. map_evi.add_layer( evi, {'min': -1, 'max': 1, 'palette': ['a6611a', 'f5f5f5', '4dac26']}, 'evi' ) display(map_evi)
expression()
の最初の引数は数学演算のテキスト表現で、2 番目の引数は辞書です。キーは式で使用される変数名で、値は変数をマッピングする画像バンドです。画像内のバンドは、辞書を指定する代わりに、b("band name")
または b(index)
(b(0)
など)として参照される場合があります。バンドマップ ディクショナリを使用する場合は、入力以外の画像からバンドを定義できます。expression()
は「切り捨て除算」を使用します。この除算では、2 つの整数を除算したときに剰余を破棄し、整数を返します。例: 10 / 20 = 0
。この動作を変更するには、一方のオペランドに 1.0
(10 * 1.0 / 20 = 0.5
)を掛けます。複数のソース画像のバンドが評価される場合、マスクされていないピクセルの交差点のみが考慮され、マスクされていないとして返されます。サポートされている式演算子を次の表に示します。
タイプ | 記号 | Name |
---|---|---|
算術 | + - * / % ** | 加算、減算、乗算、除算、モジュラス、指数 |
リレーショナル | == != < > <= >= | 等しい、等しくない、小なり、大なりなど |
論理 | && || ! ^ | AND、OR、NOT、XOR |
Ternary | ? : | if then else |