이미지 피라미드
영상처리를 하다보면, 어떤 이미지를 확대 또는 축소 할 일이 빈번히 생긴다. 이를 위해 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)
원본과 라플라시안을 통해 복원 된 이미지를 비교 해보자
0개의 댓글