Python과 OpenCV – 54 : 이미지 복원(Image Inpainting)

이 글의 원문은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_photo/py_inpainting/py_inpainting.html 입니다.

이 글에서는 오래된 사진의 작은 흡집 등을 제거하는 방법인 Inpainting에 대해 살펴보고, 이를 OpenCV의 예제를 통해 살펴 보겠습니다.

아래의 이미지의 왼쪽처럼 오래된 훼손된 사진에는 작은 흠집이 있는데, 이 흠집을 제거하고 원래의 사진으로 복구할 수 없을까요? 단순하게 이 흠짐을 사진에서 지우는 것만으로는 충분하지 않습니다. 이런 경우 Image Inpainting이라는 기술을 사용할 수 있습니다. 기본 아이디어는 단순합니다. 흠집에 위치한 픽셀을 그 이웃 픽셀을 가져와 교체하는 것입니다.

이런 목적을 위해 설계된 여러가지 알고리즘이 있으며, OpenCV에서는 2가지를 제공합니다. 이 2가지 모두 cv2.inpaint() 함수를 통해 활용할 수 있습니다.

첫번째 알고리즘은 2004년 Alexandru Telea의 논문 “An Image Inpainting Technique Based on the Fast Marching Method”에 기반합니다. 이 알고리즘은 Fast Marching Method에 기반합니다. 복원(Inpainting)하고자 하는 영역에 대해 생각해 봅시다. 이 알고리즘은 먼저 이 영역의 경계로부터 시작하며 영역 내부를 영역의 외곽선부터 시작해 점진적으로 채웁니다. 복원될 곳의 픽셀 주위의 이웃(인근)에 작은 범위의 픽셀을 구합니다. 구해진 픽셀들의 정규화된 가중치 합으로 계산되어진 값으로 복원될 픽셀이 교체됩니다. 가중치 값의 선택은 매우 중요한 문제입니다. 복원 지점에 가깝게 놓여져 있을수록 더 많은 가중치값이 주어집니다. 일단 하나의 픽셀이 복원되면, Fast Matching Method를 사용해 가장 가까운 다음 픽셀로 이동합니다. 이 알고리즘은 cv2.INPAINT_TELEA 플래그를 사용해 활성화됩니다.

두번째 알고리즘은 2001년의 논문인 “Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting”에 기반합니다. 이 알고리즘은 부분 편차 방정식과 유체역학에 기반합니다. 기반 이론은 휴리스틱 방식이며 cv2.INPAINT_NS 플래그를 활성화하여 이 알고리즘을 사용합니다.

이제 2가지의 알고리즘을 OpenCV의 함수를 통해 살펴보겠습니다. 먼저 복원하고자 하는 영역에 해당하는 픽셀에 0이 아닌 값을 담고 있는 마스크 이미지가 필요한데, 이 이미지는 입력 이미지와 크기가 동일해야 합니다. 먼저 cv2.INPAINT_TELEA 프래그에 대한 예제입니다.

import numpy as np
import cv2

img = cv2.imread('./data/inpainting_input.png')
mask = cv2.imread('./data/inpainting_mask.png',0)

dst = cv2.inpaint(img,mask,3,cv2.INPAINT_TELEA)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.INPAINT_NS에 대한 알고리즘은 7번 코드의 함수의 인자를 변경하기만 하면 됩니다. 아래의 이미지는 복원되어질 이미지와 마스크 이미지 그리고 2가지 알고리즘에 수행 결과를 모두 표시한 것입니다.

4개의 이미지 중 좌하단의 이미지는 cv2.INPAINT_TELEA에 대한 결과이며, 우하단의 이미지는 cv2.INPAINT_NS의 결과 입니다.

위치 데이터 활용을 위한 웹 GIS 솔루션, 넥스젠(NexGen)의 다양한 배경지도 지원

GIS 기반 솔루션, 넥스젠은 기본적인 GIS 기능을 이미 갖추고 있는 웹 기반 GIS 시스템으로써, 사용자가 보유하고 있는 위치 데이터를 올려 조회 및 관리할 수 있는 제품입니다.

위치 데이터를 효과적으로 활용할 수 있도록 다양한 배경 지도를 제공하는데, 국가 공개 DB를 통한 수치지도나 항공영상을 활용할 수 있고 이미 만들어져 인터넷 환경에서 바로 활용할 수 있는 VWorld의 지형도와 항공영상을 사용할 수 있습니다. 또한 네이버와 카카오 지도도 활용할 수 있습니다. 특히 인터넷이 되지 않는 환경에서, 자체적인 배경지도를 제작하여 활용할 수도 있습니다. (※주의, 저작권을 가진 지도(네이버 또는 카카오 지도 등)를 사용할 경우 해당 제조사와 협의를 통해 지도를 활용하셔야 합니다)

아래는 넥스젠에서 다양한 배경지도를 사용하고 있는 동영상입니다. 자체적으로 제작한 항공영상 기반의 배경지도와 VWorld, 네이버, 카카오 지도가 활용되고 있습니다.

UI는 심플하지만 확장성이 높고, 사용하기 편리하며 직관적입니다. 고객이 원하는 기능과 데이터를 빠르게 추가할 수 있습니다. 활용하고자 하는 위치 데이터를 보유하고 계신다면, 넥스젠을 활용해 보시기 바랍니다. 기본적인 GIS의 기능을 제공하고 있다고 말씀드렸지만, 기본 그 이상의 기능을 제공하고 있습니다. 놀라실 겁니다!