【图片resize】图片三种缩放方式/letterbox_image实现

文章目录

1 总体简介

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

  • 一种是直接宽、高缩放至想要的宽、高,这种方式快捷,但可能会导致图像变形
  • 一种是等比例缩放,然后用灰色边缘填充
    step1: 计算宽高缩放比例,选择较小的那个缩放系数;
    step2: 计算缩放后的尺寸: 原始图片的长宽都乘以较小的缩放系数;
    step3:计算短边需要填充的灰边数,将短边的两边各自填充一半的灰行即可。

2 实现效果

2.1 直接缩放,不怕变形

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

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

【图片resize】图片三种缩放方式/letterbox_image实现

2.2 不变形缩放/letterbox_image

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

yolov3使用这个方案

【图片resize】图片三种缩放方式/letterbox_image实现

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

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

【图片resize】图片三种缩放方式/letterbox_image实现

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

计算方法:

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

3 代码运行

import matplotlib.pyplot as plt
from PIL import Image

def resize_image(image, size, letterbox_image):
    iw, ih  = image.size
    w, h    = size
    if letterbox_image:
        scale   = min(w/iw, h/ih)
        nw      = int(iw*scale)
        nh      = int(ih*scale)

        image   = image.resize((nw,nh), Image.BICUBIC)

        new_image = Image.new('RGB', size, (128,128,128))

        new_image.paste(image, (0, 0))
    else:
        new_image = image.resize((w, h), Image.BICUBIC)
    return new_image

img_PIL = Image.open("Avatar.jpg")

img = resize_image(img_PIL, (200, 300), True)

plt.imshow(img)
plt.show()

Original: https://blog.csdn.net/weixin_45377629/article/details/124027705
Author: 寻找永不遗憾
Title: 【图片resize】图片三种缩放方式/letterbox_image实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/690754/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球