Python 数据扩充(亮度、翻转、噪声)

因为训练模型的数据集很少,需要进行扩充,主要使用了一些单样本扩充方法,例如亮度变换、水平垂直翻转、增加图像噪声

下面对自己用到的一些代码进行整理,方便后续查看与使用

环境说明

  • opencv:opencv_python 4.5.5.64
  • numpy:1.19.2

下面的方法统一利用到的变量:

# 当前数据集图片格式
file_format = ".png"
# 左右翻转文件名附加字符
LR = "_lr"
# 上下翻转文件名附加字符
TB = "_tb"
# 变亮
BR = "_br"
# 椒盐噪声
SA = "_sa"
# 高斯噪声
GA = "_ga"
# 翻转
FZ = "fz_"
# 获取到文件的文件名
def getImageName(path):return os.path.basename(path)

亮度

这里主要用了两种,分别是亮度变亮 亮度变暗 ,实现原理都是一样的

主要用到两个方法:

  • cv2.imread:python opencv cv2.imread
  • cv2.imwrite:python opencv cv2.imwrite
  • np.clip:该函数的作用是数限定到范围a_min和a_max中

亮度:

import cv2
# 亮度变亮
# img_list:所有的图片地址,数组 例如:[xxx/xxx1.png , xxx/xxx2.png]
# base_path:原图片所在的文件目录
# save_base_path:变量后保存的文件目录
# percetage:亮度,变亮设置为大于1的数字,变暗设置为小于1数字
def brighter(img_list, base_path, save_base_path, percetage=1.2):for i in range(len(img_list)):# 原图片的地址img_path = img_list[i]# 保存的文件地址,以前文件名称为example.png 下面保存为 example_br.pngimage_save_full_path = save_base_path + getImageName(img_path).split(file_format)[0] + BR + file_formatpri_image = cv2.imread(img_path, -1)image_copy = pri_image.copy()w = pri_image.shape[1]h = pri_image.shape[0]# get brighter 根据像素将其变量for xi in range(0, w):for xj in range(0, h):image_copy[xj, xi, 0] = np.clip(int(pri_image[xj, xi, 0] * percetage), a_max=255, a_min=0)image_copy[xj, xi, 1] = np.clip(int(pri_image[xj, xi, 1] * percetage), a_max=255, a_min=0)image_copy[xj, xi, 2] = np.clip(int(pri_image[xj, xi, 2] * percetage), a_max=255, a_min=0)# 保存cv2.imwrite(image_save_full_path, image_copy)

使用后示例:(变亮)

翻转

这里主要用了五种,分别是 上下翻转 左右翻转 90度翻转 180度翻转 270度翻转 ,实现原理都是一样的

主要用到两个方法:

  • PIL.Image.open:打开文件
  • PIL.Image.Image.transpose:进行翻转操作
FLIP_LEFT_RIGHT = 0
FLIP_TOP_BOTTOM = 1
ROTATE_90 = 2
ROTATE_180 = 3
ROTATE_270 = 4
from PIL import Image
# 左右翻转
# img_list:所有的图片地址,数组 例如:[xxx/xxx1.png , xxx/xxx2.png]
# save_base_path:变量后保存的文件目录
def leftRightFz(img_list, save_base_path):# 1.遍历图片for i in range(len(img_list)):# 图片路径img_path = img_list[i]# 打开图片 PIL.Image.Image对象pri_image = Image.open(img_path)# 保存的文件地址,以前文件名称为example.png 下面保存为 example_lr.pngimage_save_full_path = save_base_path + getImageName(img_path).split(file_format)[0] + LR + file_format# 左右镜面翻转FLIP_LEFT_RIGHTpri_image.transpose(Image.FLIP_LEFT_RIGHT).save(image_save_full_path)# 这里根据翻转的不同,输入不同的值FLIP_LEFT_RIGHT = 0 # 左右翻转FLIP_TOP_BOTTOM = 1 # **上下翻转ROTATE_90 = 2 #  90度翻转 ROTATE_180 = 3 # 180度翻转ROTATE_270 = 4 # 270度翻转

