이미지 피라미드 - Image pyramid
이미지 피라미드는 하나의 영상에 대해 다양한 해상도의 영상 세트를 구성한 것이다.
영상의 크기를 가로, 세로 반을 줄이거나 반을 키워서 다양한 크기의 영상을 생성한다.
보통가우시안 블러링 & 다운 샘플링 형태로 축소하여 구성한다.
이미지 피라미드를 통해 작은 크기 영상을 만드는 이유는 다음과 같다.
입력 영상에서 어떠한 객체를 찾고 싶을 때 영상에 존재하는 객체의 크기가 다양하다.
고양이 얼굴 크기를 지정해두고 영상에서 고양이 얼굴을 찾고 싶을 때, 지정한 고양이 얼굴 크기보다 작거나 크면 못 찾을 가능성이 있으므로, 다양한 이미지 크기를 만든다.
영상의 다운샘플링은 가우시안 블러링을 적용하고 축소하여 출력 영상에 자연스러운 형태나 부드러운 형태를 갖게 한다.
✔︎ cv2.pryDown 다운 샘플링 함수
dst = cv2.pyrDown(src, dst=None, dstsize=None, borderType=None)
- src: 입력 영상
- dst: 출력 영상
- dstsize: 출력 영상 크기. 따로 지정하지 않으면 입력 영상의 가로, 세로 크기의 2배로 설정.
- borderType 가장자리 픽셀 확장 방식
다운샘플링 함수의 작동방식은 먼저 5 X 5 크기의 가우시안 필터를 적용한다. 이후 짝수 행과 열을 제거하여 작은 크기의 영상을 생성 한다.
그 결과는 리사이즈와 개념은 다르지만 비슷하다.
✔︎ cv2.pryUp 업샘플링 함수
dst = cv2.pyrUp(src, dst=None, dstsize=None, borderType=None)
- 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()
'OpenCV' 카테고리의 다른 글
[OpenCV with Python] 영상 기하학적 변환 : 어파인 변환 (0) | 2022.02.02 |
---|---|
[OpenCV with Python] 영상 기하학적 변환 : 영상의 회전 - cv2.getRotationMatrix2D (0) | 2022.02.02 |
[OpenCV with Python] 영상 기하학적 변환 : 영상의 대칭 변환 - cv2.flip (0) | 2022.02.02 |
[OpenCV with Python] 영상 기하학적 변환 : 영상의 확대와 축소 - 크기 변환 cv2.resize (0) | 2022.02.02 |
[OpenCV with Python] 영상 기하학적 변환 : 전단 변환 - cv2.warpAffine (0) | 2022.02.02 |