Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 확대와 축소(크기 변환) - cv2.resize 함수 설명, interpolation 인자

AI 꿈나무 2020. 10. 5. 16:52
반응형

황선규 박사님의 <OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝>, 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다.

 


 

 

[파이썬 OpenCV] 영상의 기하학적 변환 - 전단 변환 - cv2.warpAffine

황선규 박사님의 , 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다. [파이썬 OpenCV] 영상의 기하학적 변환 - 이동 변환 - cv2.warpAffine 황선규 박사님의 , 패스트 캠퍼스 OpenCV 강의를 공

deep-learning-study.tistory.com

 저번 포스팅에서 전단 변환에 대해 공부했습니다.

 이번 포스팅에서는 크기 변환과 대칭 변환이 대해서 공부하도록 하겠습니다.

 

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()

 

원본 영상

 

cv2.INTER_NEAREST

 

cv2.INTER_LINEAR

 

cv2.INTER_CUBIC

 

cv2.INTER_LANCZOS4

 

 NEAREST와 LINEAR의 화질 차이가 큰 것을 확인할 수 있습니다.

 나머지 보간법은 LINEAR와 큰 차이를 느낄 수 없습니다.

 따라서 속도도 빠르고 퀄리티도 적당한 LINEAR을 많이 씁니다.

 

영상의 축소 시 고려할 사항

 영상 축소 시 디테일이 사라지는 경우가 발생합니다.

 한 픽셀로 구성된 성분이 축소를 하게 되면서 사라지는 경우가 바생합니다.

 이를 해결하기 위해 입력 영상을 부드럽게 필터링한 후 축소를 하거나 여러번 축소를 반복합니다.

 

 OpenCV의 cv2.resize() 함수에서는 cv2.INTER_AREA 플래그를 사용합니다.

 

 

 INTER_LINEAR로 축소한 영상은 선이 사라져 있는 것을 확인할 수 있습니다.

 

반응형