귀퉁이 서재
OpenCV - 20. 이미지 피라미드(Image Pyramid) 본문
이번 포스팅에서는 이미지 피라미드에 대해 알아보겠습니다. 이번 포스팅 역시 '파이썬으로 만드는 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()을 적용한 이미지가 세 번째 이미지인데 화질이 많이 떨어지는 것을 볼 수 있습니다. 하지만 라플라시안 피라미드를 적용한 네 번째 이미지는 원본과 같이 또렷히 복구가 되었습니다.
'OpenCV' 카테고리의 다른 글
OpenCV - 22. 컨투어(Contour) (7) | 2020.10.20 |
---|---|
OpenCV - 21. 블러링을 활용한 모자이크 처리, 이미지 스케치 효과 적용하기 (0) | 2020.10.19 |
OpenCV - 19. 모폴로지(Morphology) 연산 (침식, 팽창, 열림, 닫힘, 그레디언트, 탑햇, 블랙햇) (0) | 2020.10.11 |
OpenCV - 18. 경계 검출 (미분 필터, 로버츠 교차 필터, 프리윗 필터, 소벨 필터, 샤르 필터, 라플라시안 필터, 캐니 엣지) (4) | 2020.10.08 |
OpenCV - 17. 필터(Filter)와 컨볼루션(Convolution) 연산, 평균 블러링, 가우시안 블러링, 미디언 블러링, 바이레터럴 필터 (2) | 2020.10.05 |