황선규 박사님의 <OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝>, 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다.
저번 포스팅에서 전단 변환에 대해 공부했습니다.
이번 포스팅에서는 크기 변환과 대칭 변환이 대해서 공부하도록 하겠습니다.
1. 크기 변환 - Scale transformation
영상의 크기를 원본 영상보다 크게 또는 작게 만드는 변환입니다.
x축과 y축 방향으로의 스케일 비율(scale factor)를 지정해줍니다.
크기 변환은 빈번하게 사용되는 작업이므로 OpenCV에서는 cv2.resize 함수를 제공하고 있습니다.
함수 설명
cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None) -> dst
• 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 둘 중 하나는 꼭 명시해야 합니다.
interpilation 인자를 잘 주는 것이 중요합니다.
1. cv2.INTER_NEAREST - 최근방 이웃 보간법
가장 빠르지만 퀄리티가 많이 떨어집니다. 따라서 잘 쓰이지 않습니다.
2. cv2.INTER_LINEAR - 양선형 보간법(2x2 이웃 픽셀 참조)
4개의 픽셀을 이용합니다.
효율성이 가장 좋습니다. 속도도 빠르고 퀄리티도 적당합니다.
3. cv2.INTER_CUBIC - 3차회선 보간법(4x4 이웃 픽셀 참조)
16개의 픽셀을 이용합니다.
cv2.INTER_LINEAR 보다 느리지만 퀄리티는 더 좋습니다.
4. cv2.INTER_LANCZOS4 - Lanczos 보간법 (8x8 이웃 픽셀 참조)
64개의 픽셀을 이용합니다.
좀더 복잡해서 오래 걸리지만 퀄리티는 좋습니다.
5. cv2.INTER_AREA - 영상 축소시 효과적
영역적인 정보를 추출해서 결과 영상을 셋팅합니다.
영상을 축소할 때 이용합니다.
영상의 크기 변환 예제 코드와 결과
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()
NEAREST와 LINEAR의 화질 차이가 큰 것을 확인할 수 있습니다.
나머지 보간법은 LINEAR와 큰 차이를 느낄 수 없습니다.
따라서 속도도 빠르고 퀄리티도 적당한 LINEAR을 많이 씁니다.
영상의 축소 시 고려할 사항
영상 축소 시 디테일이 사라지는 경우가 발생합니다.
한 픽셀로 구성된 성분이 축소를 하게 되면서 사라지는 경우가 바생합니다.
이를 해결하기 위해 입력 영상을 부드럽게 필터링한 후 축소를 하거나 여러번 축소를 반복합니다.
OpenCV의 cv2.resize() 함수에서는 cv2.INTER_AREA 플래그를 사용합니다.
INTER_LINEAR로 축소한 영상은 선이 사라져 있는 것을 확인할 수 있습니다.
'Python > 파이썬 OpenCV 공부' 카테고리의 다른 글
[파이써 OpenCV] 이미지 피라미드(다운샘플링, 업샘플링) - cv2.pryDown, cv2.pryUp (0) | 2020.10.05 |
---|---|
[파이썬 OpenCV] 영상의 대칭 변환 - cv2.flip (0) | 2020.10.05 |
[파이썬 OpenCV] 영상의 기하학적 변환 - 전단 변환 - cv2.warpAffine (0) | 2020.10.04 |
[파이썬 OpenCV] 영상의 기하학적 변환 - 이동 변환 - cv2.warpAffine (0) | 2020.10.04 |
[파이썬 OpenCV] 영상에 스케치 필터 적용하기 - cv2.divide, cv2.GaussianBlur (0) | 2020.10.04 |