고해상도 DEM 생성을 위한 자동화 프로그램

GIS 시스템 개발을 위한 다양한 데이터가 필요한데, 그 중 하나가 DEM입니다. DEM은 지형에 대한 3차원 시각화 뿐만 아니라 지형 분석을 위한 필수 데이터입니다.

이 툴의 장점은 다음과 같습니다.

  • 전국 범위에 대한 DEM 생성이 가능합니다.
  • DEM을 생성하고자 하는 지역을 쉽게 지정할 수 있으며 범위 제한이 없습니다.
  • 1미터, 5미터, 10미터 등의 원하는 해상도를 갖는 DEM 생성이 가능합니다.
  • SHP 파일, (X Y Z) 문자열 형식의 파일로 DEM 데이터를 생성할 수 있으며, 사용자가 원하는 구조로도 생성할 수 있습니다.
  • 위치에 대한 다양한 좌표계를 지정할 수 있어, 별도의 좌표계 변환이 필요치 않습니다.
  • 기존 다른 곳에서 제공하는 DEM 보다 최신의 표고값을 제공합니다. (2018년도 중순 데이터 활용)

DEM 데이터를 이용한 다양한 활용예가 있지만, 먼저 DEM 데이터를 이용한 지형의 3차원 시각화입니다. 다양한 지형의 분석 이전에 실제 지형의 형상을 바로 시각화해 살펴볼 수 있습니다.

그리고 아래는 지형에 대한 평균경사도를 측정하는 기능입니다. 태양광 분석이나 인허가 업무에 활용될 수 있습니다.

또한 아래는 지형에 대한 단면도를 측정하는 기능입니다. 지형이 오르막길인지, 내리막길인지를 효과적으로 파악할 수있으며, 지점간의 보다 정확한 거리를 측정할 수 있습니다.

Python과 OpenCV – 8 : 색상공간(Colorspace) 변경하기

이 글의 원문은 다음과 같습니다. https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html

다음과 같은 내용을 학습합니다.

  • 서로 다른 Colorspace로 변경하기. 즉 BGR을 Gray로, BGR을 HSV로 ..
  • 비디오의 영상을 통해 원하는 색상을 가진 물체 추출하기

위의 내용을 학습하면서cv2.cvtColor과 cv2.inRange 함수를 학습합니다.

먼저 색상공간 중 HSV는 Hue(색상), Saturation(채도), Value(명도)의 요소로써 각각 [0,179], [0,255], [0,255] 범위의 값을 갖습니다. HSV 중 H에 해당하는 색상값을 이용해 이미지에서 특정 색상을 띠는 물체를 추출할 수 있는데, BGR로 [255,0,0]인 파랑색을 HSV로 변환하기 위한 코드는 다음과 같습니다.

import cv2
import numpy as np

blue = np.uint8([[[255, 0, 0]]])
hsv_blue = cv2.cvtColor(blue,cv2.COLOR_BGR2HSV)
print(hsv_blue)

출력값은 [120 255, 255]입니다. 채도가 120인데, 이 특정색과 비슷한 계열의 색상은 [Hue-10,100,100]에서 [Hue+10,255,255]까지의 범위로 나타낼 수 있고, 채도가 120인 파란색의 경우 [110,50,50]에서 [130,255,255]까지가 됩니다.

이제 비디오 영상에 받은 이미지에서 파란색 계열의 물체를 추출해 내는 예제를 살펴보겠습니다.

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):
    _, frame = cap.read()

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # 앞서 설명한 파랑색 계열의 범위
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    res = cv2.bitwise_and(frame, frame, mask=mask)

    cv2.imshow('frame', frame)
    cv2.imshow('mask', mask)
    cv2.imshow('res', res)
    
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()

총 3개의 이미지가 표시되는데, 첫번째는 비디오로부터 받은 원본 이미지로 아래와 같습니다.

그리고 파랑색 계열에 대한 물체를 추출하기 위해 사용할 마스크 이미지는 아래와 같습니다.

최종적으로 원본 이미지와 마스크 이미지에 대한 처리를 위해 bitwise_and 연산을 사용했고 그 결과는 아래와 같습니다. 참고로 마스크 이미지의 처리를 위한 목적이므로 bitwise_or도 가능합니다.