본문 바로가기

IT/AI

[이미지] Numpy로 이미지 패딩 후 224x224 resize 하기 [Python]-cv2

728x90

더보기

패딩 없이 resize만 하면 아래처럼 이미지가 뭉게집니다.

import numpy as np
import cv2
from matplotlib import pyplot as plt

def resize_224x224(img):
    # 패딩할 상하/좌우 픽셀
    # 상하나 좌우 중 한 세트에만 패딩을 할 예정 -> 초기 값: 0 
    # 상하좌우 모두 패딩을 하고 싶다면
    # 0이 아닌 같은 값으로 넣은 후 
    # 이후 ud, lr 값을 업데이트할 때,
    # += 로 값을 더해주는 형식으로 하면 됨.
    ud, lr = (0, 0), (0, 0)
    
    # 이미지의 높이, 너비 중의 더 큰 값
    M = max(img.shape[:2])
    
    # s = 이미지의 높이와 너비의 차
    s = img.shape[0]-img.shape[1]
    
    # 높이가 너비보다 더 긴 경우(s>0)
    # -> 좌우로 s의 절반씩 패딩
    if M == img.shape[0]:
        lr = (s//2, s//2 + s%2) 
        # s%2는 s가 홀수 인 경우 나머지인 1을 더해주는 역할
        
    # 너비가 높이보다 더 길거나 같은 경우(s<=0)
    #-> 상하로 s의 절반씩 패딩
    else:
        ud = (-s//2, -s//2 + s%2)
    
    # 위에서 구한 값으로 패딩 
    # 3차원에 있는 BGR 정보에 대해서는 패딩 안 함 
    # 하지만 (0,0)으로 값을 지정을 해야, Error가 안 생김
    padded_img = np.pad(img, (ud, lr, (0, 0)))
    
    # 224x224 크기로 resize한 이미지 반환
    resized_img = cv2.resize(padded_img, (224, 224))
    
    return resized_img

pad_resize_img = resize_224x224(img)
plt.imshow(pad_resize_img)
plt.show()

 

np.pad 

넘파이 배열의 가장가리를 0으로 채움 

a = np.array([[1,2,3,4,5,6],[4,5,6,7,8,9]])
print(a.shape)
a = np.pad(a,(2,0)) # 위 아래 좌 우
print(a)
>>>
(2, 6)
[[0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 1 2 3 4 5 6]
 [0 0 4 5 6 7 8 9]]