文章目录

  • 1 总体简介
  • 2 实现效果
    • 2.1 直接缩放,不怕变形
    • 2.2 不变形缩放/letterbox_image
      • 2.2.1 不变形缩放,两端填充灰边
      • 2.2.2 不变形缩放,一端填充灰边
  • 3 代码运行

1 总体简介

对图像进行预处理操作的时候,一般有两种缩放方式。

  • 一种是直接宽、高缩放至想要的宽、高,这种方式快捷,但可能会导致图像变形

  • 一种是等比例缩放,然后用灰色边缘填充
    step1: 计算宽高缩放比例,选择较小的那个缩放系数;
    step2: 计算缩放后的尺寸: 原始图片的长宽都乘以较小的缩放系数;
    step3:计算短边需要填充的灰边数,将短边的两边各自填充一半的灰行即可。

2 实现效果

2.1 直接缩放,不怕变形

针对直接缩放的方式,主要代码如下,全部代码实现见最下方

new_image = image.resize((target_w, target_h), Image.BICUBIC)

2.2 不变形缩放/letterbox_image

2.2.1 不变形缩放,两端填充灰边

yolov3使用这个方案

2.2.2 不变形缩放,一端填充灰边

Yolov5使用这个方案,是Yolov5推理速度能够很快的一个trick

很多图片的长宽比不同导致缩放填充后,两端的黑边大小都不同。而如果填充的比较多,则存在信息冗余,影响推理速度。YOLOv5作者对letterbox的缩放策略进行了修改,对原图自适应的添加最少的黑边。

计算方法:

  1. 计算原始图片宽高与输入尺寸的缩放比例rw和rh,选取r = min(rw,rh)后把原图按r进行缩放
  2. 原图宽和高中一定有一边完全贴合输入尺寸,没有达到输入尺寸的一边计算与输入尺寸的差值,然后进行上下(or左右)的填充。

3 代码运行

import matplotlib.pyplot as plt
from PIL import Image# ------------------------------------------------------------------------#
#   对输入图像进行resize,他人测试发现,不用letterbox_image直接resize的效果更好
# ------------------------------------------------------------------------#
def resize_image(image, size, letterbox_image):iw, ih  = image.sizew, h    = size      # w=200, h=300if letterbox_image:scale   = min(w/iw, h/ih)nw      = int(iw*scale)nh      = int(ih*scale)image   = image.resize((nw,nh), Image.BICUBIC)# 新建一张image,第二个参数表示尺寸,第三个参数表示颜色new_image = Image.new('RGB', size, (128,128,128))       # --------------------------------------------------------------##     不变形resize,两端填充灰边#   image.paste函数表示将一张图片覆盖到另一张图片的指定位置去#   a.paste(b, (50,50))   将b的左上顶点贴到a的坐标为(50,50)的位置,#   左上顶点为(0,0), b超出a的部分会被自动舍弃# --------------------------------------------------------------## new_image.paste(image, ((w-nw)//2, (h-nh)//2))   # ---------------------------------------------------##    不变形resize,一端填充灰边# ---------------------------------------------------#new_image.paste(image, (0, 0))      else:new_image = image.resize((w, h), Image.BICUBIC)return new_imageimg_PIL = Image.open("Avatar.jpg")
# ---------------------------------------------------#
# 第二参数表示目标尺寸,第三参数表示是否使用letterbox
# ---------------------------------------------------#
img = resize_image(img_PIL, (200, 300), True)   plt.imshow(img)
plt.show()

