수학 연산

이미지 수학은 add()subtract()와 같은 연산자를 사용하여 실행할 수 있지만, 두 개 이상의 항이 있는 복잡한 계산의 경우 expression() 함수가 좋은 대안이 됩니다. 연산자표현식에 관한 자세한 내용은 다음 섹션을 참고하세요.

연산자

수학 연산자는 이미지 밴드에서 기본 산술 연산을 실행합니다. 두 개의 이미지 또는 하나의 이미지와 상수 항(마스킹된 픽셀이 없는 단일 밴드 상수 이미지로 해석됨)이라는 두 가지 입력을 사용합니다. 작업은 각 밴드의 픽셀당 실행됩니다.

기본 예로 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')));

Python 설정

Python API 및 대화형 개발을 위한 geemap 사용에 관한 자세한 내용은 Python 환경 페이지를 참고하세요.

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')
        )
    )
)

두 입력 간의 마스크가 적용되지 않은 픽셀의 교차점만 고려되고 마스크가 적용되지 않은 것으로 반환되며 그 외 모든 픽셀은 마스크가 적용됩니다. 일반적으로 입력 중 하나에 밴드가 하나만 있으면 다른 입력의 모든 밴드에 사용됩니다. 입력의 밴드 수가 같지만 이름이 같지 않은 경우 자연 순서로 쌍으로 사용됩니다. 출력 밴드는 두 입력 중 더 긴 입력의 이름을 따르며, 길이가 같은 경우에는 첫 번째 입력의 순서를 따릅니다. 출력 픽셀의 유형은 입력 유형의 합집합입니다.

다음 멀티밴드 이미지 차감 예에서는 밴드가 자동으로 일치하여 공존하는 각 밴드의 각 픽셀에 대해 '변경 벡터'가 생성되는 방식을 보여줍니다.

코드 편집기 (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.');

Python 설정

Python API 및 대화형 개발을 위한 geemap 사용에 관한 자세한 내용은 Python 환경 페이지를 참고하세요.

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)

이 예의 두 번째 부분에서는 image.pow(2)를 사용하여 차이의 제곱을 계산합니다. 기본 산술, 삼각법, 지수, 반올림, 변환, 비트 연산 등을 처리하는 수학 연산자의 전체 목록은 API 문서를 참고하세요.

표현식

더 복잡한 수학식을 구현하려면 수학 연산의 텍스트 표현을 파싱하는 image.expression()를 사용하는 것이 좋습니다. 다음 예에서는 expression()를 사용하여 향상된 식물지수 (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']});

Python 설정

Python API 및 대화형 개발을 위한 geemap 사용에 관한 자세한 내용은 Python 환경 페이지를 참고하세요.

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()의 첫 번째 인수는 수학 연산의 텍스트 표현이고, 두 번째 인수는 키가 표현식에 사용된 변수 이름이고 값이 변수를 매핑해야 하는 이미지 밴드인 사전입니다. 이미지의 밴드는 사전을 제공하는 대신 b("band name") 또는 b(index)(예: b(0))으로 참조될 수 있습니다. 밴드 맵 사전을 사용할 때는 입력이 아닌 다른 이미지에서 밴드를 정의할 수 있습니다. expression()는 두 정수를 나눌 때 나머지를 삭제하고 정수를 반환하는 'floor division'을 사용합니다. 예를 들면 다음과 같습니다. 10 / 20 = 0 이 동작을 변경하려면 피연산자 중 하나에 1.0: 10 * 1.0 / 20 = 0.5를 곱합니다. 두 개 이상의 소스 이미지의 밴드를 평가할 때는 마스크가 적용되지 않은 픽셀의 교차점만 고려되고 마스크가 적용되지 않은 것으로 반환됩니다. 지원되는 표현식 연산자는 다음 표에 나와 있습니다.

expression()의 연산자
유형 기호 이름
산술 + - * / % ** 더하기, 빼기, 곱하기, 나누기, 나머지, 지수
관계형 == != < > <= >= 같음, 같지 않음, 작음, 큼 등
논리 && || ! ^ And, Or, Not, Xor
Ternary ? : if then else