前言
有时候我们需要把图片填充成某个数字的整数倍才能送进模型。
例如,有些模型下采样倍率是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)
到此这篇关于python图像填充与裁剪/resize的文章就介绍到这了,更多相关python图像resize内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!