본문 바로가기
Image Processing (Python)

Zero Padding

by HanByol Jang 2021. 11. 9.
728x90

함수 설명

이미지를 다루다보면 이미지의 가로와 세로의 비를 1:1로 조정하여 사용하는 경우가 많습니다.

단순하게 Resize 함수를 사용할 수 있지만, 가로와 세로의 비가 1:1이 아닌 이미지를 강제로 1:1로 만들면 이미지가 해당 방향으로 늘어지게 됩니다.

만약 중요한 feature가 위처럼 늘어나버리게되면 이상해질 수 있습니다. 이럴때 원본 이미지의 비율을 유지하면서 영상의 크기를 조정하는 함수가 바로 Zero Padding입니다.

Zero Padding은 이미지의 위/아래 혹은 양 옆에 0으로 이루어진 값들을 추가하여 가로 세로의 비율을 1:1로 맞춰줍니다.

zero padding 원리


코드 설명

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

'Image Processing (Python)' 카테고리의 다른 글

Image Read (이미지 불러오기)  (0) 2021.11.11
Invert (색반전)  (0) 2021.11.10
Z-Score Standardization (표준화)  (0) 2021.11.08
Min-Max Normalization (정규화)  (0) 2021.11.04
Resize  (0) 2021.11.03

댓글