针对图像分类的数据增强方法,离线增强,适合分类,无标签增强

针对图像分类的数据增强方法,离线增强,适合分类,无标签增强

代码:

改变路径即可使用

python 复制代码
# 本代码主要提供一些针对图像分类的数据增强方法

# 1、平移。在图像平面上对图像以一定方式进行平移。
# 2、翻转图像。沿着水平或者垂直方向翻转图像。
# 3、旋转角度。随机旋转图像一定角度; 改变图像内容的朝向。
# 4、随机颜色。包括调整图像饱和度、亮度、对比度、锐度
# 5、缩放变形图片。
# 6、二值化图像。
# 7、随机黑色块遮挡
# 8、添加噪声

from PIL import Image
from PIL import ImageEnhance
from PIL import ImageChops
import os
import numpy as np


# 1、图像平移
def move(img): #平移,平移尺度为off
    offset = ImageChops.offset(img, np.random.randint(1, 20), np.random.randint(1, 40))
    return offset

# 2、翻转图像
def flip(img):   
    factor = np.random.randint(1, 3) #随机因子,随机上下或者左右翻转
    if factor == 1:
        filp_img = img.transpose(Image.FLIP_TOP_BOTTOM)
    else:
        filp_img = img.transpose(Image.FLIP_LEFT_RIGHT)
    return filp_img

#  3、旋转角度
def rotation(img):
    factor = np.random.randint(1, 21) #随机旋转角度
    rotation_img = img.rotate(factor) 
    return rotation_img

# 4、随机颜色 
def color(img): 
    """
    对图像进行颜色抖动
    :param image: PIL的图像image
    :return: 有颜色色差的图像image
    """
    random_factor = np.random.randint(5, 15) / 10.  # 随机因子
    color_image = ImageEnhance.Color(img).enhance(random_factor)                     # 调整图像的饱和度
    random_factor = np.random.randint(8, 15) / 10.  # 随机因子
    brightness_image = ImageEnhance.Brightness(color_image).enhance(random_factor)   # 调整图像的亮度
    random_factor = np.random.randint(10, 13) / 10. # 随机因子
    contrast_image = ImageEnhance.Contrast(brightness_image).enhance(random_factor)  # 调整图像对比度
    random_factor = np.random.randint(5, 31) / 10.  # 随机因子
    random_color = ImageEnhance.Sharpness(contrast_image).enhance(random_factor)     # 调整图像锐度
    return random_color 

# 5、缩放变形图片
def crop(img):
    factor_1 = np.random.randint(10, 50)
    factor_2 = np.random.randint(20, 50)
    crop_img = img.crop((img.size[0]/factor_1, img.size[1]/factor_2, img.size[0]*(factor_1-1)/factor_1, img.size[1]*(factor_2-1)/factor_2))
    cropResize_img = crop_img.resize((img.size[0], img.size[1]))
    return cropResize_img

# 6、二值化图像
def convert(img):
    convert_img = img.convert('L')
    return convert_img


# 7、黑色块遮挡
def paste(img):
    # 左上右下
    factor_1 = np.random.randint(20, 70)
    factor_2 = np.random.randint(30, 60)
    # 随机进行左边遮罩
    a = np.random.randint(1,3)
    if a == 2:
        img.paste((0,0,0),(int(img.size[0]*(factor_1-np.random.randint(2,4))/factor_1), 
                        int(img.size[1]*(np.random.randint(1,25))/factor_2), 
                        int(img.size[0]*(factor_1-np.random.randint(0,2))/factor_1),
                        int(img.size[1]*(np.random.randint(26,50))/factor_2)
                        ))
    else:
        # 随机进行底部遮罩
        img.paste((0,0,0),(int(img.size[0]*(np.random.randint(1,19))/factor_1), 
                        # int(img.size[1]*(factor_2-2)/factor_2), 
                        int(img.size[1]*(factor_2-np.random.randint(3,6))/factor_2),
                        int(img.size[0]*(np.random.randint(21,41))/factor_1),
                        # int(img.size[1]*(factor_2-1)/factor_2)
                        int(img.size[1]*(factor_2-np.random.randint(0,3))/factor_2)
                        ))
    return img


