当前位置: 首页 > news >正文

图像增强11种几何变换方法示例

文章目录

  • 一、应用场景
  • 二、环境安装
  • 三、几何变换示例
    • 1. 旋转
    • 2. 缩放
    • 3. 平移
    • 4. 水平翻转
    • 5. 垂直翻转
    • 6. 剪裁
    • 7. 中心剪裁
    • 8. 随机缩放裁剪
    • 9. 弹性变形
    • 10. 透视变换
    • 11. 仿射变换
  • 四、汇总
  • 五、不建议应用场景
  • 六、实践建议


一、应用场景

  1. 训练数据不足
    标注样本有限、罕见病例不足、工业缺陷不足。
  2. 需要提升模型鲁棒性
    目标的不同姿态、拍摄距离不固定、物体位置不固定。
  3. 存在视角、位置变化场景
    自动驾驶、商品零售、无人机航拍等。
  4. 需要模拟物理变形
    文字识别、柔韧性物体识别等。
  5. 处理遮挡问题
    人群密集场景人体检测、部分遮挡的人脸识别等。

二、环境安装

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)

五、不建议应用场景

  1. 几何特征敏感任务
    如条形码、二维码、几何测量、相对位置关系分析等。

  2. 已充分具备数据多样性
    当训练数据已经包含足够的几何变化时,额外的几何变换可能不会带来明显改善。

  3. 需要保持空间关系的任务
    如关键点检测、姿态估计等需要精确位置信息的任务。

  4. 对方向敏感的任务
    如文字识别中,随机旋转可能导致字符方向错误。

六、实践建议

  1. 适度使用:过度使用几何变换可能导致模型学习到不真实的特征。
  2. 任务相关性:选择与目标任务相关的变换类型。
  3. 参数调整:根据具体任务调整变换参数,如旋转角度范围。
  4. 组合策略:合理组合多种变换,避免信息丢失过多。
  5. 验证效果:通过可视化检查变换后的图像是否合理。
http://www.dtcms.com/a/304886.html

相关文章:

  • C++基础:模拟实现priority_queue(堆),详细介绍仿函数
  • 游戏盾从哪些方面保护网站业务?
  • GTSuite许可证性能优化建议
  • 第4章唯一ID生成器——4.4 基于数据库的自增主键的趋势递增的唯一ID
  • 前缀和-974.和可被k整除的子数组-力扣(LeetCode)
  • 实现视频实时马赛克
  • OpenShift AI - 将 Python 库安装到 Workbench 共享存储中
  • 【跨国数仓迁移最佳实践3】资源消耗减少50%!解析跨国数仓迁移至MaxCompute背后的性能优化技术
  • 深度学习篇---PaddleDetection模型选择
  • 《HCIA-Datacom 认证》希赛三色笔记:Vlan间三层通信过程解析
  • 用LangGraph实现聊天机器人记忆功能的深度解析
  • JVM知识点(1)
  • 通过管理工具(hgdbdeveloper)新建用户无法授权
  • 子数组和 问题汇总
  • AI应用:电路板设计
  • C++ 模板类型 <T>,对函数参数传递兼容性检查
  • 【Linux系统编程】Ext2文件系统
  • 001 Configuration结构体构造
  • 【C++篇】“内存泄露”的宝藏手段:智能指针
  • OpenCV 学习探秘之三:从图像读取到特征识别,再到机器学习等函数接口的全面实战应用与解析
  • Excel批量加密工具,一键保护多个文件
  • 【图像处理基石】如何对遥感图像进行实例分割?
  • 【RAG搭建Agent应用实战】基于检索增强生成(RAG)搭建特定场景Agent应用
  • Spring Boot 防重放攻击全面指南:原理、方案与最佳实践
  • AI产品经理手册(Ch3-5)AI Product Manager‘s Handbook学习笔记
  • 【Linux基础】find在linux中查找文件
  • Jenkins 详解
  • 准大一GIS专业新生,如何挑选电脑?
  • 【Kotlin】const 修饰的编译期常量
  • 医疗超声成像专用AFE模拟前端