귀퉁이 서재

OpenCV - 20. 이미지 피라미드(Image Pyramid) 본문

OpenCV

OpenCV - 20. 이미지 피라미드(Image Pyramid)

데이터 파수꾼 Baek Kyun Shin 2020. 10. 12. 22:47

이번 포스팅에서는 이미지 피라미드에 대해 알아보겠습니다. 이번 포스팅 역시 '파이썬으로 만드는 OpenCV 프로젝트(이세우 저)'를 정리한 것임을 밝힙니다.

코드: github.com/BaekKyunShin/OpenCV_Project_Python/tree/master/06.filter

이미지 피라미드(image pyramid)란 이미지의 크기를 피라미드처럼 단계적으로 확대하거나 축소하는 작업을 말합니다. 

가우시안 피라미드

가우시안 필터를 적용한 뒤 이미지 피라미드를 구성하는 것을 가우시안 피라미드(gaussian pyramid)라고 합니다. OpenCV에서는 아래와 같은 가우시안 피라미드 함수를 제공합니다.

  • dst = cv2.pyrDown(src, dst, dstsize, borderType)
  • dst = cv2.pyrUp(src, dst, dstsize, borderType)
    src: 입력 영상
    dst: 결과 영상
    distsize: 결과 영상 크기
    borderType: 외곽 보정 방식

cv2.pyrDown()은 가우시안 필터를 적용한 뒤 모든 짝수 행과 열을 삭제해 입력 영상의 1/4 크기로 축소합니다. 반면 cv2.pyrUp()은 0으로 채워진 짝수 행과 열을 새롭게 삽입하고 나서 가우시안 필터를 적용해 주변 픽셀과 비슷하게 만드는 방법으로 크기는 4배 확대합니다.

# 가우시안 이미지 피라미드 (pyramid_gaussian.py)

import cv2

img = cv2.imread('../img/yeosu_small.jpg')

# 가우시안 이미지 피라미드 축소
smaller = cv2.pyrDown(img) # img x 1/4
# 가우시안 이미지 피라미드 확대
bigger = cv2.pyrUp(img) # img x 4

# 결과 출력
cv2.imshow('img', img)
cv2.imshow('pyrDown', smaller)
cv2.imshow('pyrUp', bigger)
cv2.waitKey(0)
cv2.destroyAllWindows()

중간 크기의 이미지가 원본 이미지입니다. 이미지 피라미드로 축소하거나 확대한 이미지는 화질이 많이 떨어지는 것을 볼 수 있습니다.

라플라시안 피라미드

cv2.pyUp() 함수로 이미지를 확대하면 0으로 채워진 행과 열이 새롭게 삽입되므로 원본 이미지보다 화질이 떨어집니다. 따라서 cv2.pyDown() 함수를 적용한 뒤 다시 cv2.pyUp()을 하면 원본 이미지보다 화질이 많이 떨어집니다. 이런 문제점을 개선한 방식이 라플라시안 피라미드(laplacian pyramid)입니다. 

# 라플라시안 피라미드로 영상 복원 (pyramid_laplacian.py)

import cv2
import numpy as np

img = cv2.imread('../img/taekwonv1.jpg')

# 원본 영상을 가우시안 피라미드로 축소
smaller = cv2.pyrDown(img)
# 축소한 영상을 가우시안 피라미드로 확대
bigger = cv2.pyrUp(smaller)

# 원본에서 확대한 영상 빼기
laplacian = cv2.subtract(img, bigger)
# 확대 한 영상에 라플라시안 영상 더해서 복원
restored = bigger + laplacian

# 결과 출력 (원본 영상, 라플라시안, 확대 영상, 복원 영상)
merged = np.hstack((img, laplacian, bigger, restored))
cv2.imshow('Laplacian Pyramid', merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

라플라시안 피라미드는 cv2.pyUp() 함수를 적용한 이미지와 원본 이미지의 차를 cv2.pyUp() 함수를 적용한 이미지에 더해주는 방식으로 구현됩니다. 그냥 cv2.pyUp()을 적용한 이미지가 세 번째 이미지인데 화질이 많이 떨어지는 것을 볼 수 있습니다. 하지만 라플라시안 피라미드를 적용한 네 번째 이미지는 원본과 같이 또렷히 복구가 되었습니다.

 

0 Comments
댓글쓰기 폼