对图片进行裁剪预处理
image
本文字数:535 字 | 阅读时长 ≈ 2 min

对图片进行裁剪预处理

image
本文字数:535 字 | 阅读时长 ≈ 2 min

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

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

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

第一种

PIL 的 Image 库 进行裁减

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) 类型

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")
4月 06, 2025
3月 10, 2025
12月 31, 2024