深度学习训练时为了满足数据batch化,需要将图片都放缩到相同的尺寸,如果直接放缩会导致宽高比发生变化,剪切又会丢失信息。比较合理的做法是宽和高以相同的比例缩放,缺失的部分用固定的值填充。

具体步骤如下:

  • 先初始化一个目标尺寸的幕布,值全为相同的数。
  • 将原图中的较长的边放缩到目标尺寸大小,计算出放缩的比例,使短边也按照这个比例进行放缩,这样得到的图片就不会产生形变。
  • 放缩后的图像一定小于等于目标尺寸,所以一定可以将它粘贴在幕布的中央,那么幕布中没有被覆盖的地方就自动变成了留白,省去了填充的步骤。
  • 最后的幕布就是最终想要的图片。

程序

import numpy as np
from PIL import Image



def resize(img, size):
    # 先创建一个目标大小的幕布,然后将放缩好的图片贴到中央,这样就省去了两边填充留白的麻烦。
    canvas = Image.new("RGB", size=size, color="#7777")  
    
    target_width, target_height = size
    width, height = img.size
    offset_x = 0
    offset_y = 0
    if height > width:              # 高 是 长边
        height_ = target_height     # 直接将高调整为目标尺寸
        scale = height_ / height    # 计算高具体调整了多少,得出一个放缩比例
        width_ = int(width * scale) # 宽以相同的比例放缩
        offset_x = (target_width - width_) // 2     # 计算x方向单侧留白的距离
    else:   # 同上
        width_ = target_width
        scale = width_ / width
        height_ = int(height * scale)
        offset_y = (target_height - height_) // 2

    img = img.resize((width_, height_), Image.BILINEAR) # 将高和宽放缩
    canvas.paste(img, box=(offset_x, offset_y))         # 将放缩后的图片粘贴到幕布上
    # box参数用来确定要粘贴的图片左上角的位置。offset_x是x轴单侧留白,offset_y是y轴单侧留白,这样就能保证能将图片填充在幕布的中央
    
    return canvas


img= Image.open('1.jpg')

target__size=(500,300)  # 目标尺寸:宽为500,高为300
res = resize(img,target__size)

res.save('new.jpg')

测试

输入(1080x1440)

输出(500x300)



Solryu
18 声望6 粉丝