컴퓨터 비전

위성영상으로 식물의 성장과 쇄약을 파악

도그사운드 2024. 7. 26. 09:59

분광

천체관측용으로 사용하는 카메라가 있다. 6년 전쯤 알리에서 구입했는데 아마 카메라 본체가 2,000불, 필터휠이 150불, R, G, B, IR, H, S, O 각각의 필터가 합해서 300불 정도 들었던것 같다.

센서는 코닥 제품인데 QHY와 ZWO의 카메라는 원가의 60~70%가 이미지센서 가격이다. 

센서내의 공간에서 충분한 소자가 들어갈 수 있도록 가급적 흑백을 사용(컬러보다 흑백이 더 비싸다)하여 RGB삼원색 소자를 사용했을때보다 소자의 양을 늘리는 방식을 활용한다.

qhyccd qhy9m과 필터휠

카메라는 촬영할때마다 필터휠을 돌려서 각각의 렌즈별로 사진을 촬용한다. 그리고 촬영이 마무리된 후 7개의 필터(최소는 R,G,B 3개 필터)에서 확보된 영상을 결합하여 천연색 사진으로 탈바꿈하게 만든다.

값비싼 이미지센서와 해상도를 효율적으로 활용하기 위해서는 위성카메라도 같은 방식을 사용하지 않을까 싶었는데 실제 위성 이미지도 그러했다.

다중스펙트럼 이미지가 각각의 렌즈에 대해 서로 다른 이미지를 촬영하여 활용한다고 한다.

 

보라색(보통 410nm 영역에서 보라색으로 인식한다) 380–450 nm 668–789 THz 2.75–3.26 eV
파랑(보통 454nm 영역에서 파랑으로 인식한다) 450–495 nm 606–668 THz 2.50–2.75 eV
초록색(보통 555nm 영역에서 녹색으로 인식한다) 495–570 nm 526–606 THz 2.17–2.50 eV
노랑(보통 587nm 영역에서 노랑으로 인식한다) 570–590 nm 508–526 THz 2.10–2.17 eV
주황(보통 600nm 영역에서 주황으로 인식한다) 590–630 nm 484–508 THz 2.00–2.10 eV
빨강(보통 660nm 영역에서 빨강으로 인식한다) 630–750 nm 400–484 THz 1.60–2.00 eV

위의 파장을 보면 각각의 파장이 다른 나노미터 범주를 가지는 것이 보인다.주된 영역은 R, G, B가 차지하고 있다.

 

정규식생지수

식생지수 (normalized difference vegetation index, NDVI)는 분광을 이용하여 식물의 생태를 파악하는 것이다.

​NIR은 Near-Infrared로서 근적외선이다. 건강한 식물은 근적외선을 반사한다고 한다.

그리고 R은 적색파장인데 광합성에 필요한 파장이다. 즉 건강한 식물일수록 NIR이 커지고 R이 작아지는 경향을 지닌다.

이를 분석하는 방법은 다음과 같다.

 

분석에 사용된 NIR 이미지

 


import rasterio
import numpy as np
import matplotlib.pyplot as plt

# Red 밴드 파일 경로
red_band_path = 'C:\\Users\\User\\Documents\\XXX00025854_L1R_R.tif'
infrared_band_path = 'C:\\Users\\User\\Documents\\xxxx00025854_L1R_N.tif'

# Red 밴드 파일 열기
with rasterio.open(red_band_path) as red_dataset:
    red_b = red_dataset.read(1).astype('float32')  # 데이터 타입을 float32로 변환

# NIR 밴드 파일 열기
with rasterio.open(infrared_band_path) as infra_dataset:
    infrared_b = infra_dataset.read(1).astype('float32')  # 데이터 타입을 float32로 변환

# NDVI 계산
with np.errstate(divide='ignore', invalid='ignore'):
    ndvi = (infrared_b - red_b) / (infrared_b + red_b)
    ndvi = np.where(np.isnan(ndvi), 0, ndvi)  # NaN 값을 0으로 대체

# NDVI 값의 범위 확인
print(f"NDVI 값의 범위: {ndvi.min()} ~ {ndvi.max()}")

# NDVI 시각화
plt.figure(figsize=(10, 10))
plt.imshow(ndvi, cmap='RdYlGn', vmin=-1, vmax=1)
plt.colorbar(label='NDVI')
plt.title('NDVI Map')
plt.xlabel('Column #')
plt.ylabel('Row #')
plt.show()

 

위의 코드를 실행하고 나면 matplotlib은 다음과 같은 차트를 출력하게 된다.

동일한 작물인데 특정구역에서 색상이 0.7이나 0.5 이하로 떨어져서 옅은 색상을 보인다면 그 구역에서는 식물이 제대로 자라지 않고 있다는 뜻이된다. 즉 병충해에 감염되었거나 관개용수가 부족하다는 의미가 된다.

병에 걸려서 잎이 말라 죽어가기 전까지 사람은 쉽게 식물에 이상이 있는지 여부를 알기 어렵다. 그렇다고 구역별로 특정 샘플을 채취하여 연구소에 보내 검사받는다... 농사를 지으면서 쉽게 생각하기 어려운 행동이다.

그러나 위성영상으로 이와 같이 증상이 나타나기 전에 미리 파악하여 대처할 수 있다.

'컴퓨터 비전' 카테고리의 다른 글

위성영상 데이터 다루기  (0) 2024.07.19
Cuda 가동여부 확인 및 YOLO 실행  (0) 2024.04.30
Python 인코딩 에러 및 기타 에러  (0) 2023.11.03
Image Segmentation 코딩  (1) 2023.10.18
Vehicle Counting  (0) 2023.10.15