随机数据增强代码

当数据集较小,或者网络过浅容易过拟合时,需要对数据集进行数据增强以丰富样本数据,让一张图片变换多种形态,增强网络的学习能力。

以下提供两种可实现代码,对数据进行批量随机变换,只需要修改输入和输出文件夹路径,即可批量生成,一张图片可扩增8倍。(默认已安装必要的包)

原始图片

原图

实现一:随机进行颜色增强,降低,修改对比度,锐度,随机水平翻转,竖直翻转,组合翻转。

import os
import random
import cv2
from PIL import Image, ImageEnhance


def operate(currentPath, filename, targetPath):
    # 读取图像
    image = Image.open(currentPath)
    image_cv = cv2.imread(currentPath)

    # 增强亮度
    enh_bri = ImageEnhance.Brightness(image)
    brightness_factor = random.uniform(0.8, 1.2)  # 随机生成0.8到1.2之间的数值
    image_brightened = enh_bri.enhance(brightness_factor)
    directory = targetPath + 'bright/'
    if not os.path.exists(directory):
        os.makedirs(directory)
    image_brightened.save(targetPath + 'bright/' + filename)  # 保存

    # 降低亮度
    enh_bri_low = ImageEnhance.Brightness(image)
    brightness_factor = random.uniform(0.5, 0.9)  # 随机生成0.5到0.9之间的数值
    image_brightened_low = enh_bri_low.enhance(brightness_factor)
    directory = targetPath + 'low_bright/'
    if not os.path.exists(directory):
        os.makedirs(directory)
    image_brightened_low.save(targetPath + 'low_bright/' + filename)

    # 改变色度
    enh_col = ImageEnhance.Color(image)
    color_factor = random.uniform(0.5, 1.5)  # 随机生成0.5到1.5之间的数值
    image_colored = enh_col.enhance(color_factor)
    directory = targetPath + 'color/'
    if not os.path.exists(directory):
        os.makedirs(directory)
    image_colored.save(targetPath + 'color/' + filename)

    # 改变对比度
    enh_con = ImageEnhance.Contrast(image)
    contrast_factor = random.uniform(0.5, 1.5)  # 随机生成0.5到1.5之间的数值
    image_contrasted = enh_con.enhance(contrast_factor)
    directory = targetPath + 'cont/'
    if not os.path.exists(directory):
        os.makedirs(directory)
    image_contrasted.save(targetPath + 'cont/' + filename)

    # 改变锐度
    enh_sha = ImageEnhance.Sharpness(image)
    sharpness_factor = random.uniform(1.5, 3.5)  # 随机生成1.5到3.5之间的数值,你可以根据需要调整这个范围
    image_sharp = enh_sha.enhance(sharpness_factor)
    directory = targetPath + 'sharp/'
    if not os.path.exists(directory):
        os.makedirs(directory)
    image_sharp.save(targetPath + 'sharp/' + filename)

    # 水平翻转
    if random.random() < 0.5:  # 以50%的概率进行水平翻转
        image_flipped_h = image.transpose(Image.FLIP_LEFT_RIGHT)
        directory = targetPath + 'flip_h/'
        if not os.path.exists(directory):
            os.makedirs(directory)
        image_flipped_h.save(targetPath + 'flip_h/' + filename)

        # 竖直翻转
    if random.random() < 0.5:  # 以50%的概率进行竖直翻转
        image_flipped_v = image.transpose(Image.FLIP_TOP_BOTTOM)
        directory = targetPath + 'flip_v/'
        if not os.path.exists(directory):
            os.makedirs(directory)
        image_flipped_v.save(targetPath + 'flip_v/' + filename)

    if random.random() < 0.5:  # 以50%的概率进行水平竖直翻转
        image_flipped_h = image.transpose(Image.FLIP_LEFT_RIGHT)
        image_flipped_v = image_flipped_h.transpose(Image.FLIP_TOP_BOTTOM)
        directory = targetPath + 'flip_hv/'
        if not os.path.exists(directory):
            os.makedirs(directory)
        image_flipped_v.save(targetPath + 'flip_hv/' + filename)

