目录
- 一、前言
- 二、图像处理
- 下面为常见的图像变换
- 1.原始图片
- 2.调整图片大小transforms.Resize
- 2.1.transforms.Resize(x)
- 2.2.transforms.Resize([x, y])
- 2.3关于图片的恢复
- 3.图片裁剪
- 3.1中心裁剪transforms.CenterCrop
- 3.2随机裁剪transforms.RandomCrop(size,padding=None,pad_if_needed=False,fill=0,padding_mode='constant')
- 3.3transforms.RandomResizedCrop
- 4.图片翻转与旋转
- 4.1.transforms.RandomHorizontalFlip(p=0.5)水平翻转
- 4.2transforms.RandomVerticalFlip垂直翻转
- 4.3旋转transforms.RandomRotation
- RandomRotation(degrees,resample=False,expand=False,center=None)
- 参考博客与资料:
一、前言
在学习自己的项目发现自己有很多基础知识不牢,对于图像处理有点不太清楚,因此写下来作为自己的笔记,主要是我想自己动手写一下每一句代码到底做了什么,而不是单纯的我看了知道了它做了什么,说白了,不想停在看,而是要真正自己敲。
本文基于的是pytorch2.7.1
二、图像处理
深度学习是由数据驱动的,而数据的数量和分布对于模型的优劣具有决定性作用,所以我们需要对数据进行一定的预处理以及数据增强,用于提升模型的泛化能力。
一般来说深度学习神经网络训练前都需要做数据增强 (Data Augmentation) 又称为数据增广、数据扩增,它是对 训练集 进行变换,使训练集更丰富,从而让模型更具 泛化能力。
下面为常见的图像变换
1.原始图片
显示图片,并读取图片大小
from torchvision import transforms
from PIL import Image # 用于读取图片
import matplotlib.pyplot as plt # 用于显示图片
image_path = './dog.jpg'
image = Image.open(image_path)
plt.imshow(image)
print(image.size)
plt.show()
图片大小(1024, 683)
2.调整图片大小transforms.Resize
2.1.transforms.Resize(x)
主要用于调整PILImage对象的尺寸大小,图片短边缩放至x,长宽比保持不变
将图片短边缩放至x,长宽比保持不变,上述图片执行transforms.Resize(300)
from torchvision import transforms
from PIL import Image # 用于读取图片
import matplotlib.pyplot as plt # 用于显示图片
# 图片显示,打印图片大小
image_path = './dog.jpg'
image = Image.open(image_path)
resize = transforms.Resize()
image = resize(image)
plt.imshow(image)
print(image.size)
plt.show()
图片大小(449, 300)
得到如下
2.2.transforms.Resize([x, y])
同时指定图片长宽,这样会改变长宽比例但是不是裁剪,可以恢复
from torchvision import transforms
from PIL import Image # 用于读取图片
import matplotlib.pyplot as plt # 用于显示图片
# 图片显示,打印图片大小
image_path = './dog.jpg'
image = Image.open(image_path)
resize = transforms.Resize([, 300])
image = resize(image)
plt.imshow(image)
print(image.size)
plt.show()
图片大小(512, 300)
2.3关于图片的恢复
测试代码
from torchvision import transforms
from PIL import Image # 用于读取图片
import matplotlib.pyplot as plt # 用于显示图片
# 图片显示,打印图片大小
image_path = './dog.jpg'
image = Image.open(image_path)
w, h = image.size
resize = transforms.Resize([, 300])
image = resize(image)
resize = transforms.Resize([h, w])
image = resize2(image1)
plt.imshow(image)
print(image.size)
plt.show()
图片大小(1024, 683)
注意这里要使用transforms.Resize([h, w])
3.图片裁剪
3.1中心裁剪transforms.CenterCrop
作用:中心裁剪图片
主要参数:size,表示需要裁剪的图片大小
代码示例:
from torchvision import transforms
from PIL import Image
import matplotlib.pyplot as plt
transform = transforms.CenterCrop()
image_path= "./dog.jpg"
image = Image.open(image_path)
image = transform(image)
plt.imshow(image)
print(image.size)
plt.show()
image.save('./dog_clipping.jpg')
图片大小(512, 512)
3.2随机裁剪transforms.RandomCrop(size,padding=None,pad_if_needed=False,fill=0,padding_mode='constant')
主要参数:
size:为需要裁剪的图片大小
padding:设置填充大小
大小为a:表示上下左右都填充a个元素
大小为(a, b):表示左右填充a个元素,上下填充b个元素
大小为(a, b, c, d):表示左上右下填充a, b, c, d个元素
pad_if_needed:若图像小于设定 size,则填充,此时该项需要设置为 True
padding_mode:填充模式,主要有四种
- constant:像素值由 fill 设定。
- edge:像素值由图像边缘像素决定。
- reflect:镜像填充,最后一个像素不镜像,例如 [1, 2, 3, 4] → [3, 2, 1, 2, 3, 4, 3, 2]。
- symmetric:镜像填充,最后一个像素镜像,例如 [1, 2, 3, 4] → [2, 1, 1, 2, 3, 4, 4, 3]。
fill:当填充模式为padding_mode的填充值
代码示例:
from torchvision import transforms
import matplotlib.pyplot as plt
from PIL import Image
transform = transforms.RandomCrop(size=(, 512), padding=50, pad_if_needed=True, fill=0,padding_mode="constant")
image_path = "./dog.jpg"
image = Image.open(image_path)
random_crop_image = transform(image)
print(random_crop_image.size)
plt.imshow(random_crop_image)
plt.show()
random_crop_image.save("./random_crop_image.jpg")
图片大小(512, 512)
3.3transforms.RandomResizedCrop
RandomResizedCrop(size,scale=(0.08,1.0),ratio=(3/4,4/3),interpolation)
将给定图像随机裁剪为不同的大小和宽高比,然后缩放所裁剪得到的图像为制定的大小;
主要参数:
size:为最终图片要resize的大小
scale:为随机采样最少要覆盖原图的比例,在resize前
ratio:为随机采样宽高的比例,也在resize前
interpolation:插值方法
代码示例:
from torchvision import transforms
import matplotlib.pyplot as plt
from PIL import Image
transform = transforms.RandomResizedCrop(size=(, 256),
scale=(.08, 1),
ratio=(/ 4, 4/3),
interpolation=Image.NEAREST)
image_path = "./dog.jpg"
image = Image.open(image_path)
random_resize_crop_image = transform(image)
print(random_resize_crop_image.size)
plt.imshow(random_resize_crop_image)
plt.show()
random_resize_crop_image.save("./dog_random_resize_crop.jpg")
图片大小(256, 256)
4.图片翻转与旋转
4.1.transforms.RandomHorizontalFlip(p=0.5)水平翻转
p为旋转的概率
代码示例:
from torchvision import transforms
import matplotlib.pyplot as plt
from PIL import Image
transform = transforms.RandomHorizontalFlip(p=.7)
image_path = "./dog.jpg"
image = Image.open(image_path)
RandomHorizontalFlip_image = transform(image)
print(RandomHorizontalFlip_image.size)
plt.imshow(RandomHorizontalFlip_image)
plt.show()
RandomHorizontalFlip_image.save("./RandomHorizontalFlip_image.jpg")
图片大小(1024, 683)
4.2transforms.RandomVerticalFlip垂直翻转
代码示例
from torchvision import transforms
import matplotlib.pyplot as plt
from PIL import Image
transform = transforms.RandomVerticalFlip(p=.8)
image_path = "./dog.jpg"
image = Image.open(image_path)
RandomVerticalFlip_image = transform(image)
print(RandomVerticalFlip_image.size)
plt.imshow(RandomVerticalFlip_image)
plt.show()
RandomVerticalFlip_image.save("./RandomVerticalFlip_image.jpg")
图片大小(1024, 683)
4.3旋转transforms.RandomRotation
RandomRotation(degrees,resample=False,expand=False,center=None)
主要参数:
- degrees:旋转角度。
当为 a 时,在 (-a, a) 之间随机选择旋转角度。
当为 (a, b) 时,在 (a, b) 之间随机选择旋转角度。
- resample:重采样方法。
- expand:是否扩大图片,以保持原图信息。
- center:旋转点设置,默认中心旋转
代码示例:
from torchvision import transforms
import matplotlib.pyplot as plt
from PIL import Image
transform = transforms.RandomRotation(degrees=,resample=False, expand=True, center=None, fill=0)
image_path = "./dog.jpg"
image = Image.open(image_path)
RandomRotation_image = transform(image)
print(RandomRotation_image.size)
plt.imshow(RandomRotation_image)
plt.show()
RandomRotation_image.save("./RandomRotation_image.jpg")
图片大小(1214, 1203)
参考博客与资料:
Pytorch transforms.Resize()的简单用法
PyTorch 08:transforms 数据增强:裁剪、翻转、旋转
Pytorch中transforms.RandomResizedCrop()等图像操作
Illustration of transforms — Torchvision main documentation (pytorch.org)