利用PIL进行比例不失真的resize以及resize回去

该代码段使用Python的PIL库进行图像处理,包括将图像按比例缩放至指定尺寸及将缩放后的图像恢复到其原始尺寸。函数resize()用于缩小图像,resize_back()则用于将图像裁剪回原始大小。在主函数中,展示了这三个步骤的可视化结果并保存为demonstrate.jpg。
摘要由CSDN通过智能技术生成
from PIL import Image
import os
import matplotlib.pyplot as plt


def resize(image_,image_size_):
    """args:
    image_: PIL image\n
    image_size_: input_shape[:-1]
    """
    old_size = image_.size
    ratio = image_size_[0]/max(old_size)
    new_size = tuple([int(x*ratio) for x in old_size])
    # image
    image_ = image_.resize(new_size,Image.Resampling.NEAREST)
    new_image = Image.new("RGB",(image_size_[0],image_size_[1]))
    new_image.paste(image_,((image_size_[0]-new_size[0])//2,
                            (image_size_[1]-new_size[1])//2))

    return new_image

def resize_back(image_,image_size_):
    """args:\n
    image_ : 预测得到的图片结果\n
    image_size_: 预测图片的原始大小\n
    return: 原始大小的预测结果图片\n
    """
    old_size = image_.size
    ratio = old_size[0]/max(image_size_)
    new_size = tuple([int(x*ratio) for x in image_size_])

    up_left_x = (old_size[0]-new_size[0])//2
    up_left_y = (old_size[1]-new_size[1])//2
    bottom_right_x = up_left_x + new_size[0]
    bottom_right_y = up_left_y + new_size[1]

    back_image = image_.crop((up_left_x,up_left_y,bottom_right_x,bottom_right_y))
    back_image.resize(image_size_)

    return back_image

if __name__ == '__main__':
    test_filename = "Abyssinian_19"
    image_dir = "/home/data/hablee_data_dir/seg_2d/val/JPEGImages/"
    image_path = os.path.join(image_dir,test_filename+".jpg")
    image = Image.open(image_path)
    org_size = image.size

    plt.subplot(1,3,1)
    plt.title("orginal image")
    plt.imshow(image)

    desird_size = (512,512)
    new_image = resize(image,desird_size)
    plt.subplot(1,3,2)
    plt.title("resized image")
    plt.imshow(new_image)

    back_image = resize_back(new_image,org_size)
    plt.subplot(1,3,3)
    plt.title("resize_back image")
    plt.imshow(back_image)

    plt.savefig("demonstrate.jpg")

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值