我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python Opencv数据增强的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python Opencv数据增强的方法

本篇内容介绍了“Python Opencv数据增强的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

常见的数据增强操作有:按比例放大或缩小图片、旋转、平移、水平翻转、改变图像通道等。

1.按比例放大和缩小

扩展缩放只是改变图像的尺寸大小。OpenCV 提供的函数 cv2.resize()可以实现这个功能。图像的尺寸可以自己手动设置,也可以指定缩放因子。可以选择使用不同的插值方法。在缩放时我们推荐使用 cv2.INTER_AREA,在扩展时我们推荐使用 v2.INTER_CUBIC(慢) 和 v2.INTER_LINEAR。默认情况下所有改变图像尺寸大小的操作使用的插值方法都是 cv2.INTER_LINEAR。

# 缩小 -- 宽和高都缩小为原来的scale倍def zoom_down(img,scale):    img = cv2.resize(img,None,fx= scale,fy= scale,interpolation=cv2.INTER_CUBIC)    return img# 放大 -- 宽和高都放大为原来的scale倍def zoom_up(img,scale):    img = cv2.resize(img,None,fx= scale,fy= scale,interpolation=cv2.INTER_CUBIC)    return img

resize库中第二个参数是目标大小,例如如果我想把图片resize成300*300大小的,可以这么写:

img = cv2.resize(img,(300,300))

2.平移图像

平移就是将对象换一个位置。如果你要沿(x,y)方向移动,移动的距离是(tx,ty),你可以以下面的方式构建移动矩阵:

Python Opencv数据增强的方法

可以使用 Numpy 数组构建这个矩阵(数据类型是 np.float32),然后把它传给函数cv2.warpAffine()。

mat_translation = np.float32([[1, 0, 20], [0, 1, 30]])

例如上面是的矩阵是将图像往水平方向上移动20个像素点,竖直方向上移动30个像素点。

实例:

# 平移 -- 水平平移或竖直方向平移def translation(img,tx,ty):    height = img.shape[0]    width = img.shape[1]    mat_translation = np.float32([[1, 0, tx], [0, 1, ty]]) # 变换矩阵:设置平移变换所需的计算矩阵:2行3列    img = cv2.warpAffine(img, mat_translation, (width + tx, height + ty))  # 变换函数    return img

我这里封装的tx和ty分别为水平和竖直方向需要移动的像素点数。

3.旋转图像

OpenCV 提供了一个函数:cv2.getRotationMatrix2D

# 旋转def rotation(img,angle,scale):    rows = img.shape[0]    cols = img.shape[1]    # 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子    # 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题    M = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, scale) # 向左旋转angle度并缩放为原来的scale倍    img = cv2.warpAffine(img, M, (cols, rows)) # 第三个参数是输出图像的尺寸中心    return img

4.镜像变换

Opencv提供了cv2.flip()函数,可以第二个参数为1时为水平翻转,为0时垂直翻转。为了后面调用方便,我还是自己封装了一下。

# 镜像变换def mirror(img,mode):    img = cv2.flip(img, mode)  # mode = 1 水平翻转 mode = 0 垂直翻    return img

5.添加椒盐噪声

椒盐噪声为纯黑或纯白的像素点,随机生成。

# 添加椒盐噪声def spiced_salt_noise(img,prob):    output = np.zeros(img.shape,np.uint8)    thres = 1 - prob    for i in range(img.shape[0]):        for j in range(img.shape[1]):            rdn = random.random()            if rdn < prob:                output[i][j] = 0 # 椒盐噪声由纯黑和纯白的像素点随机组成            elif rdn > thres:                output[i][j] = 255            else:                output[i][j] = img[i][j]    return output

6.添加高斯噪声

与椒盐噪声不同,高斯噪声是彩色的,方差越大时噪声越大。

# 添加高斯噪声def gasuss_noise(image, mean = 0, var = 0.01):    '''        添加高斯噪声        mean : 均值        var : 方差,方差越大越模糊    '''    image = np.array(image/255, dtype=float)    noise = np.random.normal(mean, var ** 0.5, image.shape)    out = image + noise    if out.min() < 0:        low_clip = -1.    else:        low_clip = 0.    out = np.clip(out, low_clip, 1.0)    out = np.uint8(out*255)    return out

