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]]
'IT > AI' 카테고리의 다른 글
[이미지] Numpy로 이미지 처리 기초 [Python]-cv2 (2) | 2023.08.29 |
---|---|
[이미지] Numpy로 이미지를 224x224 크기로 crop 하기 [Python]-cv2 (0) | 2023.08.29 |
데이터와 전처리 (0) | 2023.08.23 |
[NLP] 자연어 처리: 트랜스포머 [기초] (0) | 2023.08.22 |