一、图像变换
1、transforms.Pad
transforms.Pad
是一个用于对图像边缘进行填充的数据转换操作。
参数:
padding
:设置填充大小。可以是单个整数,表示在上下左右四个方向上均填充相同数量的像素;也可以是一个包含两个整数的元组(a, b)
,表示在上下方向上填充b
个像素,在左右方向上填充a
个像素;还可以是一个包含四个整数的元组(a, b, c, d)
,分别表示在左、上、右、下四个方向上填充a, b, c, d
个像素。padding_mode
:填充模式,有四种模式可选:'constant'
:使用常数填充,填充值由fill
参数指定。'edge'
:使用图像边缘像素进行填充。'reflect'
:使用图像边缘像素的镜像进行填充。'symmetric'
:使用图像边缘像素的对称像素进行填充。
fill
:当padding_mode
为'constant'
时,设置填充的像素值。可以是一个包含三个整数的元组(R, G, B)
表示彩色图像的填充值,或者是一个整数表示灰度图像的填充值。
使用transforms.Pad
可以在图像的边缘进行填充,以增加图像的尺寸或保持图像的大小不变。
示例:
import torchvision.transforms as transforms
transform = transforms.Compose([
transforms.Pad(padding=2, fill=(255, 0, 0), padding_mode='constant')
])
# 对图像进行填充
padded_image = transform(image)
在上面的示例中,transforms.Pad(padding=2, fill=(255, 0, 0), padding_mode='constant')
将图像的边缘填充了2个像素,填充的像素值为红色 (255, 0, 0)。填充模式为 'constant'
,表示使用常数填充。
注意:填充操作通常在图像预处理阶段使用,以确保所有图像具有相同的尺寸或符合模型的输入要求。填充后的图像尺寸会增加,因此在应用填充之前需要考虑好图像的尺寸和比例关系。
2、transforms.ColorJitter
transforms.ColorJitter
是一个用于调整图像亮度、对比度、饱和度和色相的数据转换操作。
参数:
brightness
:亮度调整因子。可以是单个浮点数a
,表示在范围[max(0, 1-a), 1+a]
中随机选择亮度调整因子;也可以是一个包含两个浮点数的元组(a, b)
,表示在范围[a, b]
中选择亮度调整因子。contrast
:对比度参数,与亮度调整因子的使用方式相同。saturation
:饱和度参数,与亮度调整因子的使用方式相同。hue
:色相参数。可以是单个浮点数a
,表示在范围[-a, a]
中选择色相调整参数,注意0 <= a <= 0.5
;也可以是一个包含两个浮点数的元组(a, b)
,表示在范围[a, b]
中选择色相调整参数,注意-0.5 <= a <= b <= 0.5
。
使用transforms.ColorJitter
可以对图像进行亮度、对比度、饱和度和色相的随机调整,增加图像的多样性。
示例:
import torchvision.transforms as transforms
transform = transforms.Compose([
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1)
])
# 对图像进行颜色调整
adjusted_image = transform(image)
在上面的示例中,transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1)
将图像的亮度、对比度、饱和度和色相进行了随机调整,亮度调整因子在范围 [0.8, 1.2]
内随机选择,对比度调整因子在范围 [0.8, 1.2]
内随机选择,饱和度调整因子在范围 [0.8, 1.2]
内随机选择,色相调整参数在范围 [-0.1, 0.1]
内随机选择。
注意:颜色调整操作通常在图像增强和数据增强阶段使用,以增加模型对不同光照、对比度和饱和度等条件的鲁棒性。调整后的图像将具有不同的颜色外观,可以增加数据集的多样性。
3、transforms.RandomGrayscale
transforms.RandomGrayscale
和transforms.Grayscale
都是用于将图像转换为灰度图的数据转换操作。
transforms.RandomGrayscale
是一个随机操作,根据给定的概率将图像转换为灰度图。
num_output_channels
:输出通道数。可以是1或3。如果设置为1,则输出的灰度图像只有一个通道;如果设置为3,则输出的灰度图像会复制到三个通道,以便与彩色图像的通道数匹配。p
:概率值,表示图像被转换为灰度图的概率。取值范围为0到1之间,例如,设置为0.1表示有10%的概率将图像转换为灰度图。
使用transforms.RandomGrayscale
可以在数据增强过程中以一定的概率将图像转换为灰度图,增加数据集的多样性。
示例:
import torchvision.transforms as transforms
transform = transforms.Compose([
transforms.RandomGrayscale(num_output_channels=1, p=0.5)
])
# 对图像进行随机灰度转换
grayscale_image = transform(image)
在上面的示例中,transforms.RandomGrayscale(num_output_channels=1, p=0.5)
以50%的概率将图像转换为灰度图,输出的灰度图像只有一个通道。
4、transforms.Grayscale
transforms.Grayscale
是一个确定性操作,将图像转换为灰度图。
num_output_channels
:输出通道数。可以是1或3。如果设置为1,则输出的灰度图像只有一个通道;如果设置为3,则输出的灰度图像会复制到三个通道,以便与彩色图像的通道数匹配。
示例:
import torchvision.transforms as transforms
transform = transforms.Compose([
transforms.Grayscale(num_output_channels=1)
])
# 将图像转换为灰度图
grayscale_image = transform(image)
在上面的示例中,transforms.Grayscale(num_output_channels=1)
将图像转换为灰度图,输出的灰度图像只有一个通道。
注意:灰度图像只有一个通道,每个像素的值表示灰度级别。与彩色图像相比,灰度图像的信息量较少,但在某些场景中可以提供更加简洁和高效的特征表示。
5、transforms.RandomAffine
transforms.RandomAffine
是一个用于对图像进行随机仿射变换的数据转换操作。
参数:
degrees
:旋转角度范围。可以是一个单个的浮点数a
,表示在范围[-a, a]
内随机选择旋转角度;也可以是一个包含两个浮点数的元组(a, b)
,表示在范围[a, b]
内随机选择旋转角度。translate
:平移区间设置。可以是一个包含两个浮点数的元组(a, b)
,表示在宽度和高度维度上分别设置平移的区间。例如,如果设置为(0.1, 0.1)
,则图像在宽度维度上的平移区间为[-img_width * 0.1, img_width * 0.1]
,在高度维度上的平移区间为[-img_height * 0.1, img_height * 0.1]
。scale
:缩放比例。可以是一个单个的浮点数a
,表示在范围[1-a, 1+a]
内随机选择缩放比例;也可以是一个包含两个浮点数的元组(a, b)
,表示在范围[1-a, 1+b]
内随机选择缩放比例。缩放比例是以图像面积为单位的。shear
:错切角度范围。可以是一个单个的浮点数a
,表示在范围[-a, a]
内随机选择错切角度;也可以是一个包含两个浮点数的元组(a, b)
,表示在范围[a, b]
内随机选择错切角度。resample
:是否使用重采样方法。默认为False
,表示不使用重采样方法,采用最近邻插值;如果设置为True
,则使用双线性插值进行重采样。fillcolor
:填充颜色设置。可以是一个整数值,表示填充的颜色。
使用transforms.RandomAffine
可以对图像进行随机的仿射变换,包括旋转、平移、缩放、错切和翻转等操作,增加图像的多样性。
示例:
import torchvision.transforms as transforms
transform = transforms.Compose([
transforms.RandomAffine(degrees=10, translate=(0.1, 0.1), scale=(0.9, 1.1), shear=10)
])
# 对图像进行随机仿射变换
transformed_image = transform(image)
在上面的示例中,transforms.RandomAffine(degrees=10, translate=(0.1, 0.1), scale=(0.9, 1.1), shear=10)
将对图像进行随机的仿射变换,旋转角度在范围 [-10, 10]
内随机选择,平移区间设置为 (0.1, 0.1)
,缩放比例在范围 [0.9, 1.1]
内随机选择,错切角度在范围 [-10, 10]
内随机选择。
注意:仿射变换是二维的线性变换,由旋转、平移、缩放、错切和翻转等基本原子变换构成。通过对图像进行随机的仿射变换,可以增加数据集的多样性,提高模型的鲁棒性。
6、transforms.RandomErasing
transforms.RandomErasing
是一个用于对图像进行随机遮挡的数据转换操作。
参数:
p
:执行该操作的概率。默认为0.5,表示有50%的概率执行该操作。scale
:遮挡区域的面积范围。可以是一个包含两个浮点数的元组(a, b)
,表示遮挡区域的面积为原图面积的[a, b]
之间的随机比例。ratio
:遮挡区域的长宽比范围。可以是一个包含两个浮点数的元组(a, b)
,表示遮挡区域的长宽比为[a, b]
之间的随机比例。value
:设置遮挡区域的像素值。可以是一个整数或一个包含3个整数的元组(R, G, B)
,表示遮挡区域的像素值为指定的颜色;也可以是一个整数,表示遮挡区域为灰度图像,像素值为指定的灰度值。inplace
:是否原地操作。默认为False
,表示返回一个新的遮挡后的图像;如果设置为True
,则在原图像上进行原地操作。
使用transforms.RandomErasing
可以在训练过程中随机遮挡图像的一部分,以增强模型对遮挡和噪声的鲁棒性。
示例:
import torchvision.transforms as transforms
transform = transforms.Compose([
transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3))
])
# 对图像进行随机遮挡
transformed_image = transform(image)
在上面的示例中,transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3))
将以50%的概率对图像进行随机遮挡,遮挡区域的面积在原图面积的 [0.02, 0.33]
之间随机选择,遮挡区域的长宽比在 [0.3, 3.3]
之间随机选择。
注意:随机遮挡可以模拟真实世界中的遮挡和噪声情况,以增加数据集的多样性。这有助于提高模型的鲁棒性和泛化能力。
7、transforms.Lambda
transforms.Lambda
是一个用于用户自定义lambda方法的数据转换操作。
参数:
lambd
:lambda匿名函数,用于定义自定义的数据转换操作。
使用transforms.Lambda
可以通过lambda表达式定义自己的数据转换操作。lambda表达式是一种匿名函数,可以在一行代码中定义简单的函数功能。
示例:
import torchvision.transforms as transforms
# 定义一个lambda函数,将输入的图像进行裁剪
crop_lambda = transforms.Lambda(lambda x: x.crop((10, 10, 100, 100)))
# 使用lambda函数进行图像裁剪
transformed_image = crop_lambda(image)
在上面的示例中,transforms.Lambda(lambda x: x.crop((10, 10, 100, 100)))
定义了一个lambda函数,该函数接受一个输入参数 x
,并对其进行裁剪操作。然后,通过将图像 image
传递给 crop_lambda
,可以使用lambda函数对图像进行裁剪。
注意:transforms.Lambda
提供了一种灵活的方式来自定义数据转换操作,可以根据需求定义任何自己想要的函数功能。