7.模糊化

将图片模糊或平滑有多种算法,例如高斯模糊、中值模糊、均值模糊等,我这里使用一个比较普通的cv2.blur()实现。同样也是先封装方便我后面调用。

# 模糊def blur(img,scale):    img = cv2.blur(img,(scale,scale)) # scale越大越模糊    return img

这里的scale其实就是滤波器的尺寸,一般取奇数,scale越大越模糊,

8.重新组合颜色通道

在opencv中,图像的通道顺序为BGR,也就是蓝绿红,可以改变成其他顺序以得到不同的效果。

# 重新组合颜色通道def change_channel(img):    b = cv2.split(img)[0]    g = cv2.split(img)[1]    r = cv2.split(img)[2]    brg = cv2.merge([b, r, g]) # 可以自己改变组合顺序    return brg

实例

我有以下几张测试图片:

Python Opencv数据增强的方法

我希望随机地对这些图片进行一些变换,最终执行结果如下:

Python Opencv数据增强的方法

可以看到程序对我的图片随机进行了各种变换,我这里只是一次变换,读者也可以尝试对图片同时进行多种变换。

本次程序如下:

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2022/2/18 16:30# @Author : 若谷# @File : Data_Augumentation.py# @Software: PyCharmimport numpy as npimport cv2import randomimport osimport sys# 缩小 -- 宽和高都缩小为原来的scale倍def zoom_down(img, scale):    img = cv2.resize(img, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC)    return img# 放大 -- 宽和高都放大为原来的scale倍def zoom_up(img, scale):    img = cv2.resize(img, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC)    return img# 平移 -- 水平平移或竖直方向平移def translation(img, tx, ty):    height = img.shape[0]    width = img.shape[1]    mat_translation = np.float32([[1, 0, tx], [0, 1, ty]])  # 变换矩阵:设置平移变换所需的计算矩阵:2行3列    img = cv2.warpAffine(img, mat_translation, (width + tx, height + ty))  # 变换函数    return img# 旋转def rotation(img, angle, scale):    rows = img.shape[0]    cols = img.shape[1]    # 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子    # 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题    M = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, scale)  # 向左旋转angle度并缩放为原来的scale倍    img = cv2.warpAffine(img, M, (cols, rows))  # 第三个参数是输出图像的尺寸中心    return img# 镜像变换def mirror(img, mode):    img = cv2.flip(img, mode)  # mode = 1 水平翻转 mode = 0 垂直翻    return img# 添加椒盐噪声def spiced_salt_noise(img, prob):    output = np.zeros(img.shape, np.uint8)    thres = 1 - prob    for i in range(img.shape[0]):        for j in range(img.shape[1]):            rdn = random.random()            if rdn < prob:                output[i][j] = 0  # 椒盐噪声由纯黑和纯白的像素点随机组成            elif rdn > thres:                output[i][j] = 255            else:                output[i][j] = img[i][j]    return output# 模糊def blur(img, scale):    img = cv2.blur(img, (scale, scale))  # scale越大越模糊    return img# 添加高斯噪声def gasuss_noise(image, mean=0, var=0.01):    '''        添加高斯噪声        mean : 均值        var : 方差,方差越大越模糊    '''    image = np.array(image / 255, dtype=float)    noise = np.random.normal(mean, var ** 0.5, image.shape)    out = image + noise    if out.min() < 0:        low_clip = -1.    else:        low_clip = 0.    out = np.clip(out, low_clip, 1.0)    out = np.uint8(out * 255)    return out# 重新组合颜色通道def change_channel(img):    b = cv2.split(img)[0]    g = cv2.split(img)[1]    r = cv2.split(img)[2]    brg = cv2.merge([b, r, g])  # 可以自己改变组合顺序    return brg# 随机进行以上操作def Data_Augument():    for i in images_list:        img = cv2.imread(image_dir+i) # 图片路径+图片名字        cv2.imshow('img',img)        functions = [('zoom_down', [img, 0.8]), # 第一个参数为函数名,后面为函数调用时的参数                     ('zoom_up', [img, 1.2]),                     ('translation', [img, 20, 30]),                     ('rotation', [img, 15, 0.9]),                     ('mirror', [img, 1]),                     ('spiced_salt_noise', [img, 0.01]),                     ('blur', [img, 5]),                     ('gasuss_noise', [img, 0, 0.01]),                     ('change_channel', [img])]        choice = random.choice(functions) # 随机选择一个函数执行        this_module = sys.modules[__name__]  # 当前文件        res = getattr(this_module, choice[0])(*choice[1])        cv2.imwrite(output_dir + i, res)if __name__ == '__main__':    image_dir = './test/' # 源图片路径    images_list = os.listdir(image_dir)    nums = len(os.listdir(image_dir))    print('found %d pictures' % nums)    output_dir = './output/' # 图像变换后的保存路径    Data_Augument() # 执行    print('finished!')

