안녕하세요? 이번 글은 QGIS 3.4 Orfeo ToolBox를 통해 무인기 영상을 세그먼테이션하는
방법을 정리해 보겠습니다. 영상 세그먼테이션은 객체기반 영상분석(Object-Based Image
Analyis; OBIA)을 수행할 때 그 첫 번째 단계라고 볼 수 있습니다.
무인기 영상과 같이 수 cm 공간해상도를 제공하는 공간정보는 각각의 화소에 기반한 분류
보다는 화소값들을 일정 기준으로 그루핑한 객체에 기반하여 처리하는 것이 유리할 수 있겠죠?!
그럼, 영상 세그먼테이션을 어떻게 처리하는지 한 번 살펴보겠습니다.
이미지 출처: Image Classification Techniques in Remote Sensing
https://gisgeography.com/image-classification-techniques-remote-sensing/
먼저 실습을 위해 소백산국립공원 주목군락 일원을 촬영한 무인기 영상을 레이어 추가했습니다.
전체 데이터를 처리하는데는 일정 시간이 소요되기 때문에, 여기서는 일부 지역을 잘라내서 사용하겠습니다.
원하는 영역을 깔끔하게 추출하기 위해 상단 메뉴에서 '보기 > 꾸미기 > 그리드'를 실행합니다.
'Grid Properties' 창이 실행되는데요, Enable Grid를 체크하고 XY 간격을 지정해 줍니다. 여기서는 각각 20m로 지정했습니다.
Draw Annotation을 체크하신 후 원하는 글꼴(폰트, 글자크기)과 좌표 정밀도(소수점이하 자릿수)를 적당하게 지정하였습니다.
아래와 같이 그리드가 표시되었는데요, 이 그리드를 참고하여 적정한 영역을 잘라내겠습니다.
OTB에서 범위를 통해 영상을 잘라내는 방법은 아래 글을 참조하시면 됩니다.
QGIS 3.4 Orfeo ToolBox(OTB): SRTM 타일 다운로드 및 처리 | http://blog.daum.net/geoscience/1323
저는 아래와 같이 100x60m 영역을 잘라냈습니다.
콘트라스트 강조로 인해 잘려진 영상의 색과 색 대비가 커졌을 텐데요,
원치 않으시면 레이어 속성에서 '심볼 > 콘트라스트' 강조에서 '강조 없음'을 선택해 주시면 됩니다
자, 이제 이렇게 잘려진 영상에 세그먼테이션을 적용해 보겠습니다.
OTB에서는 대용량 공간정보에 민 시프트 알고리즘을 적용하실 수 있는데요, 'OTB > Segmentation > LargeScaleMeanShift'를 실행하시면 됩니다.
MeanShift 알고리즘에 관해서는 다크프로그래머 님의 다음 글을 추천 드립니다: [영상추적#1] Mean Shift 추적 | http://darkpgmr.tistory.com/64
LargeScaleMeanShift 실행 창은 아래와 같습니다. 일단 Input Image에 잘려진 무인기 영상을 선택해 봅니다.
각각의 매개변수를 간략히 살펴볼까요?! 먼저 눈의 띄는 변수로 Spatial radius와 Range radius가 있습니다.
Spatial radius는 평균을 계산할 공간 인접지역의 반경을 정의합니다. 이 값이 커지면 결과는 더 평활해지나 더 많은 시간이 소요됩니다.
Range radius는 분광 신호 유클리드 거리(방사측정 단위로)의 임계값에 해당합니다. 이 값이 클수록 엣지
보존이 적어지고 값이 작을수록 노이즈 평활화가 적어집니다. 변수는 처리 시간에 영향을 미치지 않습니다.
아래 세그먼테이션은 range radius를 15로 적용한 결과입니다.
동일 영상에 대해 range radius를 5로 적용한 결과는 좌측, 25로 적용한 결과는 우측과 같습니다. 매개변수 적용에 따라 차이가 있죠?!
Minimum Segment Size는 분할 후에 각각의 세그먼트 크기가 이 기준보다 작은 경우 가장 가까운 분광신호를 가진 세그먼트에 병합합니다.
아래 값은 화소 단위의 타일 크기(X축, Y축)을 설정합니다.
출력 모드는 vector와 raster가 있습니다.
출력 모드가 vector인 경우에는 Support image for field computation이 활성화됩니다.
이때 레이어를 선택하지 않으면 입력이미지의 각 밴드별 평균, 표준편차가 계산됩니다.
자, 이제 결과를 확인해볼까요?!
아래와 같이 3개 파일이 생성되었습니다.
먼저, 무인기 영상에 세그먼테이션 벡터를 중첩한 화면입니다.
세그먼테이션 속성에는 라벨, 화소개수, RGB 밴드별 평균과 표준편차 값이 자동 추가됩니다.
labelmap은 민시프트 세그먼테이션을 적용한 래스터 영상입니다.
세그먼트를 확연히 구분하기 위해 '레이어 속성 > 심볼'에서 렌더링 유형을 'Paletted/Unique values'로 변경하고 색상표 Random colors를 적용합니다.
아래와 같이 각각의 세그먼트가 서로 다른 색상으로 표현됩니다.
Minimum Segment Size 설정에 따라 50보다 작은 세그먼트들을 인근에 병합한 영상입니다.
동일 지역에 대하여 무인기 정사영상, 세그먼테이션 래스터, 세그먼테이션 벡터와 정사영상 중첩 결과를 비교해 봤습니다. 크게 어렵지 않죠?!