图像增强11种几何变换方法示例
文章目录
- 一、应用场景
- 二、环境安装
- 三、几何变换示例
- 1. 旋转
- 2. 缩放
- 3. 平移
- 4. 水平翻转
- 5. 垂直翻转
- 6. 剪裁
- 7. 中心剪裁
- 8. 随机缩放裁剪
- 9. 弹性变形
- 10. 透视变换
- 11. 仿射变换
- 四、汇总
- 五、不建议应用场景
- 六、实践建议
一、应用场景
- 训练数据不足
标注样本有限、罕见病例不足、工业缺陷不足。 - 需要提升模型鲁棒性
目标的不同姿态、拍摄距离不固定、物体位置不固定。 - 存在视角、位置变化场景
自动驾驶、商品零售、无人机航拍等。 - 需要模拟物理变形
文字识别、柔韧性物体识别等。 - 处理遮挡问题
人群密集场景人体检测、部分遮挡的人脸识别等。
二、环境安装
pip install albumentations
pip install opencv-python numpy
Albumentations 是一个高效的 Python 图像增强库,专为计算机视觉任务(如分类、检测、分割)设计。它提供了丰富的图像变换方法,包括几何变换、颜色变换、模糊、噪声添加等,适用于数据增强,本篇介绍其中常用的几种几何变换。
三、几何变换示例
1. 旋转
原理:将图像围绕中心点旋转一定角度。旋转后的图像会丢失部分边缘信息,通常需要填充或裁剪。
应用:增强模型对物体方向变化的鲁棒性,适用于人脸识别、文字识别等场景
方法:
A.Rotate(limit=angle_limit, p=1)
limit: 旋转角度范围,设置为45表示图像将在-45度到+45度之间随机旋转
p: 执行概率,1表示100%执行此变换
import albumentations as A
import cv2
import numpy as npdef rotate_image(image, angle_limit=45):"""对输入图像进行随机旋转增强参数:image: 输入图像(numpy数组)angle_limit: 旋转角度范围(±angle_limit)返回:transformed_image: 变换后的图像transform_type: 变换类型标识"""# 创建旋转变换transform = A.Compose([A.Rotate(limit=angle_limit, p=1) # p=1表示100%执行此变换]) # 应用变换transformed = transform(image=image)return transformed['image'], 'Rotate'image = cv2.imread('img.jpg')
rotated_img, _ = rotate_image(image)
cv2.imwrite('transformed_img.png', rotated_img)
2. 缩放
原理:随机改变图像尺寸比例,可以放大或缩小图像。
应用:使模型适应不同距离拍摄的物体,在目标检测中特别有用。
方法:
A.RandomScale(scale_limit=scale_limit, p=1)
scale_limit: 缩放比例范围,0.2表示图像将在原始尺寸的80%-120%之间随机缩放
p: 执行概率
def scale_image(image, scale_limit=0.2):"""对输入图像进行随机缩放增强参数:image: 输入图像scale_limit: 缩放比例范围(1±scale_limit)返回:缩放后的图像和变换标识"""transform = A.Compose([A.RandomScale(scale_limit=scale_limit, p=1)])transformed = transform(image=image)return transformed['image'], 'Scale'image = cv2.imread('img.png')
scaled_img, _ = scale_image(image)
cv2.imwrite('transformed_img.png', scaled_img)
3. 平移
原理:在水平和垂直方向上移动图像内容,边缘区域用填充值补充。
应用:增强模型对物体位置变化的适应性,防止过拟合到特定位置。
方法:
A.ShiftScaleRotate(shift_limit=translate_limit, scale_limit=0, rotate_limit=0, p=1
)
shift_limit: 平移比例(相对于图像尺寸),0.2表示水平和垂直方向最多移动图像尺寸的20%
scale_limit: 设置为0表示不进行缩放
rotate_limit: 设置为0表示不进行旋转
p: 执行概率
def translate_image(image, translate_limit=0.2):"""对输入图像进行随机平移增强参数:image: 输入图像translate_limit: 平移比例(相对于图像尺寸)返回:平移后的图像和变换标识"""transform = A.Compose([A.ShiftScaleRotate(shift_limit=translate_limit, scale_limit=0, rotate_limit=0, p=1)])transformed = transform(image=image)return transformed['image'], 'Translate'image = cv2.imread('img.png')
translate_img, _ = translate_image(image)
cv2.imwrite('transformed_img.png', translate_img)
4. 水平翻转
原理:沿垂直轴水平翻转图像,创建镜像效果。
应用:简单有效的增强方式,特别适用于对称物体或场景,可显著增加数据量。
方法:
A.HorizontalFlip(p=1)
p: 执行概率,1表示100%执行水平翻转
def flip_image(image):"""对输入图像进行水平翻转参数:image: 输入图像返回:翻转后的图像和变换标识"""transform = A.Compose([A.HorizontalFlip(p=1)])transformed = transform(image=image)return transformed['image'], 'Flip'image = cv2.imread('img.png')
flipped_img, _ = flip_image(image)
cv2.imwrite('transformed_img.png', flipped_img)
5. 垂直翻转
原理:沿水平轴垂直翻转图像,创建上下颠倒的效果。
应用:适用于上下对称的场景或物体,如天空/水面反射、某些医学图像等。
方法:
A.VerticalFlip(p=1)
p: 执行概率,1表示100%执行垂直翻转
def vertical_flip_image(image):"""对输入图像进行垂直翻转参数:image: 输入图像返回:翻转后的图像和变换标识"""transform = A.Compose([A.VerticalFlip(p=1)])transformed = transform(image=image)return transformed['image'], 'VerticalFlip'image = cv2.imread('img.png')
vflipped_img, _ = vertical_flip_image(image)
cv2.imwrite('transformed_img.png', vflipped_img)
6. 剪裁
原理:从原图中随机截取固定大小区域,丢弃其他部分。
应用:强制模型关注局部特征,防止依赖全局信息,常用于小物体检测。
方法:
A.RandomCrop(height=crop_size[0], width=crop_size[1], p=1)
height: 裁剪区域的高度(像素)
width: 裁剪区域的宽度(像素)
p: 执行概率
def random_crop(image, crop_size=(256, 256)):"""对输入图像进行随机裁剪参数:image: 输入图像crop_size: 裁剪尺寸(高度, 宽度)返回:裁剪后的图像和变换标识"""transform = A.Compose([A.RandomCrop(height=crop_size[0], width=crop_size[1], p=1)])transformed = transform(image=image)return transformed['image'], 'Crop'image = cv2.imread('img.png')
cropped_img, _ = random_crop(image, (200, 200))
cv2.imwrite('transformed_img.png', cropped_img)
7. 中心剪裁
原理:从图像中心截取指定大小的区域,丢弃边缘部分。与随机裁剪不同,中心裁剪总是从图像正中心提取固定大小的区域。
应用:当需要确保图像主要内容始终位于裁剪区域内时使用,常用于预处理阶段统一输入尺寸。在图像分类任务中较为常见。
方法:
A.CenterCrop(height=crop_size[0], width=crop_size[1], p=1)
height: 裁剪区域的高度(像素)
width: 裁剪区域的宽度(像素)
p: 执行概率
def center_crop(image, crop_size=(256, 256)):"""对输入图像进行中心裁剪参数:image: 输入图像crop_size: 裁剪尺寸(高度, 宽度)返回:裁剪后的图像和变换标识"""transform = A.Compose([A.CenterCrop(height=crop_size[0], width=crop_size[1], p=1)])transformed = transform(image=image)return transformed['image'], 'CenterCrop'image = cv2.imread('img.png')
ccropped_img, _ = center_crop(image, (200, 200))
cv2.imwrite('transformed_img.png', ccropped_img)
8. 随机缩放裁剪
原理:先随机缩放图像,然后从缩放后的图像中随机裁剪出指定大小的区域。结合了缩放和裁剪两种操作。
应用:同时模拟不同拍摄距离和局部视角变化,在ImageNet等大型图像分类数据集训练中广泛使用。
方法:
A.RandomResizedCrop(height=crop_size[0], width=crop_size[1], scale=scale_range, ratio=aspect_ratio_range, p=1
)
height: 输出图像高度
width: 输出图像宽度
scale: 缩放范围(最小比例, 最大比例)
ratio: 宽高比范围(最小比例, 最大比例)
p: 执行概率
def random_resized_crop(image, crop_size=(256, 256), scale_range=(0.8, 1.0), aspect_ratio_range=(0.9, 1.1)):"""对输入图像进行随机缩放裁剪参数:image: 输入图像crop_size: 输出尺寸(高度, 宽度)scale_range: 缩放比例范围aspect_ratio_range: 宽高比变化范围返回:变换后的图像和变换标识"""transform = A.Compose([A.RandomResizedCrop(height=crop_size[0],width=crop_size[1],scale=scale_range,ratio=aspect_ratio_range,p=1)])transformed = transform(image=image)return transformed['image'], 'RandomResizedCrop'image = cv2.imread('img.png')
rrc_img, _ = random_resized_crop(image)
cv2.imwrite('transformed_img.png', rrc_img)
9. 弹性变形
原理:模拟橡皮筋拉伸效果,通过局部位移场对图像进行非线性变形。
应用:增强模型对物体形变的适应性,在医学图像处理中特别有效。
方法:
A.ElasticTransform(alpha=alpha,sigma=sigma,alpha_affine=alpha_affine,p=1
)
alpha: 变形强度缩放因子,值越大变形越明显
sigma: 高斯滤波参数,控制变形的平滑度,值越大变形越平滑
alpha_affine: 仿射变换参数,控制基础仿射变换的强度
p: 执行概率
def elastic_transform(image, alpha=1, sigma=50, alpha_affine=50):"""对图像应用弹性变形参数:image: 输入图像alpha: 缩放因子(控制变形强度)sigma: 高斯滤波参数(控制平滑度)alpha_affine: 仿射变换参数返回:变形后的图像和变换标识"""transform = A.Compose([A.ElasticTransform(alpha=alpha,sigma=sigma,alpha_affine=alpha_affine,p=1)])transformed = transform(image=image)return transformed['image'], 'Elastic'image = cv2.imread('img.png')
elastic_img, _ = elastic_transform(image)
cv2.imwrite('transformed_img.png', elastic_img)
10. 透视变换
原理:模拟不同视角下的图像投影效果。
应用:增强模型对视角变化的适应性。
方法:
A.Perspective(scale=scale, p=1)
scale: 透视变换强度(0-1),值越大变换效果越明显
p: 执行概率
def perspective_transform(image, scale=0.2):"""对图像应用透视变换参数:image: 输入图像scale: 变换强度返回:变换后的图像和变换标识"""transform = A.Compose([A.Perspective(scale=scale, p=1)])transformed = transform(image=image)return transformed['image'], 'Perspective'image = cv2.imread('img.png')
perspective_img, _ = perspective_transform(image)
cv2.imwrite('transformed_img.png', perspective_img)
11. 仿射变换
原理:它包含了平移、旋转、缩放和剪切等多种基本几何变换的组合
应用:模拟相机视角的轻微变化、增强模型对物体轻微形变的鲁棒性
方法:
A.Affine(translate_percent=translate_percent,rotate=rotate_limit,scale=scale_range,shear=shear_limit,p=probability
)
translate_percent: 平移比例(相对于图像尺寸),如0.1表示水平和垂直方向最多移动图像尺寸的10%
rotate: 旋转角度范围(度),如10表示在-10度到+10度之间随机旋转
scale: 缩放比例范围,如(0.8, 1.2)表示在原始尺寸的80%-120%之间随机缩放
shear: 剪切角度范围(度),如10表示在-10度到+10度之间随机剪切
p: 执行概率,如0.5表示50%的概率执行此变换
def affine_transform(image, translate_percent=0.1, rotate_limit=10, scale_range=(0.8, 1.2), shear_limit=10, probability=0.5):"""对输入图像应用仿射变换参数:image: 输入图像(numpy数组)translate_percent: 平移比例(相对于图像尺寸)rotate_limit: 旋转角度范围(度)scale_range: 缩放比例范围shear_limit: 剪切角度范围(度)probability: 执行概率返回:transformed_image: 变换后的图像transform_type: 变换类型标识"""transform = A.Compose([A.Affine(translate_percent=translate_percent,rotate=rotate_limit,scale=scale_range,shear=shear_limit,p=probability)])transformed = transform(image=image)return transformed['image'], 'Affine'# 使用示例
image = cv2.imread('img.png')
affine_img, _ = affine_transform(image)
cv2.imwrite('transformed_img.png', affine_img)
四、汇总
方法 | 作用 | 示例代码 |
---|---|---|
Rotate | 旋转(指定角度范围) | A.Rotate(limit=30, p=0.7) |
RandomScale | 缩放 | A.RandomScale(scale_limit=scale_limit, p=1) |
HorizontalFlip | 水平翻转(镜像) | A.HorizontalFlip(p=0.5) |
VerticalFlip | 垂直翻转 | A.VerticalFlip(p=0.5) |
ShiftScaleRotate | 平移 + 缩放 + 旋转(组合变换) | A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.2, rotate_limit=30, p=0.8) |
RandomResizedCrop | 随机缩放裁剪 | A.RandomResizedCrop(256, 256, scale=(0.8, 1.0), p=1) |
RandomCrop | 随机裁剪 | A.RandomCrop(256, 256, p=1) |
CenterCrop | 中心裁剪 | A.CenterCrop(256, 256, p=1) |
ElasticTransform | 弹性变形(模拟拉伸、扭曲) | A.ElasticTransform(alpha=1, sigma=50, p=0.5) |
Perspective | 透视变换(模拟不同视角) | A.Perspective(scale=0.2, p=0.5) |
Affine | 仿射变换(平移、旋转、缩放、剪切) | A.Affine(translate_percent=0.1, rotate=10, scale=0.8, shear=10, p=0.5) |
五、不建议应用场景
-
几何特征敏感任务
如条形码、二维码、几何测量、相对位置关系分析等。 -
已充分具备数据多样性
当训练数据已经包含足够的几何变化时,额外的几何变换可能不会带来明显改善。 -
需要保持空间关系的任务
如关键点检测、姿态估计等需要精确位置信息的任务。 -
对方向敏感的任务
如文字识别中,随机旋转可能导致字符方向错误。
六、实践建议
- 适度使用:过度使用几何变换可能导致模型学习到不真实的特征。
- 任务相关性:选择与目标任务相关的变换类型。
- 参数调整:根据具体任务调整变换参数,如旋转角度范围。
- 组合策略:合理组合多种变换,避免信息丢失过多。
- 验证效果:通过可视化检查变换后的图像是否合理。