返回顶部
首页 > 资讯 > 后端开发 > Python >深入了解Python Opencv数据增强
  • 416
分享到

深入了解Python Opencv数据增强

2024-04-02 19:04:59 416人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1.按比例放大和缩小2.平移图像3.旋转图像4.镜像变换5.添加椒盐噪声6.添加高斯噪声7.模糊化8.重新组合颜色通道实例总结常见的数据增强操作有:按比例放大或缩小图片、旋转、平

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

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),你可以以下面的方式构建移动矩阵:

可以使用 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

实例

我有以下几张测试图片:

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

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

本次程序如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/2/18 16:30
# @Author : 若谷
# @File : Data_Augumentation.py
# @Software: PyCharm
import numpy as np
import cv2
import random
import os
import 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!')

总结

还有其他很多的数据增强操作,例如随机裁剪图像、添加颜色扰动等等。另外也有其他库可以进行这些操作,例如Keras中的图片预处理process库。我这种是离线式的,希望能将变换后的图片保存下来。

以上就是深入了解Python Opencv数据增强的详细内容,更多关于Python Opencv数据增强的资料请关注编程网其它相关文章!

--结束END--

本文标题: 深入了解Python Opencv数据增强

本文链接: https://lsjlt.com/news/139764.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 深入了解Python Opencv数据增强
    目录1.按比例放大和缩小2.平移图像3.旋转图像4.镜像变换5.添加椒盐噪声6.添加高斯噪声7.模糊化8.重新组合颜色通道实例总结常见的数据增强操作有:按比例放大或缩小图片、旋转、平...
    99+
    2024-04-02
  • Python Opencv数据增强的方法
    本篇内容介绍了“Python Opencv数据增强的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!常见的数据增强操作有:按比例...
    99+
    2023-06-29
  • opencv-python图像增强解读
    目录图像增强算子几何变换算子图像金字塔算子图像平滑算子傅立叶变换算子形态学操作算子直方图均衡化Gamma变换总结图像增强算子 几何变换算子 ​ 图像的几何变换又称为图像空间变换, 它...
    99+
    2023-05-19
    opencv python图像增强 opencv python python图像增强
  • Python深度学习albumentations数据增强库
    数据增强的必要性 深度学习在最近十年得以风靡得益于计算机算力的提高以及数据资源获取的难度下降。一个好的深度模型往往需要大量具有label的数据,使得模型能够很好的学习这种数据的分布。...
    99+
    2024-04-02
  • Python 深入了解opencv图像分割算法
    本文主要是基于Python Opencv 实现的图像分割,其中使用到的opencv的函数有: 使用 OpenCV 函数 cv::filter2D 执行一些拉普拉斯滤波以进行...
    99+
    2024-04-02
  • Python opencv操作深入详解
    直接读取图片 def display_img(file="p.jpeg"): img = cv.imread(file) print (img.shape) cv.i...
    99+
    2024-04-02
  • Python OpenCV实现图像增强操作详解
    目录创作背景图像亮度增强和降低旋转水平镜像和垂直镜像高斯噪声其它图像增强的方法创作背景 最近在忙着两个YOLOv7项目,通过看大量的论文,发现很多的相关的论文都会在收集图像后进行图像...
    99+
    2024-04-02
  • 深入了解Python数据类型之列表
    一.基本数据类型 整数:int 字符串:str(注:t等于一个tab键) 布尔值: bool 列表:list (元素的集合) 列表用[] 元祖:tuple 元祖用() 字典:dict 注:所有的数据类型都存...
    99+
    2022-06-04
    数据类型 列表 Python
  • Python数据类型概述:深入了解Python的数据类型
    Python基本数据类型简介:探索Python的数据类型,需要具体代码示例 Python是一种高级编程语言,它提供了丰富的数据类型,使得程序员可以更轻松地处理各种数据。在本文中,我们将探索Python中的几种基本数据类型,并提供...
    99+
    2024-01-20
    基本数据类型 Python简介
  • 深入了解python的函数参数
    目录位置参数默认参数关键字参数多值参数:总结 位置参数 这是一个求等差数列和的函数,使用必需要传入一个参数n,这就是位置参数 def sum(n): sum=0 ...
    99+
    2024-04-02
  • 深入了解Python中常见的数据类型
    Python数据类型详解:探索Python中的常见数据类型 引言:在Python编程语言中,数据类型是非常重要的概念。了解数据类型的特性以及如何正确使用它们,可以在编写Python程序时提高效率,减少错误。本文将详细探索Pyth...
    99+
    2024-01-20
    Python编程 常见数据类型
  • 深入了解Oracle数据库实例
    Oracle数据库是世界领先的关系型数据库管理系统(RDBMS),广泛应用于企业级系统中。Oracle数据库的实例是数据库系统的一个重要组成部分,它包括内存结构和后台进程,用于管理数据...
    99+
    2024-03-08
    实例 深入 sql语句
  • 深入了解Python装饰器函数
    本篇文章给大家带来了关于python的相关知识,其中主要整理了装饰器函数的相关问题,包括了装饰器的形成过程、本质与功能、进阶与优化等等内容,下面一起来看一下,希望对大家有帮助。假如我写了一个函数 fdef f(): print(&#...
    99+
    2022-06-26
    python
  • 深入了解Python中的os.path.join函数
    深入了解Python中的os.path.join函数 1. 引言 在Python中,处理文件和目录路径是常见的任务。为了简化路径的拼接和操作,Python提供了os.path模块,其中的join函数是...
    99+
    2023-09-08
    python 开发语言
  • 深入了解Golang的map增量扩容
    目录核心思想扩容方式源码分析核心思想 以空间换时间,访问速度与填充因子有关 扩容hash表的时候每次都增大2倍,hash表大小始终为2的整数倍,有(hash mod 2^B) == ...
    99+
    2024-04-02
  • 深入了解Python--元组
              ...
    99+
    2023-01-30
    Python
  • opencv深入浅出了解机器学习和深度学习
    目录机器学习kNN算法图解kNN算法用kNN算法实现手写数字识别SVM算法图解SVM算法使用SVM算法识别手写数据k均值聚类算法图解k均值聚类算法使用k均值聚类算法量化图像颜色深度学...
    99+
    2024-04-02
  • 深入了解Python中的基本数据类型:详解Python各种数据类型
    Python基本数据类型详解:了解Python中的各种数据类型,需要具体代码示例 引言:在Python编程语言中,数据类型是程序中最基本也最常用的概念之一。了解Python的基本数据类型,对于编写高质量的代码和有效地处理数据至关...
    99+
    2024-01-20
    数字 变量 字符串
  • 深入了解Golang中的数据类型
    目录1. 基本数据类型1.1 整数型1.2 Golang 提供了两种浮点型数据类型:1.3 布尔型1.4 字符型1.5 字符串型2. 复合数据类型2.1 数组2.2 切片2.3 字符...
    99+
    2023-05-18
    Golang数据类型使用 Golang数据类型 Go 数据类型
  • Java深入了解数据结构之二叉搜索树增插删创详解
    目录①概念②操作-查找③操作-插入④操作-删除1. cur.left == null2. cur.right == null3. cur.left != null &&...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作