imgdir = 'your_imagepath/file/'
for parent, dirnames, filenames in os.walk(imgdir):
    for filename in filenames:
        print('filename is: ' + filename)
        # 把文件名添加到一起后输出
        imgPath = os.path.join(parent, filename)
        # 保存处理后的图片的目标文件夹
        outPath = 'save_path/file/'
        # 进行处理
        operate(imgPath, filename, outPath)
增强图片

实现二:随机水平竖直翻转,随机角度旋转,颜色变换,随机裁剪

import os
import random
import cv2
import numpy as np
from PIL import Image
from torchvision import transforms as tfs
import matplotlib.pyplot as plt

def coms(input):
    size=[200,250,300] #随机裁剪尺寸
    selected_size = random.randint(1, 3)

    im_l = tfs.Compose([
        tfs.RandomVerticalFlip(),#随机竖直翻转
        tfs.RandomHorizontalFlip(),#随机水平翻转
        #tfs.RandomRotation(45),  #随机旋转  -45 ~45
        #tfs.Resize((100, 200))          压缩
        tfs.RandomCrop((size[selected_size-1],size[selected_size-1])),
        tfs.ColorJitter(brightness=0.5, contrast=0.5, hue=0.5), #(亮度,对比度,颜色)
        #tfs.CenterCrop(300),#中心裁剪
    ])
    out = im_l(input)
    return out
if __name__ == '__main__':
    im = Image.open('your_imagepath/input.jpg')
    output_folder = 'save_path/file/'
    nrows = 3
    ncols = 3
    figsize = (8, 8)
    _, figs = plt.subplots(nrows, ncols, figsize=figsize)# 创建子图画布
    for i in range(nrows):
        for j in range(ncols):
            # 对原始图像进行变换
            transformed_image = coms(im)
            transformed_image_np = np.array(transformed_image)
            cv2.imwrite(os.path.join(output_folder, f"trans_img_{i}_{j}.png"), transformed_image_np)
            # 显示变换后的图像
            figs[i][j].imshow(transformed_image)
            figs[i][j].axes.get_xaxis().set_visible(False)
            figs[i][j].axes.get_yaxis().set_visible(False)

    plt.show()

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据增强是深度学习中常用的技术,通过在训练数据中添加一些经过变换的样本,可以提高网络的泛化能力。其中,颜色随机是一种常用的增强方式,通过对图像的像素值进行随机变换,可以增加训练数据的多样性。 Python代码实现颜色随机的数据增强可以使用OpenCV库,实现方式如下: ``` import cv2 import numpy as np # 对输入图像进行颜色随机增强 def color_augment(img, hue_delta=30, sat_mult=1.0, val_mult=1.0): # 将图像从BGR转为HSV空间 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 对色相进行随机变换 hsv[..., 0] += np.random.randint(-hue_delta, hue_delta + 1) # 对饱和度和亮度进行随机缩放 hsv[..., 1] *= np.random.uniform(1.0 - sat_mult, 1.0 + sat_mult) hsv[..., 2] *= np.random.uniform(1.0 - val_mult, 1.0 + val_mult) # 将HSV图像转为BGR空间 bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) # 确保图像像素值在0-255之间 bgr[bgr > 255] = 255 bgr[bgr < 0] = 0 return bgr # 载入原始图像 img = cv2.imread('image.jpg') # 进行颜色随机增强 aug_img = color_augment(img, hue_delta=30, sat_mult=0.1, val_mult=0.1) # 显示原始图像和增强后的图像 cv2.imshow('Original Image', img) cv2.imshow('Augmented Image', aug_img) cv2.waitKey(0) ``` 该代码通过将输入图像从BGR空间转换为HSV空间,对色相、饱和度和亮度进行随机变化,再将HSV图像转换为BGR空间得到增强后的图像。可以根据具体的需求调整颜色增强的参数,比如限制色相变换的大小,或者限制饱和度和亮度的缩放范围。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值