数据增强之imgaug的使用

包的导入

path = r"D:\\"
# sometimes = lambda aug: iaa.Sometimes(0.5, aug)
img = cv2.imread("D:\\photo\\test.jpg")
img = cv2.resize(img,(128,128))
# img = cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY)
cv2.imwrite(path+"img.jpg",img)

在这里插入图片描述

随机裁剪区域,使用灰度填充0.05为比例

aug = iaa.Cutout(size=0.05)  # 随机裁剪区域,使用灰度填充0.05为比例
images_aug = aug(images=img)
cv2.imwrite(path+"Cutout.jpg",images_aug)

在这里插入图片描述

随机移除几个区域,用黑色填充

aug = iaa.Dropout(p=(0.0, 0.5), per_channel=True)  # 随机移除几个区域,用黑色填充
images_aug = aug(images=img)
cv2.imwrite(path+"Dropout.jpg",images_aug)

在这里插入图片描述

运动模糊

aug = iaa.MotionBlur(k=7, angle=360, direction=1, order=1) # 运动模糊
images_aug = aug(images=img)
cv2.imwrite(path+"MotionBlur.jpg",images_aug)

在这里插入图片描述

高斯模糊

aug = iaa.GaussianBlur(sigma=2.0)  #高斯模糊
(B,G,R) = cv2.split(img)
images_aug_B = aug(images=B)
images_aug_G = aug(images=G)
images_aug_R = aug(images=R)
images_aug = cv2.merge([images_aug_B,images_aug_G,images_aug_R])
cv2.imwrite(path+"GaussianBlur.jpg",images_aug)

在这里插入图片描述

脉冲噪声

aug = iaa.ImpulseNoise(0.5)   #脉冲噪声
images_aug = aug(images=img)
cv2.imwrite(path+"ImpulseNoise.jpg",images_aug)

在这里插入图片描述

中心裁剪指定大小

aug = iaa.CropToFixedSize(512,512, seed = 6,position="center") #中心裁剪指定大小
(B,G,R) = cv2.split(img)
images_aug_B = aug(images=B)[0]
images_aug_G = aug(images=G)[0]
images_aug_R = aug(images=R)[0]
images_aug = cv2.merge([images_aug_B,images_aug_G,images_aug_R])
cv2.imwrite(path+"CropToFixedSize.jpg",images_aug)

在这里插入图片描述

形状变换需要单通道

aug = iaa.Affine(scale=(0.5,1.5),translate_px={"x": (-16, 16), "y": (-16, 16)}, shear={"x": (-15, 15), "y": (-15, 15)})  #形状变换需要单通道
Gray= cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY)
images_aug = aug(images=Gray)
cv2.imwrite(path+"Affine.jpg",images_aug)

在这里插入图片描述

局部仿射变换

aug = iaa.PiecewiseAffine(scale=(0,0.2))   #局部仿射变换
Gray= cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY)
images_aug = aug(images=Gray)
cv2.imwrite(path+"PiecewiseAffine.jpg",images_aug)

在这里插入图片描述

使用位移场移动像素变换

aug = iaa.ElasticTransformation(alpha=(0,40),sigma=(4,8))  #使用位移场移动像素变换
Gray= cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY)
images_aug = aug(images=Gray)
cv2.imwrite(path+"ElasticTransformation.jpg",images_aug)

在这里插入图片描述

增强边缘,将其变为黑白,结果与原始图像叠加

aug = iaa.EdgeDetect(alpha=(0,0.75))  #增强边缘,将其变为黑白,结果与原始图像叠加
Gray= cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY)
images_aug = aug(images=Gray)
cv2.imwrite(path+"EdgeDetect.jpg",images_aug)

在这里插入图片描述

直方图均衡

aug = iaa.HistogramEqualization()     #直方图均衡
images_aug = aug(images=img)
cv2.imwrite(path+"HistogramEqualization.jpg",images_aug)

在这里插入图片描述

使用伽马函数改变对比度

aug = iaa.GammaContrast(gamma=(0.7,2.0))  #使用伽马函数改变对比度
images_aug = aug(images=img)
cv2.imwrite(path+"GammaContrast.jpg",images_aug)

在这里插入图片描述

使用sigmoid函数改变对比度

