Python rasterio 라이브러리를 활용한 위성 이미지 처리 및 NDVI 계산 실무 가이드

지표면의 식생 분포, 도시화 진행 상황, 자연재해 피해 규모 등을 분석할 때 위성 이미지 데이터는 매우 중요한 역할을 합니다. 이러한 데이터는 일반적으로 가시광선부터 적외선까지 다양한 파장 대역의 반사율 정보를 포함하는 다중 밴드 래스터 형식으로 저장됩니다. Python 생태계에서 rasterio는 GDAL을 Python 친화적으로 래핑한 라이브러리로, 지리공간 래스터 데이터를 효율적이고 직관적으로 처리할 수 있게 해줍니다.

이 글에서는 rasterio를 사용하여 위성 이미지를 처리하는 핵심적인 방법을 살펴봅니다. 특히 농업 모니터링, 산림 관리, 환경 평가 등에서 널리 사용되는 NDVI(정규화 식생 지수)를 계산하는 실제 프로세스를 중점적으로 다룹니다.

1. 개발 환경 구축 및 라이브러리 설치

위성 이미지 분석을 시작하기 전에 적절한 Python 환경을 설정해야 합니다. rasterio는 기저에 GDAL 라이브러리에 의존하고 있기 때문에, 일반적인 Python 패키지보다 설치 과정에 주의가 필요합니다.

의존성 충돌을 방지하기 위해 conda를 사용하여 가상 환경을 구성하는 것을 권장합니다.

conda create -n spatial_env python=3.11
conda activate spatial_env
conda install -c conda-forge rasterio numpy matplotlib

만약 pip를 사용해야 하는 상황이라면, 시스템 레벨에서 GDAL 개발 헤더가 미리 설치되어 있어야 합니다. Ubuntu 환경에서는 다음과 같이 설정할 수 있습니다.

sudo apt-get update
sudo apt-get install libgdal-dev
export CPLUS_INCLUDE_PATH=/usr/include/gdal
export C_INCLUDE_PATH=/usr/include/gdal
pip install rasterio --no-binary :all:

설치가 정상적으로 완료되었는지 확인하려면 Python 인터프리터에서 다음 코드를 실행합니다.

import rasterio
print(f"설치된 rasterio 버전: {rasterio.__version__}")

참고: Windows 사용자의 경우 컴파일 오류를 피하기 위해 비공식 wheel 파일을 사용하거나, 반드시 conda-forge 채널을 통해 설치하는 것이 좋습니다.

주요 오류 해결 방법:

  • Could not find libgdal 오류가 발생하면 시스템에 GDAL이 올바르게 설치되었는지, 그리고 환경 변수가 제대로 설정되어 있는지 확인하세요.
  • 의존성 버전 충돌이 발생할 경우, 특정 버전을 명시하여 설치합니다: pip install "rasterio==1.3.8" "numpy<1.26"

2. 위성 이미지 데이터 로드 및 메타데이터 확인

실습을 위해 Landsat 8 위성의 오픈 데이터를 활용합니다. USGS EarthExplorer 또는 AWS 오픈 데이터 레지스트리에서 다운로드할 수 있으며, 여기서는 분석이 용이하도록 미리 일부 영역만 잘라낸 샘플 파일을 사용합니다.

import rasterio
from rasterio.plot import show
import matplotlib.pyplot as plt

# 래스터 파일 경로 지정
raster_file_path = 'landsat8_subset_multiband.tif'

# 컨텍스트 매니저를 사용하여 이미지 열기
with rasterio.open(raster_file_path) as dataset:
    # 메타데이터 출력
    print(f"래스터 크기 (너비 x 높이): {dataset.width} x {dataset.height}")
    print(f"총 밴드 수: {dataset.count}")
    print(f"좌표 참조 시스템 (CRS): {dataset.crs.to_string()}")
    print(f"지리적 변환 행렬 (Affine Transform):\n{dataset.transform}")
    print(f"데이터 타입: {dataset.dtypes[0]}")
    
    # 이미지 시각화
    fig, ax = plt.subplots(figsize=(8, 8))
    show(dataset, ax=ax, title='Landsat 8 원본 이미지')
    plt.show()

위 코드를 실행하면 콘솔에 다음과 유사한 메타데이터가 출력됩니다.

래스터 크기 (너비 x 높이): 4500 x 4500
총 밴드 수: 11
좌표 참조 시스템 (CRS): EPSG:32652
지리적 변환 행렬 (Affine Transform):
| 30.00, 0.00, 412500.00|
| 0.00,-30.00, 3985000.00|
| 0.00, 0.00, 1.00|
데이터 타입: uint16

태그: Rasterio python GDAL Landsat NDVI

6월 24일 21:41에 게시됨