对图片进行裁剪预处理

Dataloader数据读取之前,需要对图片进行处理,这里展示了两种在Dataset中对图片随机裁减的方法

首先我们有一批数据,我们需要对数据进行预处理,假设图片的大小是随机的,对于大于(3, 256, 256)的图片,我们对他进行随机的裁减,变为(3, 256, 256),对于小于(3, 256, 256)的图片,我们将其进行填充,最后我们将图片进行保存(注意在模型训练过程中是没有这一步的,这里只是为了方便演示结果)

预处理的过程一般在Dataset__getitem__()函数中进行修改

第一种

PIL的Image库进行裁减

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from PIL import Image
import random

im = Image.open("12300.jpg")
# 图片的宽度和高度
ww, hh = im.size
print("图片宽度和高度分别是", ww, hh)

# 元组里的元素分别是:
# 距离图片左边界距离x, 距离图片上边界距离y
# 距离图片左边界距离+裁剪框宽度x+w,距离图片上边界距离+裁剪框高度y+h
# 截取图片中一块宽是256和高是256的
patch_size = 256
www = random.randint(0, ww-patch_size)
hhh = random.randint(0, hh-patch_size)

# crop
x = www
y = hhh
w = 256
h = 256
region = im.crop((x, y, x+w, y+h))
region.save("./12300restore.jpg")

第二种

读取为tensor后进行裁减
Image.open得到的图像经过torchvision.transforms.functional.to_tensor后为(c, h, w)类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import torch
import random
from PIL import Image
import torchvision.transforms.functional as TF
from torchvision import utils as vutils

def save_image_tensor(input_tensor: torch.Tensor, filename):
"""
将tensor保存为图片
:param input_tensor: 要保存的tensor
:param filename: 保存的文件名
"""
# assert (len(input_tensor.shape) == 4 and input_tensor.shape[0] == 1)
# 复制一份
input_tensor = input_tensor.clone().detach()
# 到cpu
input_tensor = input_tensor.to(torch.device('cpu'))
# 反归一化
# input_tensor = unnormalize(input_tensor)
vutils.save_image(input_tensor, filename)


im = Image.open("12300.jpg")
# 图片的宽度和高度
ww, hh = im.size
print("图片宽度和高度分别是", ww, hh)

# 转化为tensor形式
patch_size = 256
im = TF.to_tensor(im)

# 随机crop
hhh = random.randint(0, hh-patch_size)
www = random.randint(0, ww-patch_size)
im = im[:, hhh:hhh+patch_size, www:www+patch_size]

save_image_tensor(im, "./aaaaa.jpg")