概述
最近需要制作一个数据集,由于数据集的数量不够,而这些数据集中的单张照片很大,因此可以通过裁剪的方式进行数据增强,从而获取到更多的数据,扩充数据集。在这个过程中还要将裁剪得到的图片保存下来。
实现方式
- 使用
PIL.Image.open()
获取图片; - 将图片Resize(),这个不是必须,本人使用是因为原图像太大了(可能得20482048以上),而我要裁剪的是256256,这样区域太小了,因此用 Resize() 缩小图片,在不丢失重要信息的情况下,让裁剪到的图片所含的区域更大。
- 遍历使用 torchvision 中的 transforms.RandomCrop() 对图像进行裁剪(代码中使用了3次for循环)
- 将图片以给定格式的命名方式保存,一次裁剪多张的话,路径需要动态获取。
项目结构及代码
项目结构:
其中,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
项目结构:
输出了裁剪后的图片,并且文件名根据for循环中的参数,实现了动态变化。
结果对比:
- 原图像:
- 获取的裁剪后的图像:
补充
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
对文件夹里的所有图片批量裁剪
此处是后续对于本文的补充,请看补充的博文: