python图像填充与裁剪/resize的实现代码
作者:Andy?Dennis 发布时间:2022-07-12 07:49:15
标签:python,图像,resize,裁剪,填充
前言
有时候我们需要把图片填充成某个数字的整数倍才能送进模型。
例如,有些模型下采样倍率是8倍,或者16倍,那么输入的长和高就分别应该是8或16的整数倍。如果图片达不到,除了拉伸图像(会造成比例改变),另一种就是先填充,后裁剪。
相信搞过NLP的同学并不陌生啦。
代码
from math import ceil
from torchvision.transforms.functional import to_tensor, to_pil_image
from PIL import Image
import torch
# 填充到最接近base整数倍的长和宽图像大小
def get_padding_pic_mask(origin_png, result_png, result_mask_png, rgb=[[130, 206, 255]], base=4):
# C, H, W
src = Image.open(origin_png)
src = to_tensor(src)
# print(src.shape) # torch.Size([3, 800, 600])
# channel: (R, G, B) / 255
origin_h, origin_w = src.shape[1], src.shape[2]
print('原图像大小, height: {}, width: {}'.format(origin_h, origin_w))
h = ceil(origin_h / base) * base
w = ceil(origin_w / base) * base
img = torch.ones(3, h, w)
# 如果想要填充是黑色则注释掉上一句,换下面这一句
# img = torch.zeros(3, h, w)
img[:, :origin_h, :origin_w] = src
# 保存填充后的图片
to_pil_image(img).save(result_png)
# 处理一下mask
mask = torch.tensor(rgb) / 255
mask = mask.view(3, 1, 1).repeat(1, h, w)
# 保存填充后的mask
to_pil_image(mask).save(result_mask_png)
# 图像输出后我们需要clip一下
def clip_unpadding(input_png, output_png, origin_h, origin_w):
# C, H, W
img = Image.open(input_png)
img = to_tensor(img)
img = img[:, :origin_h, :origin_w]
# 保存裁剪后的图片
to_pil_image(img).save(output_png)
if __name__ == '__main__':
# origin_png = 'pic/pic.jpg'
# result_png = 'pic/pic_padding.jpg'
# result_mask_png = 'pic/mask_padding.jpg'
# get_padding_pic_mask(origin_png, result_png, result_mask_png)
input_png = 'pic/pic_padding.jpg'
output_png = 'pic/pic_clip.jpg'
# 原图像大小, height: 567, width: 390
clip_unpadding(input_png, output_png, 567, 390)
resize
有时候我们也要改变图片的宽和高。
from PIL import Image
def resize_img(origin_png, resize_png, height, width):
img = Image.open(origin_png)
img = img.resize((width, height))
img.save(resize_png)
if __name__ == '__main__':
origin_png = 'pic/white.jpg'
resize_png = 'pic/white_resize.png'
resize_img(origin_png, resize_png, 800, 600)
来源:https://blog.csdn.net/weixin_43850253/article/details/126445783
0
投稿
猜你喜欢
- 目录前言:另一用法sort 与 sorted 区别:前言:加入我需要对如下几个文件按照从下到大排序,可是他的关键字有多个应该怎么办了?例如我
- 跨浏览器方法function getStyle(elem, cssprop, cssprop2){ if(elem.currentStyle
- 环境:python3 + unittest + requestsExcel管理测试用例,HTMLTestRunner生成测试报告测试完成后邮
- 一、使用装饰器实现单例def Singleton(cls): _instance = {}
- V5.0之后,我们总结了一些得失。首先要说的是改版的动力。产品设计或产品升级的驱动力只有两个:用户需求和网站目标。之前的我们的多次改版,其驱
- 遇到一个难题,在无物理键盘情况下,通过页面软键盘在页面文本框输入汉字,不知道51js的各位大牛有没有遇到过这种需求,如果遇到过是如何解决的,
- 1.linux下启动mysql的命令:mysqladmin start/ect/init.d/mysql start (前面为mysql的安
- 这是一个给新手学习代码的帖子,包含以下内容:如何使用UBB代码,如何用js与剪贴板交互,如何使用textRange对象,如何使用自定义的快捷
- 安装laravel框架命令行cd进入指定目录下,执行composer create-project --prefer-dist larave
- 前言上回说到我们如何把拉勾的数据抓取下来的,既然获取了数据,就别放着不动,把它拿出来分析一下,看看这些数据里面都包含了什么信息。(本次博客源
- list的话题的确不少,而且,在编程中,用途也非常多。有看官可能要问了,如果要生成一个list,除了要把元素一个一个写上之外,有没有能够让计
- 看下面的例子就会明白了: print '|','*'.ljust(10),'|' print
- 基本原理讲解:高斯模糊的算法高斯核函数的编写:构建权重矩阵,采用高斯二维分布函数的形式进行处理。需要注意的是,这里我没有特判当sigma =
- Python对不可变序列进行重复拼接操作效率会很低,因为每次都会生成一个新的对象,解释器需要把原来对象中的元素先复制到新的对象里,然后再追加
- 如下所示:a = [1,2,3,4,5,6,7,8,9,10,11]step = 3b = [a[i:i+step] for i in ra
- 问题:“深入认识Python内建类型”这部分的内容会从源码角度为大家介绍Python中各种常用的内建
- 本文实例讲述了Python list列表中删除多个重复元素操作。分享给大家供大家参考,具体如下:我们以下面这个list为例,删除其中所有值为
- 本文所述实例可以实现基于Python的查看图片报纸《参考消息》并将当天的图片报纸自动下载到本地供查看的功能,具体实现代码如下:# codin
- 刚开始学习tensorflow,还不太会用,开个博记录,今天遇到一个问题是用tf.layers.dense创建的全连接层,如何查看权重?知道
- Numpy 是Python科学计算的一个核心模块。它提供了非常高效的数组对象,以及用于处理这些数组对象的工具。一个Numpy数组由许多值组成