python实现yolov3中图像尺寸变化

参考链接: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()
    
    


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值