使用后示例:(左右翻转)

噪声

这里用到了两种噪声,分别:

  • 高斯噪声,指服从正态分布的一类噪声,通常RGB图像显现比较明显
  • 椒盐噪声,指黑白相间的亮暗点噪声。通常灰度图中比较明显

椒盐噪声

主要用到两个方法:

  • cv2.imread:python opencv cv2.imread
  • cv2.imwrite:python opencv cv2.imwrite
# 椒盐噪声
# img_list:所有的图片地址,数组 例如:[xxx/xxx1.png , xxx/xxx2.png]
# base_path:原图片所在的文件目录
# save_base_path:变量后保存的文件目录
# percetage:噪声情况
def SaltAndPepper(img_list, base_path, save_base_path, percetage=0.3):for i in range(len(img_list)):img_path = img_list[i]# 保存的文件地址,以前文件名称为example.png 下面保存为 example_sa.pngimage_save_full_path = save_base_path + getImageName(img_path).split(file_format)[0] + SA + file_formatpri_image = cv2.imread(img_path)image_copy = pri_image.copy()w = pri_image.shape[1]h = pri_image.shape[0]# noise_numnoise_num = int(percetage * w * h)for i in range(noise_num):randR = np.random.randint(0, h - 1)randG = np.random.randint(0, w - 1)randB = np.random.randint(0, 3)# 随机对图片加上黑白点if np.random.randint(0, 1) == 0:image_copy[randR, randG, randB] = 0else:image_copy[randR, randG, randB] = 255cv2.imwrite(image_save_full_path, image_copy)

示例:

高斯噪声

主要用到两个方法:

  • cv2.imread:python opencv cv2.imread
  • cv2.imwrite:python opencv cv2.imwrite
  • np.random.randn:正态分布矩阵生成
  • np.zeros:初始化一个矩阵,值为0
from PIL import Image
import numpy as np
import cv2
# 高斯噪声
# img_list:所有的图片地址,数组 例如:[xxx/xxx1.png , xxx/xxx2.png]
# base_path:原图片所在的文件目录
# save_base_path:变量后保存的文件目录
# percetage:噪声情况
def GaussianNoise(img_list, base_path, save_base_path, percetage=20):for i in range(len(img_list)):img_path = img_list[i]# 保存的文件地址,以前文件名称为example.png 下面保存为 example_ga.pngimage_save_full_path = save_base_path + getImageName(img_path).split(file_format)[0] + GA + file_formatpri_image = cv2.imread(img_path)image_copy = pri_image.copy()w = pri_image.shape[1]h = pri_image.shape[0]# 正太分布noise = np.random.randn(h, w) * percetage# 一个与图片w,h大小的0矩阵noisy_img = np.zeros(image_copy.shape, np.float64)if len(image_copy.shape) == 2:noisy_img = image_copy + noiseelse: # 增加噪声noisy_img[:, :, 0] = image_copy[:, :, 0] + noisenoisy_img[:, :, 1] = image_copy[:, :, 1] + noisenoisy_img[:, :, 2] = image_copy[:, :, 2] + noisecv2.imwrite(image_save_full_path, noisy_img)

示例:

