需求描述
输入一张图像,长宽不限。先要对其进行等比例缩放使得最长边为x
,并且将图像进行填充,使得最后图像尺寸为[x, x]
。
例:
处理前:
期望处理后(缩放并填充为128x128
):
代码
主要依赖库:
cv2
语言:python
传入img
与fixed_side
,其中img
为cv2所读取的图像,fixed_side
为期望的边长x
def ResziePadding(img, fixed_side=128):
h, w = img.shape[0], img.shape[1]
scale = max(w, h)/float(fixed_side) # 获取缩放比例
new_w, new_h = int(w/scale), int(h/scale)
resize_img = cv2.resize(img, (new_w, new_h)) # 按比例缩放
# 计算需要填充的像素长度
if new_w % 2 != 0 and new_h % 2 == 0:
top, bottom, left, right = (fixed_side - new_h) // 2, (fixed_side - new_h) // 2, (fixed_side - new_w) // 2 + 1, (
fixed_side - new_w) // 2
elif new_w % 2 == 0 and new_h % 2 != 0:
top, bottom, left, right = (fixed_side - new_h) // 2 + 1, (fixed_side - new_h) // 2, (fixed_side - new_w) // 2, (
fixed_side - new_w) // 2
elif new_w % 2 == 0 and new_h % 2 == 0:
top, bottom, left, right = (fixed_side - new_h) // 2, (fixed_side - new_h) // 2, (fixed_side - new_w) // 2, (
fixed_side - new_w) // 2
else:
top, bottom, left, right = (fixed_side - new_h) // 2 + 1, (fixed_side - new_h) // 2, (fixed_side - new_w) // 2 + 1, (
fixed_side - new_w) // 2
# 填充图像
pad_img = cv2.copyMakeBorder(resize_img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[0, 0, 0])
return pad_img