본문 바로가기
파이썬 (Python)/딥러닝 (Deep Learning)

Python opencv 이용하여 이미지 확대 및 축소 하는 방법

by ★√★ 2021. 2. 22.

안녕하세요, Davey입니다. 오늘 포스팅할 내용은 python의 opencv 라이브러리를 이용하여 이미지를 확대 및 축소를 하는 방법에 대해서 설명 드리도록 하겠습니다. 이미지 피라미드(Image pyramid)를 활용하여 이미지의 크기를 샘플링하는 작업입니다.

 

 

opencv 이미지 확대 및 축소에 관련 기본 이론

 

: 이미지를 출력하는데 너무 작거나 클 경우에 이미지를 확대 및 축소를 해야하는 경우가 있습니다. 이럴 때 쉽게 이미지를 확대하거나 축소하기 위해서 opencv에서 추가적인 코드를 입력을 하셔야 합니다. 이미지 확대와 축소는 이미지 피라미드(Image pyramid) 활용해 이미지의 크기를 원하는 단계까지 샘플링하는 작업입니다이미지 피라미드의 의미는 이미지의 크기를 확대하거나 축소했을 이미지들의 형태가 피라미드와 같이 표현됩니다.

 

원본 이미지에서 크기를 확대하는 것을 업 샘플링이라 하며 하위 단계의 이미지를 생성하게 되고, 반대로 원본 이미지에서 크기를 축소하는 것을 다운 샘플링이라 하며상위 단계의 이미지를 생성하게 됩니다. 이미지 피라미드로는 2가지 가 있습니다.

 

 1) 가우시안 피라미드(Gaussian Pyramid)

 2) 라플라시안 피라미드(Laplacian pyramid)

 

opencv 이미지 확대 및 축소 코드 구현

 

: 간단하게 위에서 설명드린 내용을 이론적으로 이해하시고 코드를 구현해보도록 하겠습니다. 구현을 위한 라이브러리 선언 및 원하는 이미지를 불러오는 코드는 이미 이전 포스팅에서 설명 드렸으니, 생략하도록 하겠습니다. 확대 및 축소를 위한 클래스 속성에 대해서 설명 드리도록 하겠습니다. 

 

- cv2.pyrUp 와 cv2.pyrDown 은 이미지를 2배 확대 및 축소를 하는 클래스입니다. 즉 Default Function은 이렇지만 세밀하게 크기를 확대 및 축소를 하기 위해서는 아래 사항 처럼 안에 속성값을 이해하셔야 합니다.

 

cv2.pyrUp or pyrDown (원본 이미지, dstsize=(확대하고자 하는 크기), 테두리 외삽법)

 

#opencv 라이브러리 선언
import cv2

#이미지를 불러옴
test_img_read = cv2.imread("001.png", cv2.IMREAD_COLOR)

#불러온 이미지의 속성값 불러옴
height, width, channel = test_img_read.shape

#cv2.pyrUp 와 cv2.pyrDown을 이용하여 확대 및 축소를 함
test_up1 = cv2.pyrUp(test_img_read, dstsize=(width * 2, height * 2), borderType=cv2.BORDER_DEFAULT)
test_down1 = cv2.pyrDown(test_img_read)

 

- 저는 제일 헷갈렸던게 테두리 외삽법인데요, 이 부분을 간단하게 설명을 드리면, 이미지를 확대하거나 축소 경우, 이미지 영역 밖의 픽셀은 추정 값을 할당해야 하는데, 테두리 외삽법을 이용해서 이미지 밖의 픽셀을 외삽하는 사용되는 테두리 모드외삽 방식 설정하는 것입니다. 아래 속성 값 종류를 정리하였습니다. 참조 하세요

 

 1) 이미지 확대 함수 BORDER_DEFAULT 픽셀 외삽법 사용 가능

 2) 이미지 축소 함수 BORDER_CONSTANT 픽셀 외삽법 제외한 나머지 플래그만 사용 가능

 

테두리 외삽법 속성 값

테두리 외삽법 속성 의미

cv2.BORDER_CONSTANT

iiiiii | abcdefgh | iiiiiii

cv2.BORDER_REPLICATE

aaaaaa | abcdefgh | hhhhhhh

cv2.BORDER_REFLECT

fedcba | abcdefgh | hgfedcb

cv2.BORDER_WRAP

cdefgh | abcdefgh | abcdefg

cv2.BORDER_REFLECT_101

gfedcb | abcdefgh | gfedcba

cv2.BORDER_REFLECT101

gfedcb | abcdefgh | gfedcba

cv2.BORDER_DEFAULT

gfedcb | abcdefgh | gfedcba

cv2.BORDER_TRANSPARENT

uvwxyz | abcdefgh | ijklmno

cv2.BORDER_ISOLATED

관심 영역 (ROI) 밖은 고려하지 않음

 

 

opencv를 이용하여 확대 및 축소한 이미지 출력

: 위 코드를 이용하여 확대 및 축소한 이미지를 출력하는 코드를 구현해보도록 하겠습니다. 위의 코드 및 아래 코드를 합쳐서 출력되는 결과물도 참조 하시면 되겠습니다. 즉 아래 결과물을 보시면 각 확대 및 축소의 설정대로 출력이 되는 걸 확인 하실 수 있습니다. 일단 Original Image가 워낙 큰 관계로 결과물의 내용이 약간 짤린 점 참조 부탁 드립니다.

 

#각각의 크기로 이미지를 출력함
cv2.imshow("Origianl Image", test_img_read)
cv2.imshow("Enlarged Image", test_up1)
cv2.imshow("Decreased Image", test_down1)

cv2.waitKey()
cv2.destroyAllWindows()

 

 

맺음말

 

- 이상입니다. 이번 포스팅은 python의 opencv 라이브러리를 이용하여 불러온 이미지를 확대 및 축소를 하는 방법에 대해서 설명 드렸습니다. 일단 기본적으로 제공하는 크기는 2개 확대 및 축소이고 더 세밀하게 확대 및 축소를 구현하려면 dsize 속성값을 수정을 하고 더 공부를 해야 할 거 같습니다. 그럼 이만 마무리 하도록 하겠습니다. 감사합니다. 

 

제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다.


[저작권이나권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다검토  수정  삭제 조치 하도록 하겠습니다그리고기재되는 내용은 개인적으로 습득한 내용이므로 오류가 발생할  있을 가능성이 있으므로기재된 내용은 참조용으로만 봐주시길 바랍니다게시물에오류가 있을때도, Comment 달아 주시면검증 결과를 통해수정하도록 하겠습니다.]

728x90

댓글


// 내부링크를 현재창으로 열기 // Open internal links in same tab