크기 변환(Scale transformation)
- 영상의 크기를 원본 영상보다 크게 또는 작게 만드는 변환
- x축과 y축방향 으로의 스케일비율(scalefactor)를 지정
✔︎ cv2.resize 함수
dst = cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
- src: 입력 영상
- dsize: 결과 영상 크기. (w, h) 튜플. (0, 0)이면 fx와 fy 값을 이용하여 결정.
- dst: 출력 영상
- fx, fy: x와 y방향 스케일 비율(scale factor). (dsize 값이 0일 때 유효)
- interpolation: 보간법 지정. 기본값은 cv2.INTER_LINEAR
resize 함수는 출력 영상 크기를 픽셀 단위로 설정할 수 있다.
또한 dsize가 (0, 0)이면 스케일 비율로 출력 영상을 결정할 수 있다.
그러므로 dsize 나 fx,fy 둘 중 하나는 꼭 명시해야 한다.
interpolation
- cv2.INTER_NEAREST - 최근방 이웃 보간법
가장 빠르지만 퀄리티가 많이 떨어집니다. 따라서 잘 쓰이지 않습니다. - cv2.INTER_LINEAR - 양선형 보간법(2x2 이웃 픽셀 참조)
4개의 픽셀을 이용하며, 효율성이 가장 좋다. 속도도 빠르고 퀄리티도 적당함. - cv2.INTER_CUBIC - 3차회선 보간법(4x4 이웃 픽셀 참조)
16개의 픽셀을 이용한다.
cv2.INTER_LINEAR 보다 느리지만 퀄리티는 더 좋다. - cv2.INTER_LANCZOS4 - Lanczos 보간법 (8x8 이웃 픽셀 참조)
64개의 픽셀을 이용하며, 좀 더 복잡해서 오래 걸리지만 퀄리티는 좋다. - cv2.INTER_AREA - 영상 축소시 효과적
영역적인 정보를 추출해서 결과 영상을 셋팅하며, 영상을 축소할 때 이용한다.
💬 실습
import sys
import numpy as np
import cv2
src = cv2.imread('rose.bmp') # src.shape=(320, 480)
if src is None:
print('Image load failed!')
sys.exit()
dst1 = cv2.resize(src, (0, 0), fx=4, fy=4, interpolation=cv2.INTER_NEAREST)
dst2 = cv2.resize(src, (1920, 1280)) # cv2.INTER_LINEAR
dst3 = cv2.resize(src, (1920, 1280), interpolation=cv2.INTER_CUBIC)
dst4 = cv2.resize(src, (1920, 1280), interpolation=cv2.INTER_LANCZOS4)
cv2.imshow('src', src)
cv2.imshow('dst1', dst1[500:900, 400:800])
cv2.imshow('dst2', dst2[500:900, 400:800])
cv2.imshow('dst3', dst3[500:900, 400:800])
cv2.imshow('dst4', dst4[500:900, 400:800])
cv2.waitKey()
cv2.destroyAllWindows()
❗️영상의 축소 시 고려할 사항
영상 축소 시 디테일이 사라지는 경우가 발생한다.
한 픽셀로 구성된 성분이 축소를 하게 되면서 사라지는 경우가 발생한다.
이를 해결하기 위해 입력 영상을 부드럽게 필터링한 후 축소를 하거나 여러번 축소를 반복한다.
OpenCV의 cv2.resize() 함수에서는 cv2.INTER_AREA 플래그를 사용한다.
'OpenCV' 카테고리의 다른 글
[OpenCV with Python] 영상 기하학적 변환 : 이미지 피라미드 (0) | 2022.02.02 |
---|---|
[OpenCV with Python] 영상 기하학적 변환 : 영상의 대칭 변환 - cv2.flip (0) | 2022.02.02 |
[OpenCV with Python] 영상 기하학적 변환 : 전단 변환 - cv2.warpAffine (0) | 2022.02.02 |
[OpenCV with Python] 영상 기하학적 변환 : 이동 변환 - cv2.warpAffine (0) | 2022.02.01 |
[OpenCV with Python] Filtering : Noise 제거 - 양방향 필터 Bilateral Filter (0) | 2022.02.01 |