aug = iaa.SigmoidContrast(gain=(5,6))    #使用sigmoid函数改变对比度
images_aug = aug(images=img)
cv2.imwrite(path+"SigmoidContrast.jpg",images_aug)

在这里插入图片描述

对比受限的自适应直方图

aug = iaa.AllChannelsCLAHE(clip_limit=(0.1,8))  #对比受限的自适应直方图
images_aug = aug(images=img)
cv2.imwrite(path+"AllChannelsCLAHE.jpg",images_aug)

在这里插入图片描述

前景与背景的合并

aug = iaa.BlendAlpha((0.0, 1.0),iaa.Affine(rotate=(-20, 20)),per_channel=0.5) #前景与背景的合并
Gray= cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY)
images_aug = aug(images=Gray)
cv2.imwrite(path+"BlendAlph.jpg",images_aug)

在这里插入图片描述

旋转变换,不丢失边缘

aug = iaa.Affine(fit_output=True,rotate=60)  #旋转变换,不丢失边缘
Gray= cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY)
images_aug = aug(images=Gray)
cv2.imwrite(path+"Affine_true.jpg",images_aug)

在这里插入图片描述

旋转变换,丢失边缘

aug = iaa.Affine(rotate=60)  #旋转变换,丢失边缘
Gray= cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY)
images_aug = aug(images=Gray)
cv2.imwrite(path+"Affine_flase.jpg",images_aug)

在这里插入图片描述

旋转变换,边缘复制

aug = iaa.Affine(rotate=60, mode="edge")  #旋转变换
'''
* ``constant`` -> ``cv2.BORDER_CONSTANT``
* ``edge`` -> ``cv2.BORDER_REPLICATE``
* ``symmetric`` -> ``cv2.BORDER_REFLECT``
* ``reflect`` -> ``cv2.BORDER_REFLECT_101``
* ``wrap`` -> ``cv2.BORDER_WRAP``
'''
Gray= cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY)
images_aug = aug(images=Gray)
cv2.imwrite(path+"Affine_mode.jpg",images_aug)

在这里插入图片描述

整体使用方法为序列模型

import imgaug.augmenters as iaa
import cv2
sometimes = lambda aug: iaa.Sometimes(0.5, aug) 
seq = iaa.Sequential([
        iaa.Fliplr(0.5), # 对50%的图像进行上下翻转
        iaa.Flipud(0.5), # 对50%的图像做镜像翻转
        #OneOf中选一种算术运算
        sometimes(iaa.OneOf([
        iaa.Multiply(mul=(0.8,1.2),per_channel=False), # 像素相乘系数
        iaa.Add(value=(-20,20),per_channel=False),     # 像素加减
        iaa.Cutout(size=0.2),  # 随机裁剪区域,使用灰度填充0.05为比例
        iaa.Dropout(p=(0.0, 0.5), per_channel=False)  # 随机移除几个区域,用黑色填充
        ])),
        #OneOf中选一种形状变化
        sometimes(iaa.OneOf([
	        iaa.Affine(                         
	            scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},#图像缩放为80%到120%之间
	            translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)}, #平移±20
	            rotate=(-45, 45),   #旋转±45度之间
	            shear=(-16, 16),    #剪切变换±16度,(矩形变平行四边形)
	            order=[0, 1],   #使用最邻近差值或者双线性差值
	            cval=(0, 255),  #全白全黑填充
	            mode="edge",    #定义填充图像外区域的方法
	            fit_output=True,#是否保持边缘丢失
	        ),
	        iaa.PiecewiseAffine(scale=(0,0.04)),   #局部仿射变换
	        iaa.ElasticTransformation(alpha=(0,40),sigma=(4,8)),  #使用位移场移动像素变换
	        iaa.PerspectiveTransform(scale=(0,0.06)) #随机四点透视变换
	    ])),
        
        #OneOf中选一种模糊方法
        sometimes(iaa.OneOf([
            iaa.GaussianBlur(sigma=2.0), # 高斯模糊
            iaa.AverageBlur(k=(2, 7)), # 均值模糊
            iaa.MedianBlur(k=(3, 11)),  # 种植模糊
            iaa.MotionBlur(k=(3, 7), angle=(0, 360)) # 运动模糊
        ])),

        #OneOf中选一种边缘方法
        sometimes(iaa.OneOf([
            iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)),
            iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)),
            iaa.EdgeDetect(alpha=(0,0.75)),
            iaa.DirectedEdgeDetect(
                        alpha=(0, 0.7), direction=(0.0, 1.0)
                    )# 增强特定方向上的边缘
        ])),
        
        #OneOf中选一种对比度增强方法
        sometimes(iaa.OneOf([
            iaa.HistogramEqualization(),     #直方图均衡
            iaa.GammaContrast(gamma=(0.7, 1.7)),  #使用伽马函数改变对比度
            iaa.SigmoidContrast(gain=(5,6)),    #使用sigmoid函数改变对比度
            iaa.AllChannelsCLAHE(clip_limit=(0.1,8))  #对比受限的自适应直方图
        ])),
    ],
    random_order=True # 随机的顺序把这些操作用在图像上
)
img = cv2.imread("D:\\photo\\test.jpg")
img = cv2.resize(img,(128,128))
Gray= cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY)
Img = seq.augment_image(Gray)

