参考链接:https://zhuanlan.zhihu.com/p/49995236
变化函数
def letterbox_image(img, inp_dim):
"""
letterbox_image()将图片按照纵横比进行缩放,将空白部分用(128,128,128)填充,调整图像尺寸
具体而言,此时某个边正好可以等于目标长度,另一边小于等于目标长度
将缩放后的数据拷贝到画布中心,返回完成缩放
"""
img_w, img_h = img.shape[1], img.shape[0]
w, h = inp_dim#inp_dim是需要resize的尺寸(如416*416)
# 取min(w/img_w, h/img_h)这个比例来缩放,缩放后的尺寸为new_w, new_h,
# 即保证较长的边缩放后正好等于目标长度(需要的尺寸),另一边的尺寸缩放后还没有填充满.
new_w = int(img_w * min(w/img_w, h/img_h))
new_h = int(img_h * min(w/img_w, h/img_h))
# 将图片按照纵横比不变来缩放为new_w x new_h,768 * 576的图片缩放成416*312.,用了双三次插值
resized_image = cv2.resize(img, (new_w,new_h), interpolation = cv2.INTER_CUBIC)
# 创建一个画布, 将resized_image数据拷贝到画布中心。
# 生成一个我们最终需要的图片尺寸h*w*3的array,这里生成416*416*3的array,每个元素值为128
canvas = np.full((inp_dim[1], inp_dim[0], 3), 128)
# 将w*h*3的array中对应new_wxnew_h*3的部分(这两个部分的中心应该对齐)赋值为刚刚由原图缩放得到的数组,得到最终缩放后图片
canvas[(h-new_h)//2:(h-new_h)//2 + new_h,(w-new_w)//2:(w-new_w)//2 + new_w, :] = resized_image
return canvas
结果展示
完整代码
import cv2
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
def letterbox_image(img, inp_dim):
"""
letterbox_image()将图片按照纵横比进行缩放,将空白部分用(128,128,128)填充,调整图像尺寸
具体而言,此时某个边正好可以等于目标长度,另一边小于等于目标长度
将缩放后的数据拷贝到画布中心,返回完成缩放
"""
img_w, img_h = img.shape[1], img.shape[0]
w, h = inp_dim#inp_dim是需要resize的尺寸(如416*416)
# 取min(w/img_w, h/img_h)这个比例来缩放,缩放后的尺寸为new_w, new_h,
# 即保证较长的边缩放后正好等于目标长度(需要的尺寸),另一边的尺寸缩放后还没有填充满.
new_w = int(img_w * min(w/img_w, h/img_h))
new_h = int(img_h * min(w/img_w, h/img_h))
# 将图片按照纵横比不变来缩放为new_w x new_h,768 * 576的图片缩放成416*312.,用了双三次插值
resized_image = cv2.resize(img, (new_w,new_h), interpolation = cv2.INTER_CUBIC)
# 创建一个画布, 将resized_image数据拷贝到画布中心。
# 生成一个我们最终需要的图片尺寸h*w*3的array,这里生成416*416*3的array,每个元素值为128
canvas = np.full((inp_dim[1], inp_dim[0], 3), 128)
# 将w*h*3的array中对应new_wxnew_h*3的部分(这两个部分的中心应该对齐)赋值为刚刚由原图缩放得到的数组,得到最终缩放后图片
canvas[(h-new_h)//2:(h-new_h)//2 + new_h,(w-new_w)//2:(w-new_w)//2 + new_w, :] = resized_image
return canvas
if __name__ == '__main__':
# 图片所在路径
path = 'E:\结肠息肉\VPS-main\yolov5\data\images\\bus.jpg'
img = plt.imread(path)
inp_dim = (416, 416)
imgResized = letterbox_image(img, inp_dim)
# 展示原图和resized的图片
fig, axs = plt.subplots(1, 2)
fig.suptitle('resizeimg')
axs[0].set_title('original')
axs[0].imshow(img)
# plt.show()
axs[1].set_title('resized')
axs[1].imshow(imgResized)
plt.show()