Image Processing (Python)
Zero Padding
HanByol Jang
2021. 11. 9. 15:55
728x90
함수 설명
이미지를 다루다보면 이미지의 가로와 세로의 비를 1:1로 조정하여 사용하는 경우가 많습니다.
단순하게 Resize 함수를 사용할 수 있지만, 가로와 세로의 비가 1:1이 아닌 이미지를 강제로 1:1로 만들면 이미지가 해당 방향으로 늘어지게 됩니다.
만약 중요한 feature가 위처럼 늘어나버리게되면 이상해질 수 있습니다. 이럴때 원본 이미지의 비율을 유지하면서 영상의 크기를 조정하는 함수가 바로 Zero Padding입니다.
Zero Padding은 이미지의 위/아래 혹은 양 옆에 0으로 이루어진 값들을 추가하여 가로 세로의 비율을 1:1로 맞춰줍니다.
코드 설명
python3 기반 numpy 라이브러리를 사용했습니다.
np.pad(src, margin, mode='constant')
1) src : source 이미지
2) margin : 추가할 margin
1차원 padding => 왼쪽 2개, 오른쪽 3개일 경우 margin = (2,3)
2차원 padding => 위쪽 1개, 아래쪽 2개, 왼쪽 3개, 오른쪽 4개일 경우 margin = ((1,2), (3,4))
3) mode : padding 방법. 동일한 값을 입력하는 constant (default) 이외의 edge, maximum, mean, minimum 등
예제
불러온 이미지의 가로 세로 비율을 자동으로 1:1로 만들어주는 코드입니다.
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Image load (cv2.imread는 BGR로 load 하기에 RGB로 변환)
image = cv2.imread("dog.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 가로, 세로에 대해 부족한 margin 계산
height, width = image.shape[0:2]
margin = [np.abs(height - width) // 2, np.abs(height - width) // 2]
# 부족한 길이가 절반으로 안 떨어질 경우 +1
if np.abs(height-width) % 2 != 0:
margin[0] += 1
# 가로, 세로 가운데 부족한 쪽에 margin 추가
if height < width:
margin_list = [margin, [0, 0]]
else:
margin_list = [[0, 0], margin]
# color 이미지일 경우 color 채널 margin 추가
if len(image.shape) == 3:
margin_list.append([0,0])
# 이미지에 margin 추가
output = np.pad(image, margin_list, mode='constant')
# view
plt.imshow(output)
plt.show()
#save
new_output = cv2.cvtColor(output, cv2.COLOR_RGB2BGR)
cv2.imwrite('output.jpg', new_output)
원본 이미지의 비율을 유지한채 가로 세로 비율이 1:1인 이미지를 생성할 수 있습니다.
728x90