数据增强方法(学习记录)

 图像噪声之高斯噪声(gauss noise)

 概述:
高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声与椒盐噪声相似(Salt And Pepper Noise),高斯噪声(gauss noise)也是数字图像的一个常见噪声。椒盐噪声是出现在随机位置、噪点深度基本固定的噪声,高斯噪声与其相反,是几乎每个点上都出现噪声、噪点深度随机的噪声。比如说数字噪声中比较常见的噪声有:高斯噪声,椒盐噪声,泊松噪声,乘性噪声。
如果噪声的概率密度函数服从高斯分布的就叫做高斯噪声。如果噪声的分布服从泊松分布那么就是泊松噪声。下图是加入σ =0.05的高斯噪声图片。

这里写图片描述这里写图片描述

 批量处理数据

import cv2
import os
import numpy as np
import random
#添加高斯噪声
def gaussian_noise(img,mean,sigma):
    '''
    此函数将产生高斯噪声加到图片上
    :param img:原图
    :param mean:均值
    :param sigma:标准差
    :return:噪声处理后的图片
    '''

    img = img/255  #图片灰度标准化

    noise = np.random.normal(mean, sigma, img.shape) #产生高斯噪声
    # 将噪声和图片叠加
    gaussian_out = img + noise
    # 将超过 1 的置 1,低于 0 的置 0
    gaussian_out = np.clip(gaussian_out, 0, 1)
    # 将图片灰度范围的恢复为 0-255
    gaussian_out = np.uint8(gaussian_out*255)
    # 将噪声范围搞为 0-255
    # noise = np.uint8(noise*255)
    return gaussian_out# 这里也会返回噪声,注意返回值



def convert(input_dir, output_dir):
    for filename in os.listdir(input_dir):
        path = input_dir + "/" + filename # 获取文件路径
        print("doing... ", path)
        noise_img = cv2.imread(path)#读取图片
        img_noise = gaussian_noise(noise_img, 0, 0.12) # 高斯噪声
        # img_noise = sp_noise(noise_img,0.025)# 椒盐噪声
        #img_noise  = random_noise(noise_img,500)# 随机噪声
        cv2.imwrite(output_dir+'/'+filename,img_noise )

if __name__ == '__main__':
    input_dir = "C:\\Users\\ljs\\Desktop\\NumberLabels_gaubefor"    # 输入数据文件夹
    output_dir = "C:\\Users\\ljs\\Desktop\\gao_after" # 输出数据文件夹
    convert(input_dir, output_dir)

随机HSV增强

讲解链接 

 数据增强:随机HSV增强_hsv数据增强_Le0v1n的博客-CSDN博客

 批量处理数据

import os
import cv2
import imageio
import numpy as np
import matplotlib.pyplot as plt
from skimage import io


def augment_hsv(img, h_gain=0.5, s_gain=0.5, v_gain=0.5):
    """
    hsv增强  处理图像hsv,不对label进行任何处理
    :param img: 待处理图片  BGR [736, 736]
    :param h_gain: h通道色域参数 用于生成新的h通道
    :param s_gain: h通道色域参数 用于生成新的s通道
    :param v_gain: h通道色域参数 用于生成新的v通道
    :return: 返回hsv增强后的图片 img
    """

    # 从-1~1之间随机生成3随机数与三个变量进行相乘
    r = np.random.uniform(-1, 1, 3) * [h_gain, s_gain, v_gain] + 1  # random gains
    hue, sat, val = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV))
    dtype = img.dtype  # uint8

    # 分别针对hue, sat以及val生成对应的Look-Up Table(LUT)查找表
    x = np.arange(0, 256, dtype=np.int16)
    lut_hue = ((x * r[0]) % 180).astype(dtype)
    lut_sat = np.clip(x * r[1], 0, 255).astype(dtype)
    lut_val = np.clip(x * r[2], 0, 255).astype(dtype)

    # 使用cv2.LUT方法利用刚刚针对hue, sat以及val生成的Look-Up Table进行变换
    img_hsv = cv2.merge((cv2.LUT(hue, lut_hue), cv2.LUT(sat, lut_sat), cv2.LUT(val, lut_val))).astype(dtype)
    aug_img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR, dst=img)  # no return needed

    # 这里源码是没有进行return的,不过我还是觉得return一下比较直观了解
    return aug_img

if __name__ == '__main__':
    #获取图像列表,此处为原始图像所在路径
    files = os.listdir("C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after")
    s=0
    m=0
    for file in files:
        #按照获取的列表依次读取列表,路径同上
        img = io.imread('C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after\\' + os.path.splitext(file)[0] + '.jpg')
        img_out = augment_hsv(img)
        # plt.figure()
        # plt.subplot(1, 2, 1)
        # plt.imshow(img)
        # plt.subplot(1, 2, 2)
        # plt.imshow(img_out)
        # plt.show()
        s = s + 1
        #路径为结果保存路径
        imageio.imwrite("C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after_HSV\\" + os.path.splitext(file)[0][:4] + "_{}.jpg".format(s), img_out)

    print('已处理完{}张照片'.format(s))

旋转

# -*- coding: UTF-8 -*-

from PIL import Image
import os


def get_filelist(path):
    Filelist = []
    for home, dirs, files in os.walk(path):
        for filename in files:
            # 文件名列表,包含完整路径
            Filelist.append(os.path.join(home, filename))
            # # 文件名列表,只包含文件名
            # Filelist.append( filename)

    return Filelist


if __name__ == "__main__":
    filePath = 'C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after'
    # 指定保存的文件夹
    outputPath = 'C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after_rotate'
    # 获得文件夹下所有文件
    # filePath = './imgs/' # 只能获取当前路径下的文件,不能递归
    # filenames = os.listdir(filePath)
    Filelist = get_filelist(filePath)
    print(len(Filelist))
    # 迭代所有图片
    for filename in Filelist:
        print(filename)
        # 读取图像
        im = Image.open(filename)
        # 指定逆时针旋转的角度
        im_rotate = im.transpose(Image.ROTATE_90)
        # im_rotate = im.transpose(Image.ROTATE_180)
        # im_rotate = im.transpose(Image.ROTATE_270)
        # 保存图像
        output_path = filename.replace(filePath, outputPath)
        outputdir = output_path.rsplit('\\', 1)[0]
        if not os.path.exists(outputdir):
            os.mkdir(outputdir)
        im_rotate.save(output_path)

缩放

from PIL import Image
import os


fin = "C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after"     # 输入图像所在路径
fout = "C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after_suofang"    # 输出图像的路径

for file in os.listdir(fin):
    file_fullname = fin + '/' +file
    print(file_fullname)                            # 所操作图片的名称可视化
    img = Image.open(file_fullname)
    im_resized = img.resize((1000, 1000))             # resize至所需大小
    out_path = fout + '/' + file
    im_resized.save(out_path)                       # 保存图像

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值