【图片resize】图片三种缩放方式/letterbox_image实现相关推荐

  1. Kotlin实战练习——自定义圆形图片三种实现方式

    Kotlin实战练习--自定义圆形图片三种实现方式 前言 如今Kotlin越来越重要,本人也开始了Kotlin的学习.为了检测学习效果,加深学习印象,同时回顾一下以前的一些知识点,决定从写一个自定义圆 ...

  2. 打开桌面计算机图片,电脑桌面截图呢?三种截图方式

    在日常工作的时候,经常会需要截图工具来截取一些图片用于保存,特别是有的时候,图片需要特定尺寸的时候,截图方法是最便捷的,但是很多人对电脑截图并不是很熟悉,电脑桌面截图呢?今天就给大家讲解一下三种截图方 ...

  3. 实现精灵图片绝对定位的三种方式(伪)

    精灵图片绝对定位的三种方式(伪) 有强迫症的我为此困扰了一上午,说白了还是自己实力不够,想法总被局限. 实现结果如上图中间的为最终满意样品 整体用列表写的` 左1: 把整体看成一个背景图加上面文字: ...

  4. 相似图片搜索的三种算法

    相似图片搜索的三种算法 想必大家都用google或baidu的识图功能,上面就是我搜索冠希哥一幅图片的结果,这种搜索的核心算法有三种,都是利用信息指纹比较,这些算法都很易懂,下面分别介绍一下: 一.平 ...

  5. c# pictureBox1.Image的获得图片路径的三种方法 winform

    代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径: this.pictureBox2.Image=Image.FromFile("D: ...

  6. 如何提高图片清晰度?三种方法来帮你!

    如何提高图片清晰度?图片在上传到网络后会被压缩,导致图片变得模糊.今天,我将分享三种方法,帮助您提高图片的清晰度. 方法一:使用记灵在线工具 工具地址:记灵在线工具 - 更专注于发现工具的实用性 该工 ...

  7. C# 三种打印方式含代码

    一:C#代码直接打印pdf文件(打印质保书pdf文件) 引用: 代码注释很详细了. private void btn_pdf_Click(object sender, RoutedEventArgs ...

  8. png转iconfont_关于阿里图标库Iconfont生成图标的三种使用方式-新闻详情

    关于阿里图标库Iconfont生成图标的三种使用方式 发布时间:2017-07-28责任编辑:朱明 浏览:1843 相信做过前端的都知道阿里巴巴矢量图标库,这是一个非常好用的添加小图标的方法,而且是完 ...

  9. Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

    阅读目录 一.MVC与MTV 二.多对多表的创建 三.ajax,前后端传输编码格式contentType 四.批量插入数据与自定义分页器 摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端 ...

  10. 线程的三种创建方式以及代码实现

    线程和进程的概念 一个进程可以有多个线程 程序:是指令和数据的有序集合(静态的) 进程:是执行程序的一次执行过程(动态的),是系统资源分配的单位.在操作系统中运行的程序就是进程. 通常在一个进程中可以 ...

最新文章

  1. android测量的三种模式
  2. 迁移学习之InceptionV3(159层),Xception(126层),Inception_ResNet_V2(572层)(图像识别)
  3. linux dry run,dry run
  4. Oracle递归操作
  5. cross--向量或矩阵的叉乘
  6. 简单线性回归预测实现
  7. C学习杂记(六)%2.0f打印输出宽度
  8. 修改场景默认pawn的方法
  9. 微软 SQL Server 2019 将免费支持 Java;Rancher Labs获2500万美元融资;腾讯云进军日本市场……...
  10. CVPR2019 | AlphaPose升级!上交大开源密集人群姿态估计代码
  11. 《精通Spring MVC 4》——1.3 start.Spring.io简介
  12. C#一次性删除委托中的所有方法
  13. Happy Birthday to You
  14. 对象tostring后怎么转成对象_对象出轨了怎么办?对象出轨正常处理方式
  15. 【VMware vSAN 7.0】5.4.2 创建 vSAN 集群—我们有软硬件解决方案
  16. 小米台灯突然自己亮了_除了彩屏和小爱,还有哪些升级?——小米手环4 NFC版...
  17. 使用ArcGIS Engine提供的命令和工具(ICommond,ITool)实现MapView操作
  18. mock.js使用指南
  19. mac下密码加密zip,暴力破解zip,生成密钥字典
  20. 小米4充不了电处理办法(图文)小米4不能充电的维修教程

热门文章

  1. python+openCV滑动条的使用
  2. 小学二年级计算机课游戏,小学体育课游戏_求10种左右适合小学一二年级学生体育课上做的游戏...
  3. (一)来自 192.168.xx.xx的回复: TTL 传输中过期。
  4. 电商直播的直播类型有哪些?
  5. 「鸡蛋返生」美国早就在搞了好吧
  6. 前端自动化测试 之 视觉测试
  7. 维斯易联网络打印机配置教程
  8. 以太坊的单位wei是什么?
  9. android 侧滑删除功能,RecyclerView侧滑删除功能
  10. 颠覆思维,你也能懂量子力学