深入浅出Python中三个图像增强库的使用

目录
  • 介绍
  • Imgaug
  • Albumentations
  • SOLT
  • 结论

介绍

本文中探索三个流行的 Python 图像增强库。

图像分类器通常在训练更多的图像时表现得更好。在图像分类模型中,一个常见的问题是,模型不能正确地对图像进行分类,只是因为它没有针对同一图像的不同方向进行训练。这可以通过向模型提供多种可能的图像方向和转换来克服。

然而,在现实中,收集这些不同的数据可能需要更多的时间、资源和专业知识,而且对公司来说成本可能很高。在这种情况下,图像数据增强是一个流行的选择,通过使用一个或多个增强技术来生成用于训练的各种图像,从而为现有数据集增加多样性。

尽管一些Python库支持多种增强技术,但并不是所有的技术都适合训练模型。用户需要知道哪些增强技术可以帮助生成用于训练模型的实际附加数据。

我们可以使用各种技术来增强图像数据。它可以包括:

  • 使用几何变换(例如翻转、裁剪、旋转、缩放等)增强图像数据。
  • 通过使用颜色转换来增强图像数据,例如通过调整亮度、暗度、锐度、饱和度等。
  • 通过随机擦除、混合图像等来增强图像数据。

Imgaug

Imgaug 是一个开源 python 包,可让你在机器学习实验中增强图像。它适用于各种增强技术。它有一个简单而强大的界面,可以增强图像、地标、边界框、热图和分割图。

让我们首先使用 pip 安装这个库。

pip install imgaug

接下来,我们将使用 pip 命令在命令提示符下安装名为“IPyPlot”的 python 包:

pip install ipyplot

IPyPlot 是一个 Python 工具,允许在 Python Notebook 单元格中快速高效地显示图像。这个包将 IPython 与 HTML 相结合,以提供一种更快、更丰富、更具交互性的方式来显示图像。这个包的 'plot_images' 命令将用于以网格状结构绘制所有图像。

此外,我们将导入扩充数据所需的所有必要包。

import imageio
import imgaug as ia
import imgaug.augmenters as iaa

增强的图像路径在此处定义。我们将使用鸟类图像作为示例。

input_img = imageio.imread('../input/image-bird/bird.jpg')

图像翻转

我们可以使用下面的命令水平和垂直翻转图像。以下代码中的“Fliplr”关键字水平翻转图像。同样,关键字“Flipud”垂直翻转图像。

#Horizontal Flip
hflip= iaa.Fliplr(p=1.0)
input_hf= hflip.augment_image(input_img)
#Vertical Flip
vflip= iaa.Flipud(p=1.0)
input_vf= vflip.augment_image(input_img)
images_list=[input_img, input_hf, input_vf]
labels = ['Original', 'Horizontally flipped', 'Vertically flipped']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

每个图像被翻转的概率由 p 表示。默认情况下,概率设置为 0.0。要水平翻转输入图像,请使用 Fliplr(1.0) 。同样,当垂直翻转图像时,使用 Flipud(1.0) 。

图像旋转

通过以度为单位定义旋转,我们可以旋转图像。

rot1 = iaa.Affine(rotate=(-50,20))
input_rot1 = rot1.augment_image(input_img)
images_list=[input_img, input_rot1]
labels = ['Original', 'Rotated Image']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

图像裁剪

裁剪图像包括从图像的侧面移除像素的列或行,可以从全尺寸输入图像中提取较小尺寸的子图像。要删除的像素数可以以绝对数或图像大小的一部分指定。

在这种情况下,我们使用从连续间隔 [0.0, 0.3] 中均匀获取的随机分数裁剪图像的每一侧,并在每个图像和每侧采样一次。在这里,我们为顶部取 0.3 的采样分数,这会将图像裁剪 0.3*H,其中 H 是输入图像的高度。

crop1 = iaa.Crop(percent=(0, 0.3))
input_crop1 = crop1.augment_image(input_img)
images_list=[input_img, input_crop1]
labels = ['Original', 'Cropped Image']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

为图像添加噪点