# 8、随机添加黑白噪声
def salt_and_pepper_noise(img, proportion = 0.00025):
    noise_img = img
    height,width =noise_img.size[0],noise_img.size[1]
    proportion = proportion * np.random.randint(1, 50)
    num = int(height * width * proportion) #多少个像素点添加椒盐噪声
    pixels = noise_img.load()
    for i in range(num):
        w = np.random.randint(0,width-1)
        h = np.random.randint(0,height-1)
        if np.random.randint(0,2) == 1:
            pixels[h,w] = 0
        else:
            pixels[h,w] = 255
    return noise_img



# 概率执行函数
def random_run(probability, func, useimage):
    """以probability%的概率执行func(*args)"""
    list = []
    for i in range(probability):
        list.append(1)                      #list中放入probability个1
    for x in range(100 - probability):
        list.append(0)                      #剩下的位置放入0
    a = np.random.choice(list)              #随机抽取一个
    if a == 0:
        return useimage
    if a == 1:
        image = func(useimage)
        return image




def main():
    imageDir = "D:/adavance/resnet50/datasets/Coupling/test/norm  "            #要改变的图片的路径文件夹
    saveDir = imageDir#"D:/adavance/resnet50/datasets/TailCotterPin/test/norm_TailCotterPin"                 #要保存的图片的路径文件夹
    seed = 10                           #每张初始图片要数据增强为多少张图片
    for name in os.listdir(imageDir):
        i=0
        for i in range(seed):
            i = i+1
            saveName = str(name[:-4]) + str(i) +".jpg"
            img = Image.open(os.path.join(imageDir, name))
            saveImage = random_run(60, flip, img)                               # 翻转
            saveImage = random_run(70, color, saveImage)                        # 色彩变化
            saveImage = random_run(30, crop, saveImage)                         # 裁减缩放
            #saveImage = random_run(30, paste, saveImage)                        # 添加遮罩
            saveImage = random_run(20, move, saveImage)                         # 平移
            saveImage = random_run(50, rotation, saveImage)                     # 旋转
            saveImage = random_run(10, convert, saveImage)                      # 二值化  
            saveImage = random_run(20, salt_and_pepper_noise, saveImage)        # 添加噪声点
            # saveImage = random_run(90, gauss_noise, saveImage)
            print(type(saveImage))
            if saveImage != None:
                saveImage.save(os.path.join(saveDir, saveName))
            else:
                pass
            print(i)


if __name__ == "__main__":
    main()

PS: 记得备份原图,要不然出差错了,就不好恢复了

相关推荐
AI智图坊几秒前
宠物用品电商视觉内容生产的技术难点与自动化方案分析
大数据·运维·人工智能·ai作画·自动化·aigc
啥都想学点的研究生2 分钟前
一篇文章讲清楚:机器学习所用的数学知识
人工智能·机器学习
七牛云行业应用4 分钟前
国产新模型选型:GLM-5.3、DeepSeek V4、GLM-5.3-Flash、Qwen3.8-Flash-Next、Kimi K3 怎么选
人工智能·大模型·ai编程
YOLO数据集集合4 分钟前
蚊子视觉验证数据集 | 蚊虫识别 疟疾防控 病媒生物 细粒度分类 YOLO格式 深度学习数据集
深度学习·yolo·分类·数据集·蚊子分类·蚊虫分类·蚊虫识别
hhzz6 分钟前
边缘AI视频分析引擎实战:可视化拖拽编排流水线把模型快速跑起来
人工智能·计算机视觉·边缘计算·智能安防·ai视频分析·流水线编排
东方佑8 分钟前
验证报告:「调度中枢」式语言模型方案的最小成本验证
人工智能·语言模型·自然语言处理
淼澄研学19 分钟前
大语言模型文本生成5大技术陷阱与LangChain RAG实操方案
人工智能·语言模型·langchain
AI杂货铺(摸鱼版)19 分钟前
企业多个AI项目怎么分API Key?按项目、工具和环境管理更稳妥
人工智能
蒲公英内测分发24 分钟前
AI 玩具 App 每周更新,怎么用 CI/CD 自动上传测试包又避免误发?
人工智能·测试工具·智能硬件·web app
彼日花25 分钟前
我做了一个开源项目,让 AI 记住我们解决过的问题:Usora
人工智能·agent·ai编程