下图转自:https://blog.youkuaiyun.com/qq_36489878/article/details/108650050
在这里插入图片描述

### 使用ImgAug进行图像数据增强 ImgAug 是一个功能强大且灵活的 Python 库,专门用于图像数据增强。通过 ImgAug 可以轻松实现多种类型的图像变换操作,从而提高模型训练的效果和鲁棒性。 #### 安装与卸载 要安装 ImgAug,请运行以下命令: ```bash pip install imgaug ``` 如果需要卸载该库,则执行如下命令: ```bash pip uninstall imgaug ``` #### 基本概念 在使用 ImgAug 进行数据增强之前,需理解几个核心组件: - **增广器 (Augmenter)**:这是 ImgAug 的主要工具之一,负责定义具体的增强方式。 - **Bounding Box 处理**:对于目标检测任务,ImgAug 支持对 bounding box 同步应用相同的变换[^1]。 #### 实战代码示例 以下是基于 ImgAug 的完整数据增强流程: ##### 导入必要的模块 ```python from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage import imgaug.augmenters as iaa from PIL import Image import numpy as np ``` ##### 加载图像并初始化边界框 假设我们有一张名为 `street.jpg` 的图片,并已知其中两个对象的位置分别为 `(30, 550)` 至 `(280, 950)` 和 `(400, 350)` 至 `(500, 470)`。 ```python img = Image.open("./img/street.jpg") img_np = np.array(img) bbs = BoundingBoxesOnImage([ BoundingBox(x1=30, y1=550, x2=280, y2=950), BoundingBox(x1=400, y1=350, x2=500, y2=470) ], shape=img_np.shape) ``` ##### 创建增广序列 可以通过组合不同的增广技术来构建复杂的增强策略。例如,下面的例子展示了如何随机旋转、缩放和平移图像及其对应的边界框。 ```python seq = iaa.Sequential([ iaa.Affine(rotate=(-20, 20)), # 随机旋转 [-20, 20] 度 iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}), # 随机缩放 [0.8, 1.2] iaa.Fliplr(0.5), # 有 50% 的概率水平翻转 iaa.Multiply((0.8, 1.2)) # 调整亮度范围 [0.8, 1.2] ]) ``` ##### 执行增广 调用 `.augment_image()` 方法对图像进行增强,同时使用 `.augment_bounding_boxes()` 对应调整边界框位置。 ```python image_augmented, bbs_augmented = seq(image=img_np, bounding_boxes=bbs) ``` ##### 显示结果 为了验证效果,可以绘制原始图像上的边界框以及经过增强后的版本。 ```python # 绘制原图中的边界框 original_with_bb = bbs.draw_on_image(img_np, size=4) Image.fromarray(original_with_bb).show() # 绘制增强后图像中的边界框 augmented_with_bb = bbs_augmented.remove_out_of_image().clip_out_of_image().draw_on_image(image_augmented, size=4) Image.fromarray(augmented_with_bb).show() ``` 以上代码实现了完整的图像增强过程,包括加载图像、定义边界框、创建增广序列以及显示最终的结果[^2]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

誓天断发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值