“Python Opencv数据增强的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python Opencv数据增强的方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python Opencv数据增强的方法

本篇内容介绍了“Python Opencv数据增强的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!常见的数据增强操作有:按比例放大或缩小
2023-06-29

分析语音数据增强及python实现

目录一、概述二、加噪2.1、第一种:控制噪声因子2.2、第二种:控制信噪比三、加混响3.1、方法一:Pyroomacoustics实现音频加混响3.2、方法二:Image Source Method 算法讲解四、生成指定SER的混响五、波形
2022-06-02

Scitter库的增强方法是什么

本篇内容介绍了“Scitter库的增强方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!现在对于Scala而言,Twitter是一个很
2023-06-17

WCF服务增强的方法有哪些

本篇内容介绍了“WCF服务增强的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!待测试系统由后端 WCF 服务和使用该 WCF 服务
2023-06-17

Python增量循环删除MySQL表数据的方法

需求场景:有一业务数据库,使用MySQL 5.5版本,每天会写入大量数据,需要不定期将多表中“指定时期前“的数据进行删除,在SQL SERVER中很容易实现,写几个WHILE循环就搞定,虽然MySQL中也存在类似功能,怎奈自己不精通,于是采
2022-06-04

SpringBoot整合MybatisPlus配置多数据源增强插件的方法是什么

本篇内容介绍了“SpringBoot整合MybatisPlus配置多数据源增强插件的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
2023-06-02

Torch中的数据增强技术有哪些

在Torch中,常用的数据增强技术包括:随机裁剪(Random Cropping):从输入图像中随机裁剪出指定大小的区域,可以增加数据集的多样性。随机翻转(Random Flipping):以一定的概率对输入图像进行水平或垂直翻转,增加数据
Torch中的数据增强技术有哪些
2024-03-14

Oracle Index与数据库安全性的增强

Oracle Index可以帮助提高数据库的性能和安全性。通过为数据库中的表和列创建索引,可以加快数据检索和查询的速度,从而提高系统的性能。同时,索引还可以帮助减少数据库中的重复数据和提高数据的完整性,从而增强数据库的安全性。在数据库安全
Oracle Index与数据库安全性的增强
2024-08-15

SAP ABAP7.50隐式增强的方法是什么

本篇内容介绍了“SAP ABAP7.50隐式增强的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们知道在SAP中除了可以使用EN
2023-06-04

如何用Python增强Excel的3大集成方法及用途

今天就跟大家聊聊有关如何用Python增强Excel的3大集成方法及用途,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。没有人能躲过Microsoft Excel —&m
2023-06-16

sql新增数据的方法是什么

要向数据库中插入新的数据,可以使用 SQL 中的 INSERT INTO 语句。语法如下:INSERT INTO table_name (column1, column2, column3, ...)VALUES (value1, va
sql新增数据的方法是什么
2024-04-11

如何用Python增强Excel减少处理复杂数据的痛苦

今天就跟大家聊聊有关如何用Python增强Excel减少处理复杂数据的痛苦,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Excel既是一种祝福,也是一种诅咒。当涉及到足够小的数据和足
2023-06-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录