안녕하세요, 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 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.]
'파이썬 (Python) > 딥러닝 (Deep Learning)' 카테고리의 다른 글
Python opencv 이용하여 이미지 색상 흑백으로 바꾸기 (0) | 2021.02.23 |
---|---|
Python opencv 이용하여 이미지 원하는 부분만 자르기 방법 (0) | 2021.02.23 |
Python opencv 이용하여 이미지 회전해서 출력하는 방법 (1) | 2021.02.22 |
Python opencv 이용하여 이미지 대칭 시켜서 출력 하는 방법 (2) | 2021.02.22 |
Python opencv 이용하여 이미지 크기 조절하는 방법 (2) | 2021.02.21 |
댓글