【数据增强】---- 使用 Pytorch 裁剪图片并保存

文章目录

  • 概述
  • 实现方式
  • 项目结构及代码
  • 输出结果
  • 补充
  • 对文件夹里的所有图片批量裁剪

概述

最近需要制作一个数据集,由于数据集的数量不够,而这些数据集中的单张照片很大,因此可以通过裁剪的方式进行数据增强,从而获取到更多的数据,扩充数据集。在这个过程中还要将裁剪得到的图片保存下来。


实现方式

  1. 使用 PIL.Image.open() 获取图片;
  2. 将图片Resize(),这个不是必须,本人使用是因为原图像太大了(可能得20482048以上),而我要裁剪的是256256,这样区域太小了,因此用 Resize() 缩小图片,在不丢失重要信息的情况下,让裁剪到的图片所含的区域更大。
  3. 遍历使用 torchvision 中的 transforms.RandomCrop() 对图像进行裁剪(代码中使用了3次for循环)
  4. 将图片以给定格式的命名方式保存,一次裁剪多张的话,路径需要动态获取。

项目结构及代码

项目结构:
【数据增强】---- 使用 Pytorch 裁剪图片并保存_第1张图片
其中,lxh.png就是要裁剪的图片,crop_random.py 是代码。

代码 crop_random.py :

import PIL.Image as Image
import os
from torchvision import transforms as transforms

# pytorch提供的torchvision主要使用PIL的Image类进行处理,所以它数据增强函数大多数都是以PIL作为输入,并且以PIL作为输出。
# 读取图片
def read_PIL(image_path):
    image = Image.open(image_path)
    return image

# 获取读到图片的不带后缀的名称
def get_name(image):
    im_path = image.filename
    im_name = os.path.split(im_path)    # 将路径分解为路径中的文件名+扩展名,获取到的是一个数组格式,最后一个是文件名
    name = os.path.splitext(im_name[len(im_name) - 1])     # 获取不带扩展名的文件名,是数组的最后一个
    return name[0] # arr[0]是不带扩展名的文件名,arr[1]是扩展名

# 将图片Reszie
def resize_img(image):
    Resize = transforms.Resize(512)
    resize_img = Resize(image)
    return resize_img

# 随机裁剪
def random_crop(image):
    RandomCrop = transforms.RandomCrop(size=(256, 256))
    random_image = RandomCrop(image)
    return random_image

##################################################################################################

# 读取图片
image = read_PIL('data/lxh.png')
print(image.size)  # 输出原图像的尺寸
name = get_name(image) # 获取读到图片的不带后缀的名称

# 创建输出目录
outDir = 'data_crop/'
os.makedirs(outDir, exist_ok=True)

resie_img = resize_img(image) # 将图片Resize
print(resie_img.size)  # 输Resie后的图像的尺寸

# 随机裁剪 3 次固定大小并保存
for i in range(3):
    random_cropped_image = random_crop(resie_img)  # 随机裁剪
    random_cropped_image.show()  # 显示裁剪后的图片
    out_name = name + '_crop_' + str(i) + '.png'
    print(out_name)
    random_cropped_image.save(os.path.join(outDir, out_name))  # 按照路径保存图片

输出结果

控制台输出:

(1280, 720)
(910, 512)
lxh_crop_0.png
lxh_crop_1.png
lxh_crop_2.png

项目结构:
【数据增强】---- 使用 Pytorch 裁剪图片并保存_第2张图片
输出了裁剪后的图片,并且文件名根据for循环中的参数,实现了动态变化。


结果对比:

  • 原图像:
  • 获取的裁剪后的图像:
    【数据增强】---- 使用 Pytorch 裁剪图片并保存_第3张图片

补充

pytorch 中 transforms 提供5种裁剪方式,如:

  • CenterCrop(size)
  • FiveCrop(size)
  • RandomCrop(size[, padding, pad_if_needed, …])
  • RandomResizedCrop(size[, scale, ratio, …])
  • TenCrop(size[, vertical_flip])
    本文使用的是随机裁剪的方式,对于其他的使用类似,具体参考官方文档:https://pytorch.org/vision/stable/transforms.html#transforms-on-pil-image-only


对文件夹里的所有图片批量裁剪

此处是后续对于本文的补充,请看补充的博文:

【数据增强】— 使用 Pytorch 批量裁剪文件夹里图片并保存

你可能感兴趣的:(pytorch,pytorch,python,深度学习)