이미지 피라미드

영상처리를 하다보면, 어떤 이미지를 확대 또는 축소 할 일이 빈번히 생긴다. 이를 위해 OpenCV에서는 pyrUp() 그리고 pyrDown() 함수를 제공한다. (비록 OpenCV 내부에서는 resize 함수를 그냥 이용하는 것 뿐이지만…)

pyrDown(Mat src, Mat dst, Size dstsize, int borderType)
pyrUp(Mat src, Mat dst, Size dstsize, int borderType)
src : 입력 영상
dst : 출력 영상
dstsize : 출력 영상 크기, 따로 지정하지 않으면 입력 영상의 가로, 세로 크기의 2배 또는 1/2 설정
borderType : 가장 자리 픽셀 확장 방식

이미지 피라미드라고 불리는 이유는 하나의 이미지를 사이즈별로 구성하다보면 다음의 그림처럼 피라미드 모양을 갖기 때문이다.

안드로이드 예제코드를 사용하여 이미지 피라미드를 구성해보자. 

피라미드 종류

이미지 피라미드에는 일반적으로 두가지 종류가 존재한다.

  • 가우시안 피라미드
  • 라플라시안 피라미드 

가우시안 피라미드

가우시안 피라미드는 가우시안 필터를 적용한 뒤 이미지 피라미드를 구성하는 것을 가우시안 피라미드라고 한다. pyrDown()은 가우시안 필터를 적용한 뒤 축소하고, pyrUp()은 확대후에 가우시안 필터를 적용한다.

그렇기 때문에 이미지 피라미드 함수로 원본 이미지를 확대 또는 축소시 이미지의 화질이 떨어지게 된다.

라플라시안 피라미드

라플라시안 피라미드는 pyrDown() 함수를 적용한 뒤 다시 pyrUp() 함수를 적용하면 원본과 같은 사이즈지만 화질이 많이 떨어지게 되는 문제점을 개선하는 방식이다.

확대 또는 축소시 가우시안 필터를 적용하여 변경되는 두 이미지간의 차이(subtraction)정보를 가지고 복원된 이미지에 적용하는 방식이다.

// 다운 스케일링
val downscaled = Mat()
Imgproc.pyrDown(src, downscaled)

// 다운스케일링 된 이미지를 다시 업스케일링
val upscaledFromDownscaled = Mat()
Imgproc.pyrUp(downscaled, upscaledFromDownscaled)

// 원본과 업스케일링 된 이미지의 차이를 구함
val laplacian = Mat()
Core.subtract(src, upscaledFromDownscaled,laplacian)

// 업스케일링 된 이미지에 라플라시안 적용
val restored = Mat()
Core.add(upscaledFromDownscaled, laplacian, restored)

원본과 라플라시안을 통해 복원 된 이미지를 비교 해보자

카테고리: OpenCV

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.