최근 우리나라에서는 여러 종류의 지구관측 위성이 개발되고 있다.
국가기관과 민간기업, 군사위성에서 민간위성까지 다양한 위성이 개발됨에 따라 위성정보는 우리 일상에 깊숙히 침투하고 있다.
그런데, 우주 발사체나 위성의 개발과 같은 연구는 결과가 눈으로 명확하게 보이는 반면에 위성정보 활용과 관련된 연구 결과는 막연하게 느껴지는 것 같다.
쏟아져 내려오는 위성데이터를 어떻게 분석하는 것일까?
당연하게도 단순하게 눈으로 보고 판단하는 것은 아니다.인공위성 자료는 눈으로 보고 판단할 수 없는 애매한 부분이 많기 때문에 통계적으로 분석하고 판단하게 된다.
이번 포스팅에서는 유럽우주국(European Space Agency, ESA)에서 무료로 제공하는 Sentinel-1 위성 영상을 이용하여 선박을 탐지하는 방법을 통해 위성 영상을 분석하는 방법을 소개할 것이다.
Sentinel-1 위성 영상은 합성개구레이더(Synthetic Aperture Radar, SAR)라고 하는 자료로 일반적으로 언론에 공개되는 인공위성 영상과는 굉장히 다르다. 다음 사진은 우리나라 인천항과 인천국제공항에서 얻은 Sentinel-1 위성 영상이다.
위 사진은 육안으로도 비교적 쉽게 판단할 수 있을만큼 영상을 가공한 데이터지만, 원본 데이터는 알아보기가 어렵기때문에 SAR 영상의 분석은 높은 수준의 영상처리 능력을 필요로 한다.
SAR 영상은 기본적으로 물이나 도로와 같이 평평한 물체는 낮은(어두운) 값을 보이고 산이나 건물과 같이 경사가 있거나 표면이 거친 물체는 높은(밝은) 값을 보인다는 특징이 있다. 위 사진에서도 바다는 검은색, 육상은 회색, 도심지역은 하얀색으로 표시된 것을 확인할 수 있다.
위 사진에서 바다에 하얀 점이 보이는데, 바다위에 선박이 떠 있을 때 하얀 점처럼 보인다. 선박은 구조가 복잡하고 수면에 수직으로 서 있기 때문에 바다와 다르게 굉장히 밝게 보인다. 이러한 특징 때문에 최근에는 SAR 영상을 이용하여 선박을 탐지하고 추적하기 위한 연구가 활발하게 이루어지고 있다.
SAR 영상파일 읽어오기
SAR 영상을 Geotiff 형식의 파일로 저장하면 다음과 같은 파이썬 코드로 받아볼 수 있다.
import numpy as np
import matplotlib.pyplot as plt
import rasterio
from pyproj import Proj
from os import listdir
def getTif(path, file):
'''
getTif(path, file)
SLC Products are unavailable
path: directory to your tiff file
filename: file name of your tiff file including type of file (.tif etc)
type of filename have to be list
'''
print('')
print('')
print('*** getTif ***')
print('')
print(' Reading %s ...' %file)
import rasterio
with rasterio.open(path + file) as src:
img = src.read()
img_meta = src.meta
bound = src.bounds
return {'Band': np.array(img)[0],
'Product Name': file,
'Meta Data': img_meta,
'coords': (bound[0], bound[1], bound[2], bound[3])}
file_path = 'Z:/tstory/icn/data/'
tifs = listdir(file_path)
data = getTif(file_path, tifs[-1])
listdir 모듈을 이용하면 file_path에 있는 파일의 이름을 파이썬 리스트형식으로 저장해준다.
포스팅을 위해 인천지역의 Sentinel-1 위성영상 90장을 Googke Earth Engine(GEE)을 이용해 다운로드했다.
tifs에는 90개의 위성영상 이름이 다음과 같은 리스트형식으로 저장된다.
['S1A_20170224.tif',
'S1A_20170308.tif',
'S1A_20170320.tif',
'S1A_20170401.tif',
'S1A_20170413.tif',
'S1A_20170425.tif',
'S1A_20170507.tif',
'S1A_20170519.tif',
'S1A_20170531.tif',
'S1A_20170612.tif',
'S1A_20170624.tif',
'S1A_20170706.tif',
'S1A_20170718.tif',
...
'S1A_20200726.tif',
'S1A_20200807.tif',
'S1A_20200819.tif',
'S1A_20200825.tif',
'S1A_20200831.tif',
'S1A_20200912.tif',
'S1A_20200924.tif']
그리고 data에는 딕셔너리 형태로 위성영상의 데이터가 저장된다.
데이터에는 위성영상, 파일형식, 파일 이름, 좌표정보 등이 저장된다.
{'Band': array([[0.03433324, 0.03625694, 0.02913136, ..., 0.15221387, 0.10267722,
0.12916686],
[0.03004473, 0.02690019, 0.03195729, ..., 0.19374861, 0.12163385,
0.10032871],
[0.0389869 , 0.03962061, 0.05688967, ..., 0.17548558, 0.09554965,
0.06734899],
...,
[0.05146921, 0.03625749, 0.02768488, ..., 0.11321542, 0.16082065,
0.20586264],
[0.04938758, 0.0447579 , 0.0463155 , ..., 0.08296406, 0.08602952,
0.1548344 ],
[0.05124386, 0.05157418, 0.06374422, ..., 0.07817259, 0.0655439 ,
0.10846729]], dtype=float32),
'Product Name': 'S1A_20200924.tif',
'Meta Data': {'driver': 'GTiff',
'dtype': 'float32',
'nodata': None,
'width': 3025,
'height': 2460,
'count': 1,
'crs': CRS.from_wkt('PROJCS["WGS 84 / UTM zone 52N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",129],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32652"]]'),
'transform': Affine(10.0, 0.0, 267015.60840174207,
0.0, -10.0, 4156517.747730336)},
'coords': (267015.60840174207,
4131917.747730336,
297265.60840174207,
4156517.747730336)}
위성영상인 Band 정보를 확인하기 위해서는
data['Band'] 명령어를 이용하면된다. 그리고 data에 저장된 데이터의 종류를 보고 싶으면 data.keys() 명령어를 이용할 수 있다.
Band 데이터를 matplotlib을 이용해 다음과 같이 가시화할 수 있다.
plt.imshow(data['Band'], cmap='gray')
plt.title(data['Product Name'])
plt.clim(0,1)
plt.show()
GEE에서 다운로드 받은 영상은 0~1사이의 값으로 정규화된 데이터다.
Sigma_naught라고하는 후방산란계수(Backscattering Coefficiecnt)인데 SAR 센서에서 방출한 레이더파의 몇퍼센트가 반사(후방산란)되어 돌아오는지를 표현한 것이다.
0은 레이더파가 전혀 돌아오지 않은 것이고 1은 레이더파가 100% 완전히 돌아온 것이다.
1보다 큰 값을 갖는 지역은 지형과 같은 여러 가지 영향으로 방출한 레이더파보다 많은 값이 돌아온 경우다.
선박의 경우에는 1보다 큰 값을 가지는 경우가 빈번하게 발생하게 된다.
다음 포스팅에서는 Sentinel-1 SAR 영상이 가지는 해양지역에서의 통계적 특성을 분석하는 방법을 포스팅할 예정이다.
'인공위성과 지구통계학' 카테고리의 다른 글
지구통계학을 이용한 선박탐지(3)-통계적 가설검정 (0) | 2024.11.30 |
---|---|
지구통계학을 이용한 선박탐지(2)-SAR 영상 통계특성 분석하기 (1) | 2024.11.30 |
Google Earth Enginge에서 위성영상 받아보기 (0) | 2024.11.30 |