该增强器将高斯噪声添加到输入图像。尺度值是产生噪声的正态分布的标准偏差。

noise=iaa.AdditiveGaussianNoise(10,40)
input_noise=noise.augment_image(input_img)
images_list=[input_img, input_noise]
labels = ['Original', 'Gaussian Noise Image']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

图像剪切

该增强器以 -40 到 40 度范围内的随机量剪切图像。

shear = iaa.Affine(shear=(-40,40))
input_shear=shear.augment_image(input_img)
images_list=[input_img, input_shear]
labels = ['Original', 'Image Shearing']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

图像对比度

该增强器通过缩放像素值来调整图像对比度。

contrast=iaa.GammaContrast((0.5, 2.0))
contrast_sig = iaa.SigmoidContrast(gain=(5, 10), cutoff=(0.4, 0.6))
contrast_lin = iaa.LinearContrast((0.6, 0.4))
input_contrast = contrast.augment_image(input_img)
sigmoid_contrast = contrast_sig.augment_image(input_img)
linear_contrast = contrast_lin.augment_image(input_img)
images_list=[input_img, input_contrast,sigmoid_contrast,linear_contrast]
labels = ['Original', 'Gamma Contrast','SigmoidContrast','LinearContrast']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

GammaContrast 函数使用公式 255*((v/255)**gamma 调整图像对比度,其中 v 是像素值,gamma 从范围 [0.5, 2.0] 中均匀采样。

SigmoidContrast 使用公式 255*1/(1+exp(gain*(cutoff-v/255)) 调整图像对比度 (其中v为像素值,gain 从区间[3, 10]开始均匀采样(每张图像一次),截断采样与区间 [0.4, 0.6] 一致。

LinearContrast 使用公式 127 + alpha*(v-127) 改变图像对比度,其中 v 是像素值,alpha 从 [0.4, 0.6] 范围内均匀采样。

图像转换

“ElasticTransformation”增强器通过使用位移场在局部移动像素来变换图像。增强器的参数是 alpha 和 sigma。位移的强度由 alpha 控制,其中较大的值表示像素移动得更远。位移的平滑度由 sigma 控制,其中较大的值会导致更平滑的图案。

elastic = iaa.ElasticTransformation(alpha=60.0, sigma=4.0)
polar = iaa.WithPolarWarping(iaa.CropAndPad(percent=(-0.2, 0.7)))
jigsaw = iaa.Jigsaw(nb_rows=20, nb_cols=15, max_steps=(3, 7))
input_elastic = elastic.augment_image(input_img)
input_polar = polar.augment_image(input_img)
input_jigsaw = jigsaw.augment_image(input_img)
images_list=[input_img, input_elastic,input_polar,input_jigsaw]
labels = ['Original', 'elastic','polar','jigsaw']
ipyplot.plot_images(images_list,labels=labels,img_width=180)

在使用“Polar Warping”增强器时,首先在极坐标表示中应用裁剪和填充,然后再将其扭转回笛卡尔表示。这个增强器可以为图像添加额外的像素。这些将被黑色像素填充。此外,“Jigsaw”增强以类似于拼图模式的方式移动图片内的单元格。

图像上的边界框

Imgaug 还为图像提供边界框支持。如果在增强期间旋转,该库可以旋转图像上的所有边界框。

from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage
bbs = BoundingBoxesOnImage([
 BoundingBox(x1=40, x2=550, y1=40, y2=780)
], shape=input_img.shape)
ia.imshow(bbs.draw_on_image(input_img))

Albumentations

Albumentations 是一个快速且知名的库,它与流行的深度学习框架(如 PyTorch 和 TensorFlow)集成。它也是 PyTorch 生态系统的一部分。

Albumentations 可以执行所有典型的计算机视觉任务,包括分类、语义分割、实例分割、对象识别和姿势估计。该库包含 70 多种不同的增强功能,用于从现有数据创建新的训练样本。它通常用于工业、深度学习研究、机器学习竞赛和开源项目。

让我们首先使用 pip 命令安装库。

pip install Albumentations

我们将导入使用 Albumentations 扩充数据所需的所有必要包:

import albumentations as A
import cv2

除了 Albumentations 包之外,我们还使用 OpenCV 包,这是一个支持多种图像格式的开源计算机视觉库。Albumentations 依赖于 OpenCV;因此,你已经安装了它。

图像翻转

'A.HorizontalFlip' 和 'A.VerticalFlip' 函数用于水平和垂直翻转图像。p 是一个独特的参数,几乎所有的扩充都支持。它控制使用增强的概率。

#HorizontalFlip
transform = A.HorizontalFlip(p=0.5)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

#VerticalFlip
transform = A.VerticalFlip(p=1)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

图像缩放和旋转

该增强器随机使用仿射变换来平移、缩放和旋转输入图像。

transform = A.ShiftScaleRotate(p=0.5)
random.seed(7)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

图像 ChannelShuffle

该增强器随机重新排列输入图像的 RGB 通道。

from albumentations.augmentations.transforms import ChannelShuffle
transform = ChannelShuffle(p=1.0)
random.seed(7)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

图像曝光

该增强器反转输入图像中大于某个阈值的所有像素值。

from albumentations.augmentations.transforms import Solarize
transform = Solarize(threshold=200,  p=1.0)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

反转图像

通过从 255 中减去像素值,此增强器反转输入图像。

from albumentations.augmentations.transforms import InvertImg
transform = InvertImg(p=1.0)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

使用 Compose 增强管道

要定义一个扩展管道,首先,创建一个 Compose 实例。你必须提供扩充列表作为 Compose 类的参数。在此示例中,我们将使用各种增强功能,例如转置、模糊、失真等。

调用 Compose 将导致返回一个将进行图像增强的转换函数。

transform = A.Compose([
    A.RandomRotate90(),
    A.Transpose(),
    A.ShiftScaleRotate(shift_limit=0.08, scale_limit=0.5, rotate_limit=5, p=.8),
    A.Blur(blur_limit=7),
    A.GridDistortion(),
])
random.seed(2)
augmented_image = transform(image=input_img)['image']
plt.figure(figsize=(4, 4))
plt.axis('off')
plt.imshow(augmented_image)

SOLT

SOLT 是一个深度学习数据增强库,支持图像、分割掩码、标签和关键点。SOLT 也很快,并且在其后端有 OpenCV。

我们将从使用 pip 命令安装 SOLT 开始

pip install solt

然后我们将导入增强图像数据所需的所有必要的 SOLT 包。

import solt
import solt.transforms as slt
h, w, c = input_img.shape
img = input_img[:w]

在这里,我们将为扩充管道创建一个 Stream 实例。你必须提供扩充列表作为流类的参数。

stream = solt.Stream([
    slt.Rotate(angle_range=(-90, 90), p=1, padding='r'),
    slt.Flip(axis=1, p=0.5),
    slt.Flip(axis=0, p=0.5),
    slt.Shear(range_x=0.3, range_y=0.8, p=0.5, padding='r'),
    slt.Scale(range_x=(0.8, 1.3), padding='r', range_y=(0.8, 1.3), same=False, p=0.5),
    slt.Pad((w, h), 'r'),
    slt.Crop((w, w), 'r'),
    slt.Blur(k_size=7, blur_type='m'),
    solt.SelectiveStream([
        slt.CutOut(40, p=1),
        slt.CutOut(50, p=1),
        slt.CutOut(10, p=1),
        solt.Stream(),
        solt.Stream(),
    ], n=3),
], ignore_fast_mode=True)
fig = plt.figure(figsize=(17,17))
n_augs = 10
random.seed(2)
for i in range(n_augs):
    img_aug = stream({'image': img}, return_torch=False, ).data[0].squeeze()
    ax = fig.add_subplot(1,n_augs,i+1)
    if i == 0:
        ax.imshow(img)
    else:
        ax.imshow(img_aug)
    ax.set_xticks([])
    ax.set_yticks([])
plt.show()

结论

图像增强可以帮助增加现有数据集。目前有几个 Python 库可用于图像增强。在本文中,我们使用三个 Python 库——ImgaugAlbalentationsSolt探索了不同的图像增强技术。

到此这篇关于深入浅出Python中三个图像增强库的使用的文章就介绍到这了,更多相关Python图像增强库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python 图像增强算法实现详解

    使用python编写了共六种图像增强算法: 1)基于直方图均衡化 2)基于拉普拉斯算子 3)基于对数变换 4)基于伽马变换 5)限制对比度自适应直方图均衡化:CLAHE 6)retinex-SSR 7)retinex-MSR其中,6和7属于同一种下的变化. 将每种方法编写成一个函数,封装,可以直接在主函数中调用. 采用同一幅图进行效果对比. 图像增强的效果为: 直方图均衡化:对比度较低的图像适合使用直方图均衡化方法来增强图像细节 拉普拉斯算子可以增强局部的图像对比度 log对数变换对于整体对比度

  • python 基于opencv实现图像增强

    为了得到更加清晰的图像我们需要通过技术对图像进行处理,比如使用对比度增强的方法来处理图像,对比度增强就是对图像输出的灰度级放大到指定的程度,获得图像质量的提升.本文主要通过代码的方式,通过OpenCV的内置函数将图像处理到我们理想的结果. 灰度直方图 灰度直方图通过描述灰度级在图像矩阵中的像素个数来展示图像灰度级的信息,通过灰度直方图的统计我们可以看到每个灰度值的占有率.下面是一个灰度直方图的实现: import cv2 import numpy as np import sys import

  • Python 图像对比度增强的几种方法(小结)

    图像处理工具--灰度直方图 灰度直方图时图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率. 例子:矩阵 图片来自网络,侵删! 上面图片的灰度直方图 python实现 #!usr/bin/env python #-*- coding:utf-8 _*- """ @author:Sui yue @describe: 灰度直方图,描述每个灰度级在图像矩阵中的像素个数或者占有率 @time: 2019/09/15 """ import

  • Python图像的增强处理操作示例【基于ImageEnhance类】

    本文实例讲述了Python图像的增强处理操作.分享给大家供大家参考,具体如下: python中PIL模块中有一个叫做ImageEnhance的类,该类专门用于图像的增强处理,不仅可以增强(或减弱)图像的亮度.对比度.色度,还可以用于增强图像的锐度. 具体见下面的例子: #-*- coding: UTF-8 -*- from PIL import Image from PIL import ImageEnhance #原始图像 image = Image.open('lena.jpg') imag

  • Python基于域相关实现图像增强的方法教程

    目录 介绍 昆虫增强 使用针的增强 实验结果 介绍 当在图像上训练深度神经网络模型时,通过对由数据增强生成的更多图像进行训练,可以使模型更好地泛化.常用的增强包括水平和垂直翻转/移位.以一定角度和方向(顺时针/逆时针)随机旋转.亮度.饱和度.对比度和缩放增强. Python中一个非常流行的图像增强库是albumentations(https://albumentations.ai/),通过直观的函数和优秀的文档,可以轻松地增强图像.它也可以与PyTorch和TensorFlow等流行的深度学习框

  • 深入浅出Python中三个图像增强库的使用

    目录 介绍 Imgaug Albumentations SOLT 结论 介绍 本文中探索三个流行的 Python 图像增强库. 图像分类器通常在训练更多的图像时表现得更好.在图像分类模型中,一个常见的问题是,模型不能正确地对图像进行分类,只是因为它没有针对同一图像的不同方向进行训练.这可以通过向模型提供多种可能的图像方向和转换来克服. 然而,在现实中,收集这些不同的数据可能需要更多的时间.资源和专业知识,而且对公司来说成本可能很高.在这种情况下,图像数据增强是一个流行的选择,通过使用一个或多个增

  • Python中Anaconda3 安装gdal库的方法

    过来人的惨痛经验告知 !!!一定要版本配套!!(老手就当我没说) 方法一:打开Anaconda文件里面的Anaconda Prompt窗口 :输入pip install gdal 若出现如下情况 则安装失败 转方法二: 方法二:在Anaconda Prompt窗口 输入:conda install gdal 回车 过程漫长 中间会询问你是否继续 你输入 y 就行 安装成功后 进行测试一下:输入 python 回车 : 在python中输入 import GDAL 如果显示: 那你在python中

  • Python中如何使用Matplotlib库绘制图形

    目录 前言 一.简单的正弦函数与余弦函数 二.进阶版正弦函数与余弦函数 1.改变颜色与粗细 2.设置图片边界 3.设置记号 4.设置记号的标签 5.设置X,Y轴 6.完整代码 三.绘制简单的折线图 总结 前言 Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件.它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式.这里将会探索使用matplotlib 库实现简单的图形绘制. 一.简单的正弦函数与余弦函数 是取得正弦函数和余弦函数的值: X 是一个 numpy 数组,

  • 详解python中的Turtle函数库

    python对函数库的引用方式 1.import <库名> 例如:import turtle 如果需要使用库函数中的函数,需要使用:<库名>.<函数名> 例如: import turtle turtle.fd(100) 2.from <库名> import <函数名> from <库名> import  *, 使用这种方式时,直接使用<函数名> 例如:  >>>from turtle import *  

  • python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案

    python中通过pip安装库文件时出现"EnvironmentError: [WinError 5] 拒绝访问" 我遇到的问题:电脑上已经有了一个numpy==1.19.1,但是出于某种原因,我需要降级为numpy==1.16.2, 因此在命令行窗口中输入: pip install numpy==1.16.2 Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问.: 'E:\\applicat

  • python中threading和queue库实现多线程编程

    摘要 本文主要介绍了利用python的 threading和queue库实现多线程编程,并封装为一个类,方便读者嵌入自己的业务逻辑.最后以机器学习的一个超参数选择为例进行演示. 多线程实现逻辑封装 实例化该类后,在.object_func函数中加入自己的业务逻辑,再调用.run方法即可. # -*- coding: utf-8 -*- # @Time : 2021/2/4 14:36 # @Author : CyrusMay WJ # @FileName: run.py # @Software:

  • python中三种高阶函数(map,reduce,filter)详解

    map(function,seq[,seq2]) 接收至少两个参数,基本作用为将传入的函数依次作用到序列的每个元素,并且把结果作为新的序列 返回一个可迭代的map对象 function:函数对象 py2中可为None,作用等同于zip() 如: py3中不可为None,None是不可调用.不可迭代对象 seq:可迭代对象,可以传一个或多个 # 传一个: def func(i):return i*2 print([i for i in map(func,[1,'2'])]) # [2,'22']

  • Python中三个不可思议的返回功能分享

    目录 第一个:神奇的字典键 第二个:异常处理中的return 第三个:相同对象的判断 总结 第一个:神奇的字典键 some_dict = {} some_dict[5.5] = "Ruby" some_dict[5.0] = "JavaScript" some_dict[5] = "Python" Output: >>> some_dict[5.5] "Ruby" >>> some_dict

  • Python中三种条件语句示例介绍

    目录 if if…else if…elif…else 总结 if """ 条件语句: if if...else if...elif...else if 语句的格式: if 条件: 条件成立要执行的语句 条件:运算符构成---> bool """ print(1) print(2) result = input('请输入(y/n):') if result == 'y': print('good~') print('-'*20) if…els

  • Python中三种花式打印的示例详解

    目录 1. 引言 2. 打印圣诞树 2.1 问题描述 2.2 问题分析 3. 打印字母版圣诞树 3.1 问题描述 3.2 问题分析 4. 打印字母版菱形 4.1 问题描述 4.2 问题分析 5. 总结 1. 引言 在Python中有很多好玩的花式打印,对厉害的高手来说可能是小菜一碟,对入门的小白来说往往让人望而退步,我们今天就来挑战下面三个常见的花式打印吧... 2. 打印圣诞树 2.1 问题描述 编码实现函数christmas_tree(height),该函数输入参数为一个整数表示圣诞树的高度

随机推荐