환경 모니터링, 농업, 도시 계획, 재해 관리 및 기후 변화 연구는 모두 위성 이미지 분석의 이점을 얻었습니다.
우리는 지구를 관찰하는 위성이 기록한 방대한 양의 데이터를 활용하여 지구의 특성, 변화 및 역학에 대한 중요한 통찰력을 얻을 수 있습니다.
다양하고 강력한 프로그래밍 언어인 Python은 신속하고 효과적인 위성 이미지 처리를 위한 라이브러리 및 도구의 풍부한 생태계를 제공합니다.
사용 위성 이미지 분석 가능성의 세계를 열어줍니다. 위성 사진에서 지표 분류, 식생 건강 평가, 도시 확장 추적, 해안선 매핑과 같은 유용한 정보를 추출할 수 있습니다.
Python의 다재다능함과 rasterio, numpy, matplotlib와 같은 모듈을 활용하여 위성 이미지를 쉽게 처리, 표시 및 분석할 수 있습니다.
위성 이미지 분석에 Python을 사용하는 주요 이점 중 하나는 광범위한 지리 공간 데이터 처리 모듈입니다.
예를 들어 Rasterio에는 래스터 정보를 읽고 수정하기 위한 간단한 인터페이스가 있어 위성 이미지 파일 작업에 적합합니다.
numpy 모듈은 사진 데이터에 대한 빠른 계산 및 통계를 수행하기 위한 정교한 배열 작업을 제공합니다. 또한 Matplotlib를 사용하면 분석 결과의 해석 및 전달에 도움이 되는 관련 시각적 개체를 생성할 수 있습니다.
다음 섹션에서는 Python을 사용하여 위성 사진을 분석하는 방법을 보여주기 위해 실제 예제와 코드 스니펫을 살펴보겠습니다.
위성 사진을 열고, 이미지 데이터를 시각화하고, 메타데이터를 추출하고, 밴드 통계를 계산하고, NDVI(Normalized Difference Vegetation Index)와 같은 특정 분석을 실행하는 방법을 살펴보겠습니다.
이 예제는 Python을 사용한 위성 이미지 분석이라는 흥미로운 주제를 시작하는 데 도움이 됩니다.
먼저 작업에 도움이 되는 일부 라이브러리를 가져와야 합니다.
import rasterio
import matplotlib.pyplot as plt
import numpy as np
1. 위성영상 시각화 및 열기
이 섹션에서 Rasterio 라이브러리는 satellite_image_path에서 제공하는 위성 이미지에 액세스합니다.
이미지 파일은 rasterio.open() 메서드를 사용하여 열리며 결과 객체인 satellite_image는 열린 이미지를 나타냅니다.
이 작업을 위해 다음 링크의 이미지를 사용했습니다. https://unsplash.com/photos/JiuVoQd-ZLk 내 컴퓨터에 "satellite.jpg"로 저장했습니다.
# Open the satellite image using rasterio
satellite_image_path = 'satellite.jpg'
satellite_image = rasterio.open(satellite_image_path)
사진을 연 후 satellite_image 객체의 read() 함수를 사용하여 배열로 읽습니다. 위성 사진의 각 대역에 대한 픽셀 값은 이미지 배열에 저장됩니다.
# Read the image as an array
image_array = satellite_image.read()
위성 사진을 시각적으로 평가하기 위해 matplotlib.pyplot 도구를 사용하여 10×10인치 그림을 생성합니다.
그림 배열은 imshow() 메서드를 사용하여 표시됩니다. transpose(1, 2, 0) 작업은 imshow()에서 예상하는 순서에 맞게 그림 배열의 차원을 재정렬하는 데 사용됩니다.
마지막으로 axis('off') 는 축 레이블을 숨겨 위성 사진을 선명하게 보여줍니다.
# Visualize the image
plt.figure(figsize=(10, 10))
plt.imshow(image_array.transpose(1, 2, 0))
plt.axis('off')
plt.show()
2. 메타데이터 추출
위성 사진을 열어서 표시한 후 위성 사진에 대한 중요한 메타데이터 정보를 추출합니다. 이 정보는 이미지 품질을 이해하는 데 도움이 되며 향후 조사를 위한 컨텍스트를 제공합니다.
image_width = satellite_image.width
image_height = satellite_image.height
image_crs = satellite_image.crs
image_count = satellite_image.count
print("Image Width:", image_width)
print("Image Height:", image_height)
print("Coordinate Reference System:", image_crs)
print("Number of Bands:", image_count)
satellite_image 객체의 너비와 높이 속성을 사용하여 이미지 너비와 높이를 추출합니다. crs 속성은 이미지의 좌표 참조 시스템(CRS)을 검색하는 데 사용됩니다.
CRS는 그림의 공간 참조 시스템에 대한 정보를 제공하여 이미지 좌표를 실제 장소와 일치시킬 수 있습니다.
마지막으로, satellite_image 객체의 count 속성을 사용하여 이미지의 밴드 수를 계산합니다. 이 데이터는 그림 배열의 각 밴드에 대한 픽셀 값을 얻을 수 있기 때문에 이후 분석에 매우 중요합니다.
3. 대역 통계 계산
이 부분에서 그림 배열의 각 밴드에 대한 통계를 계산합니다. 루프는 각 대역에서 반복되며 numpy 라이브러리의 min, max, mean 및 std 함수는 이러한 통계를 계산하는 데 사용됩니다.
사전 목록은 각 대역에 대한 통계를 저장합니다.
band_stats = []
for band in range(image_count):
band_data = image_array[band]
band_min = np.min(band_data)
band_max = np.max(band_data)
band_mean = np.mean(band_data)
band_std = np.std(band_data)
band_stats.append({'Band': band+1, 'Min': band_min, 'Max': band_max, 'Mean': band_mean, 'Std': band_std})
print("Band Statistics:")
for stats in band_stats:
print(stats)
루프는 밴드 인덱스를 나타내는 가변 밴드와 함께 각 밴드를 순환합니다. image_array[band]를 사용하여 각 밴드에 대한 이미지 배열에서 픽셀 값을 추출합니다.
그런 다음 현재 대역에 대해 np.min(), np.max(), np.mean() 및 np.std() 함수를 사용하여 픽셀의 최소, 최대, 평균 및 표준 편차를 결정합니다. 가치.
각 대역에 대해 계산된 데이터는 'Band', 'Min', 'Max', 'Mean' 및 'Std'와 같은 키와 함께 사전에 저장됩니다. 각 사전은 밴드 통계 목록에 추가됩니다. 마지막으로 각 밴드의 데이터가 콘솔에 인쇄됩니다.
4. NDVI(Normalized Difference Vegetation Index) 계산
NDVI는 식물의 건강을 측정하는 데 널리 사용되는 척도입니다. 이 섹션에서는 그림에 NDVI 계산에 필요한 밴드가 XNUMX개 이상 포함되어 있는지 확인합니다.
red_band = None
nir_band = None
if image_count >= 4:
red_band = image_array[2] # assuming red band is at index 2
nir_band = image_array[3] # assuming near-infrared band is at index 3
if red_band is not None and nir_band is not None:
ndvi = (nir_band - red_band) / (nir_band + red_band)
# Visualize the NDVI
plt.figure(figsize=(10, 10))
plt.imshow(ndvi, cmap='RdYlGn')
plt.colorbar(label='NDVI')
plt.title('Normalized Difference Vegetation Index (NDVI)')
plt.axis('off')
plt.show()
else:
print("Error: The satellite image does not have the required bands for NDVI calculation.")
시작하려면 red_band 및 nir_band 변수를 None으로 설정합니다. 그런 다음 image_count 변수를 사용하여 이미지에 최소 XNUMX개의 밴드가 포함되어 있는지 확인합니다.
그렇다면 빨간색 밴드가 인덱스 2이고 근적외선(NIR) 밴드가 인덱스 3이라고 추론합니다. 그림 배열에서 일치하는 밴드는 변수 red_band 및 nir_band에 할당됩니다.
적색 및 NIR 대역 모두에 액세스할 수 있는 경우 NDVI는 (NIR – 적색) / (NIR + 적색) 공식을 사용하여 계산됩니다. 결과로 나타나는 NDVI 숫자는 그림의 각 픽셀에 대한 식생 지수를 나타냅니다.
그런 다음 새 그림을 만들고 imshow()를 사용하여 NDVI 배열을 표시하여 NDVI를 봅니다. colorbar() 메서드는 플롯에 컬러바를 추가하여 NDVI 값에 시각적 참조를 제공합니다.
전적으로 NDVI 디스플레이에 초점을 맞추기 위해 플롯에 대한 캡션을 추가로 지정하고 axis('off')로 축 레이블을 제거합니다. 마지막으로 플롯은 plt.show()로 표시됩니다.
그림에 NDVI 계산에 필요한 대역이 없으면 오류 메시지가 콘솔에 기록됩니다(즉, XNUMX개 미만의 대역).
5. 위성 이미지 닫기
분석 및 보기를 수행한 후 close() 함수를 사용하여 위성 사진 파일을 닫는 것이 가장 좋습니다. 이렇게 하면 그림 파일에 연결된 모든 시스템 리소스가 해제됩니다.
satellite_image.close()
내 해결책은 다음과 같습니다.
그게 다야!
최종 노트
위성 이미지의 가용성과 해상도가 증가함에 따라 이러한 방대한 데이터 세트의 연구를 지원하는 Python의 역할이 점점 더 중요해지고 있습니다.
Python을 사용하여 위성 이미지에 액세스, 처리, 분석 및 표시하는 기능은 우리 세계에 대한 좋은 변화와 더 많은 지식을 주도할 수 있는 창의적인 응용 프로그램 및 통찰력을 위한 경로를 제공합니다.
Python을 사용하여 위성 이미지 분석 모험을 계속하면서 지식과 능력을 향상시키는 데 사용할 수 있는 다양한 리소스, 자습서 및 라이브러리를 탐색하는 것을 잊지 마십시오.
계속해서 관심을 갖고 탐색하고 Python의 능력을 사용하여 위성 사진 안에 숨겨진 미스터리를 밝혀내십시오.
댓글을 남겨주세요.