Python 数据扩充(亮度、翻转、噪声)相关推荐

  1. python学习音频-Python 音频数据扩充的技巧

    经典的深度学习网络AlexNet使用数据扩充(Data Augmentation)的方式扩大数据集,取得较好的分类效果.在深度学习的图像领域中,通过平移. 翻转.加噪等方法进行数据扩充.但是,在音频( ...

  2. Python 音频数据扩充的技巧

    经典的深度学习网络AlexNet使用数据扩充(Data Augmentation)的方式扩大数据集,取得较好的分类效果.在深度学习的图像领域中,通过平移. 翻转.加噪等方法进行数据扩充.但是,在音频( ...

  3. 用Python+OpenCV进行数据扩充

    数据扩充是一种增加数据集多样性的技术,无需收集更多真实数据,但仍有助于提高模型精度并防止模型过拟合. 在本文中,你将学习使用Python和OpenCV为对象检测任务实现最流行.最高效的数据扩充过程. ...

  4. 通过数据扩充来扩展数据集

    目录 介绍 数据扩充 几何变换 图像过滤 现在所有的技巧都在一个算法中 下一步 在这里,我们将简要介绍数据增强技术.然后,我们选择适合我们数据集的适当扩充方法.然后,我们提供并解释用于实现增强算法的P ...

  5. 【深度学习】数据扩充 (Data Augmentation)

    Introduction 数据扩充(data augmentation),又名 数据增强 / 数据增广. 其本质即: 缺少海量数据时,为了保证模型的有效训练,一分钱掰成两半花. 数据扩充方法包括: 简 ...

  6. 【深度学习技巧】数据扩充--常规手法

    深度学习模型需要足够的数据支撑才能进行更好地训练,但实际生活中,作为开发者往往无法获取大量的数据,而专业的数据采集和标注公司提供的数据服务也并不便宜,因此,解决此问题有一个较为不错的初级方案,那就是利 ...

  7. Keras ImageDataGenerator用于数据扩充/增强的原理及方法

    摘要 在这篇博客中,您将学习如何使用Keras的ImageDataGenerator类执行数据扩充/增强.另外将介绍什么是数据增强,数据增强的类型,为什么使用数据增强以及它能做什么/不能做什么. 有三 ...

  8. Python 数据增强 -- PIL模块

    Python 数据增强 – PIL模块 一.导入模块.读取图片 # 图像操作模块 from PIL import Image# 图像颜色增强模块 from PIL import ImageEnhanc ...

  9. 目标检测训练数据扩充增强工具使用说明

    最近总有人私信我说这个工具该怎么用 先附上资源地址: 目标检测数据扩充增强工具_目标检测数据增强-深度学习文档类资源-CSDN下载 该工具基于DataAugmentationForObjectDete ...

最新文章

  1. 2018 年值得关注的 Web 设计趋势
  2. Mysql之alter用法汇总
  3. 科技日报头版显要位置报道国内多家企业投融资给力永中软件
  4. zblog广告小小插件 - ZblogPHP插件
  5. java中类似webapi,在.net框架应用程序中包含.net核心WebAPI?
  6. 设计模式 轮子哥的论点
  7. bat文件备份MySQL数据库
  8. python里的拆包、引用、递归与匿名函数
  9. 重庆市计算机一级考试2015,2015年计算机一级考试试题及答案
  10. 图书馆管理系统——借书操作
  11. 计算机硬盘扇区修复,如何修复Windows中的“硬盘坏扇区”
  12. Java面试题目(非通用模板)
  13. vue.js自定义软键盘“删除键”问题
  14. gcj编译java_用GCJ编译Java源文件成脱离JRE的exe可执行文件
  15. linux ip转发 丢包,sendto频率过快导致发送丢包
  16. Intellig idea关闭自动更新
  17. 边缘云计算概念、架构及应用场景
  18. Salt Returners-作业结果数据返回器的使用与定制开发方法
  19. 原生Winows7系统添加USB3.0的驱动
  20. CES2014盘点:九大穿戴式设备

热门文章

  1. linux pps驱动实现gps授时
  2. 【问题解决】win服务器磁盘初始化
  3. 龙蜥降世,神龙升级,灵杰亮相,阿里云再出神器
  4. 四旋翼飞行器建模与PID控制器设计(MatlabSimulink)
  5. 安规之电气间隙和爬电距离
  6. 【计算机网络】网络层:虚拟专用网
  7. C++ continue 语句
  8. 计算机流体力学软件基础及工程应用,流体力学及其工程应用(英文版·原书第10版)2013年版...
  9. Java任务项目-名片管理系统
  10. 好的工具分享(持续更新)