본문으로 바로가기
728x90

이미지 축소

pyrDown 을 사용하며 이미지를 축소합니다.

 

cv2.pyrDown(src, dst=None, dstsize=None, borderType=None)

  • src: input size
  • dstsize: 축소 사이즈 (default: 2배 축소)
import cv2
import numpy as np
import os

_path = os.path.join('img','img.jpg')
src = cv2.imread(_path)
dst = cv2.pyrDown(src)
dst2 = cv2.resize(src, None, fx=0.5, fy=0.5)

print(src.shape)
print(dst.shape)
print(dst2.shape)

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.imshow('dst2', dst2)


cv2.waitKey()
cv2.destroyAllWindows()
(832, 602, 3)
(416, 301, 3)
(416, 301, 3)

원본(길다)

 

dst = cv2.pyrDown(src)
dst2 = cv2.resize(src, None, fx=0.5, fy=0.5)

 

피라미드 만들기

입력 이미지의 h/2, w 의 결과 이미지를 생성하고, 그 안에 축소해서 계속 추가할 것입니다. 

import cv2
import numpy as np
import os

_path = os.path.join('img','img.jpg')
src = cv2.imread(_path)

h, w = src.shape[:2]
dst = np.full((int(h/2), w, 3), (255, 255, 255), dtype=np.uint8)

d1 = cv2.pyrDown(src)
h, w = d1.shape[:2]
dst[:h, :w] = d1[:,:]

cv2.imshow('dst', dst)

cv2.waitKey()
cv2.destroyAllWindows()

 

이미지를 추가했을 때 끝 X 좌표만 기억하면 쉽게 구현할 수 있습니다.

그리고 다음 이미지를 추가할 때 마다 X 좌표를 더하면 되겠죠.

import cv2
import numpy as np
import os

_path = os.path.join('img','img.jpg')
src = cv2.imread(_path)

h, w = src.shape[:2]
dst = np.full((int(h/2), w, 3), (255, 255, 255), dtype=np.uint8)

cnt, x = 0, 0
d = src.copy()
while cnt < 5:
    d = cv2.pyrDown(d)
    h, w = d.shape[:2]
    dst[:h, x:x+w] = d[:,:]
    x += w
    cnt += 1

cv2.imshow('pyramid', dst)
cv2.waitKey()
cv2.destroyAllWindows()

 

근데 아래 비어있는 곳이 허전해서 채워보려합니다.

결과창의 height 을 축소된 이미지의 height 과 나누어서 그 만큼 반복하면 되겠죠.

import cv2
import numpy as np
import os

_path = os.path.join('img','img.jpg')
src = cv2.imread(_path)

h, w = src.shape[:2]
dst = np.full((int(h/2), w, 3), (255, 255, 255), dtype=np.uint8)
rh, rw = dst.shape[:2]

cnt, x, y = 0, 0, 0
d = src.copy()
while cnt < 5:
    d = cv2.pyrDown(d)
    h, w = d.shape[:2]

    yc = rh / h
    for i in range(int(yc)):
        y = h*i
        dst[y:y+h, x:x+w] = d[:,:]

    x += w
    cnt += 1

cv2.imshow('pyramid', dst)
cv2.waitKey()
cv2.destroyAllWindows()