황선규 박사님의 <OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝>, 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다.
위 포스팅에서 영상의 확대와 축소를 cv2.resize를 이용하여 구현해보았습니다.
이번에는 이미지 피라미드의 개념과 cv2.pryDown, cv2pryUp을 이용해서 영상을 확대, 축소하고 이미지 피라미드를 구현해보도록 하겠습니다.
이미지 피라미드 - Image pyramid
이미지 피라미드는 하나의 영상에 대해 다양한 해상도의 영상 세트를 구성한 것입니다.
영상의 크기를 가로, 세로 반을 줄이거나 반을 키워서 다양한 크기의 영상을 생성합니다.
이미지 피라미드는 입력 영상에 가우시안 블러링을 하고 리사이즈 또는 다운 샘플링을 합니다.
작은 영상을 키우는 것은 업샘플링, 큰 영상을 작게 하는 것은 다운샘플링 이라고 합니다.
이미지 피라미드를 통해 작은 크기 영상을 만드는 이유는 다음과 같습니다.
입력 영상에서 어떠한 객체를 찾고 싶을 때 영상에 존재하는 객체의 크기가 다양합니다.
고양이 얼굴 크기를 지정해두고 영상에서 고양이 얼굴을 찾고 싶을 때,
지정한 고양이 얼굴 크기보다 작거나 크면 못 찾을 가능성이 있습니다.
따라서 다양한 이미지 크기를 만듭니다.
영상의 다운샘플링은 가우시안 블러링을 적용하고 축소하여 출력 영상에 자연스러운 형태나 부드러운 형태를 갖게 합니다.
영상 피라미드 다운샘플링 함수 - cv2.pryDown
OpenCV에서는 영상 피라미드 다운샘플링 함수를 제공하고 있습니다.
함수 설명
cv2.pyrDown(src, dst=None, dstsize=None, borderType=None) -> dst
• src: 입력 영상
• dst: 출력 영상
• dstsize: 출력 영상 크기. 따로 지정하지 않으면 입력 영상의 가로, 세로 크기의 2배로 설정.
• borderType 가장자리 픽셀 확장 방식
다운샘플링 함수의 작동방식은 먼저 5 X 5 크기의 가우시안 필터를 적용합니다.
이후 짝수 행과 열을 제거하여 작은 크기의 영상을 생성 합니다.
리사이즈와 개념은 다르지만 결과는 비슷합니다.
영상 피라미드 업샘플링 함수 - cv2.pryUP
함수 설명
cv2.pyrUp(src, dst=None, dstsize=None, borderType=None) -> dst
• src: 입력 영상
• dst: 출력 영상
• dstsize: 출력 영상 크기. 따로 지정하지 않으면 입력 영상의 가로, 세로 크기의 2배로 설정.
• borderType 가장자리 픽셀 확장 방식
피라미드 영상에 사각형 그리기 예제 코드
다운샘플링을 이용해서 영상에 사각형을 그려보겠습니다.
src = cv2.imread('cat.bmp')
if src is None:
print('Image load failed!')
sys.exit()
rc = (250, 120, 200, 200) # rectangle tuple
# 원본 영상에 그리기
cpy = src.copy() # 입력 영상의 복사본, 입력영상에 그리면 영상이 변하기 때문에 재사용이 안됌.
cv2.rectangle(cpy, rc, (0, 0, 255), 2)
cv2.imshow('src', cpy)
cv2.waitKey()
# 피라미드 영상에 그리기
for i in range(1, 4): # 4번 축소
src = cv2.pyrDown(src) # 작게 만들고
cpy = src.copy() # 작게 만든 영상의 복사본을 만들고
# 사각형을 그림, 입력 영상이 줄었는데 그대로 rc를 넣어줌
# shift 인자는 그림을 그리기 위한 좌표를 얼마큼 줄일 것이냐를 결정. 권장 X
# 잔상이 남는 이유는 윈도우 바 보다 작게 영상되었을 때 잔상을 갖고옴
# 해결하기 위해서는 매번 창을 닫아줌
cv2.rectangle(cpy, rc, (0, 0, 255), 2, shift=i)
cv2.imshow('src', cpy)
cv2.waitKey()
cv2.destroyWindow('src') # 이 작업을 반복해서 하면 영상이 짤리는 것을 방지
cv2.destroyAllWindows()
영상이 점점 작아졌습니다.
'Python > 파이썬 OpenCV 공부' 카테고리의 다른 글
[파이썬 OpenCV] 어파인 변환과 투시 변환 - cv2.getAffineTransform, cv2.getPerspectiveTransform, cv2.warpPerspectivee (0) | 2020.10.07 |
---|---|
[파이썬 OpenCV] 영상의 회전 - cv2.getRotationMatrix2D, cv2.warpAffine (0) | 2020.10.07 |
[파이썬 OpenCV] 영상의 대칭 변환 - cv2.flip (0) | 2020.10.05 |
[파이썬 OpenCV] 영상의 확대와 축소(크기 변환) - cv2.resize 함수 설명, interpolation 인자 (1) | 2020.10.05 |
[파이썬 OpenCV] 영상의 기하학적 변환 - 전단 변환 - cv2.warpAffine (0) | 2020.10.04 |