文章目录

  • 前言
  • 一、加载并增广一张图片
  • 二、加载并显示一张图片
  • 三、增强图像
  • 四、增强一组图像
  • 五、同时用很多增强图像技术
  • 六、增强不同尺寸的图片

前言

imgaug是一个很好用的图像增广库。学习的最好文档就是官方文档,因此本系列专栏是翻译imgaug库的官方教程文档,全部翻译完后会附增广原图+标签的代码及常用增广图像函数整理~


一、加载并增广一张图片

输入数据格式要求:使用imgaug增广图像只需要几行代码。但在此之前,我们首先要加载图像。Imgaug期望图像是numpy数组,且最好格式为dtype uint8,即当数组的值在0到255的范围内。通道轴总是被期望是最后一个轴,并且对于灰度图像可以不写通道轴。对于非灰度图像,期望的输入颜色空间是RGB。

非uint8数据:需要查看文档中增广图像函数的具体要求,请记住uint8是最受考验的格式。

图像加载函数:因为imgaug只处理增强,而不是图像输入/输出,我们将需要另一个库来加载我们的图像。在python中,一个常见的选择是imageio,我们将在下面使用它。另一个常见的选择是OpenCV通过它的函数cv2.imread()。但是请注意cv2.imread()返回BGR色彩空间中的图像而不是RGB,这意味着您将不得不重新排序通道轴,例如通过cv2.imread(path)[:,:,::-1]。你也可以将每个依赖于颜色空间的增强器更改为BGR(例如灰度或任何改变色相和/或饱和度的增强器)。请参阅API了解每个增强器的详细信息。后一种方法的缺点是,所有可视化函数(例如下面的imog .imshow())仍然需要RGB数据,因此BGR图像看起来会很糟糕。

二、加载并显示一张图片

第一个例子,我们将使用imageio.imread()来加载图像并对其进行增强。在下面的代码块中,我们调用imagio.imread(uri)来直接从维基百科加载图像,但我们也可以从文件路径加载它,例如通过imagio.imread(“/path/to/the/file.jpg”)或Windows imagio.imread(“C:\path\to\the\file.jpg”)。imageio.imread(uri)返回一个numpy数组,包含dtype uint8, shape (height, width, channel)和RGB colorspace。这正是我们所需要的。加载图像后,我们使用imgauge .imshow(array)对加载的图像进行可视化。

import imageio
import imgaug as ia
%matplotlib inlineimage = imageio.imread("https://upload.wikimedia.org/wikipedia/en/7/7d/Lenna_%28test_image%29.png")print("Original:")
ia.imshow(image)


三、增强图像

现在我们已经加载了图像,让我们来扩充它。imgaug以派生自Augmenter父类的类的形式包含许多增强技术。要使用一种增强技术,我们必须用一组超参数实例化它,然后在以后多次应用它。我们的第一个增广技术将是仿射Affine,即仿射变换。我们简单使用该技术在-25°和+25°之间随机旋转图像。

from imgaug import augmenters as iaa
ia.seed(4)rotate = iaa.Affine(rotate=(-25, 25))
image_aug = rotate(image=image)print("Augmented:")
ia.imshow(image_aug)


四、增强一组图像

我们可以只是将参数image更改为images就实现批量增强。通常,对一批图像进行增强比对每一张图像进行单独增强要快得多。

为了简单起见,我们在这里创建了一个批处理,只需复制原始图像几次,然后通过旋转增强器将其输入。为了可视化结果,我们使用numpy的hstack()函数,该函数通过将增强批处理中的图像水平地放在一起,将它们组合成一个大图像。

import numpy as npimages = [image, image, image, image]
images_aug = rotate(images=images)print("Augmented batch:")
ia.imshow(np.hstack(images_aug))


可以看到,批处理中的所有图像都自动旋转了不同的数量。这是因为当通过rotate = iaa.Affine(rotate=(- 25,25))实例化我们的仿射变换时,我们对旋转用一个给定区间(- 25,25),表示旋转度数均匀分布在(-25,25)。我们还可以选择常量rotate=-25来始终旋转-25°,或者选择列表rotate=[-25, -15, 0]来旋转-25°、-15°或0°。我们也可以选择很多其他的概率分布,比如高斯分布或泊松分布。需要查阅相关文档。
图像列表or单个数组:注意,在上面的示例中,我们使用了一个列表将图像组合为一批。我们还可以提供一个形状(N, H, W, [C])的单一numpy数组,其中N表示图像的数量,H表示高度,W表示宽度,C(可选)表示通道轴。通常首选使用numpy数组,因为它们可以节省内存,而且扩充图像速度更快一些。然而,如果你的图像有不同的高度,宽度或通道的数量,它们不能组合到一个单一的数组,则必须使用列表。


五、同时用很多增强图像技术

只执行仿射旋转是相当有限的。因此,在下一个例子中,我们将结合几种方法,并将它们同时应用于图像。为此,我们可以实例化每一种技术,并通过多次调用augmenter(images=…)逐个应用它们。或者,我们可以使用Sequential将不同的增强器组合到一个管道中,然后在单个增强调用中应用它们。我们将使用下面的Sequential来应用仿射旋转(affine),添加一些高斯噪声(AdditiveGaussianNoise),并通过从图像的每一侧删除0%到20%来裁剪图像(crop)。

seq = iaa.Sequential([iaa.Affine(rotate=(-25, 25)),iaa.AdditiveGaussianNoise(scale=(10, 60)),iaa.Crop(percent=(0, 0.2))
])images_aug = seq(images=images)print("Augmented:")
ia.imshow(np.hstack(images_aug))


注意到一些图片是放大的,这个是因为Crop。还要注意所有的图像仍然具有相同的大小。这是因为默认情况下,Crop会保留输入图像的大小,即,在移除像素后,它会将剩余的图像调整回输入大小。如果你不喜欢调整回原来的图像大小,实例化Crop时写为 Crop(…, keep_size=False),其中keep_size表示“在输入和输出之间保持图像大小不变”。

在上面,我们使用Sequential来组合几种增强技术。在实践中,我们也可以将每种技术保存在一个列表中,并手动遍历该列表以单独应用每种技术。虽然Sequential简化了事情,但它并没有多大帮助。然而,它确实有一个我们还没有用到的方便的能力那就是随机增广。如果被激活,它会以随机的顺序应用扩展,极大地增加了可能扩展的空间,让我们不必自己去实现它。

在下一个例子中,我们将使用这种能力。为了更明显,我们增加了一些增强的强度,并显示更多的图像。还要注意,我们是如何通过循环将输入图像增强八次,而不是对整个批处理使用单个调用的增强。这是因为随机顺序是每批采样一次,而不是每个批中图像采样一次。为了在这里看到许多不同的顺序,我们因此增强了多次。

seq = iaa.Sequential([iaa.Affine(rotate=(-25, 25)),iaa.AdditiveGaussianNoise(scale=(30, 90)),iaa.Crop(percent=(0, 0.4))
], random_order=True)images_aug = [seq(image=image) for _ in range(8)]print("Augmented:")
ia.imshow(ia.draw_grid(images_aug, cols=4, rows=2))


仔细看上面的图片。有些是在旋转前被裁剪的,有些是旋转后裁剪的。因为其中几张照片的黑色像素添加了高斯噪声,而另一些没有添加高斯噪声。这些无噪声黑色像素是通过仿射旋转Affine填充新创建的像素。因此,没有噪声的黑色像素图像是在旋转前应用高斯噪声增强的。


六、增强不同尺寸的图片

上面已经提到,imgaug支持包含不同大小图像的批处理,但到目前为止,我们一直使用相同的图像。下面的示例显示了具有不同图像尺寸大小的情况。我们从维基百科加载三张图片,将它们作为单个批处理进行扩充,然后逐个显示每张图片(带有输入和输出形状)。这次我们还使用了一些不同的增强技术。

seq = iaa.Sequential([iaa.CropAndPad(percent=(-0.2, 0.2), pad_mode="edge"),  # crop and pad imagesiaa.AddToHueAndSaturation((-60, 60)),  # change their coloriaa.ElasticTransformation(alpha=90, sigma=9),  # water-like effectiaa.Cutout()  # replace one squared area within the image by a constant intensity value
], random_order=True)# load images with different sizes
images_different_sizes = [imageio.imread("https://upload.wikimedia.org/wikipedia/commons/e/ed/BRACHYLAGUS_IDAHOENSIS.jpg"),imageio.imread("https://upload.wikimedia.org/wikipedia/commons/c/c9/Southern_swamp_rabbit_baby.jpg"),imageio.imread("https://upload.wikimedia.org/wikipedia/commons/9/9f/Lower_Keys_marsh_rabbit.jpg")
]# augment them as one batch
images_aug = seq(images=images_different_sizes)# visualize the results
print("Image 0 (input shape: %s, output shape: %s)" % (images_different_sizes[0].shape, images_aug[0].shape))
ia.imshow(np.hstack([images_different_sizes[0], images_aug[0]]))print("Image 1 (input shape: %s, output shape: %s)" % (images_different_sizes[1].shape, images_aug[1].shape))
ia.imshow(np.hstack([images_different_sizes[1], images_aug[1]]))print("Image 2 (input shape: %s, output shape: %s)" % (images_different_sizes[2].shape, images_aug[2].shape))
ia.imshow(np.hstack([images_different_sizes[2], images_aug[2]]))

Image 0 (input shape: (257, 286, 3), output shape: (257, 286, 3))

Image 1 (input shape: (536, 800, 3), output shape: (536, 800, 3))

Image 2 (input shape: (289, 520, 3), output shape: (289, 520, 3))

【图像增广库imgaug】官方文档翻译(一):加载并增强图片相关推荐

  1. 【图像增广库imgaug】官方文档翻译(二):在多个 CPU 内核上进行扩充

    文章目录 一.示例:augment_batches(..., background=True) 二.包含非图像数据的Batches 三.使用池 四.用生成器使用池 五.限速池可降低最大内存要求 总结 ...

  2. y空间兑换代码_进行图像增广的15+种功能总结和Python代码实现

    python代码可以自己扩充图像数据集. ​ 无论我们喜欢Keras还是Pytorch,我们都可以使用丰富的资料库来有效地增广我们的图像. 但是如果遇到特殊情况: 我们的数据集结构复杂(例如3个输入图 ...

  3. 进行图像增广的15+种功能总结和Python代码实现

    python代码可以自己扩充图像数据集. ​ 无论我们喜欢Keras还是Pytorch,我们都可以使用丰富的资料库来有效地增广我们的图像. 但是如果遇到特殊情况: 我们的数据集结构复杂(例如3个输入图 ...

  4. 街景字符识别2-图像读取及图像增广

    1 目的 PIL读取数据 PIL+Torch生成小批量图像数据样本 理解Baseline中torchvision.transforms进行图像增广的基本使用方法. 2 图像读取 Python中完成数据 ...

  5. 动手学深度学习(二十六)——图像增广(一生二,二生三,三生万物?)

    文章目录 一.图像增广 二.常用的图像增广方法 1. 翻转和裁减 2. 颜色改变 3. 叠加使用多种数据增广方法 三.使用图像增广进行训练 四.总结(干活分享) 一.图像增广 定义&解释: 通 ...

  6. 图像处理:手写实现图像增广算法(旋转、亮度调整、裁剪与拼接)

    目录 前言 算法理论 基础实现 a.旋转 b.亮度调整 c.裁剪及拼接 随机调整参数 d.随机翻转算法 e.随机颜色明暗调整算法 f.随机裁剪算法 实验分析 本章小结 参考文章 前言 图像增广算法在计 ...

  7. 深度学习——图像增广

    图像增广 图像增广是对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模.我们深知大型数据集是成功应用深度神经网络的先决条件.应用图像增广能够随机改变训练样本可以减小模型 ...

  8. 计算机视觉:数据预处理-图像增广方法

    计算机视觉:数据预处理-图像增广方法 数据预处理 随机改变亮暗.对比度和颜色等 随机填充 随机裁剪 随机缩放 随机翻转 随机打乱真实框排列顺序 图像增广方法汇总 批量数据读取与加速 数据预处理 在计算 ...

  9. [pytorch、学习] - 9.1 图像增广

    参考 9.1 图像增广 在5.6节(深度卷积神经网络)里我们提过,大规模数据集是成功应用神经网络的前提.图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但 ...

最新文章

  1. java spring框架 注解_史上最全的java spring注解
  2. python supervisord 远程命令执行漏洞(CVE-2017-11610)
  3. 1268 和为K的组合
  4. 【CyberSecurityLearning 65】业务安全+业务逻辑漏洞实战
  5. 【Kaggle】Intermediate Machine Learning(XGBoost + Data Leakage)
  6. mysql服务器默认操作字符集,如何在mysql中找到默认服务器字符集?
  7. vv7无法启动显示发动机故障_发动机电控系统常见故障(发动机不能启动)的解决方法...
  8. mysql教程查询语句_mysql-Mysql 查询语句怎么写?
  9. javascript模拟抽奖
  10. Servlet和Tomcat底层分析
  11. HeadFIrst Ruby 第二章总结 methods and classes
  12. StrongShop跨境电商系统源码 支持多语言多货币
  13. android usb独占模式,Android USB主机模式和附件模式
  14. python文件去重软件_python去重工具
  15. 盖茨、马斯克都遵循的学习法则:知识不由学科划分
  16. 没事干的时候可以看这些,超全超多…
  17. 粒子群优化算法实现寻找函数最值
  18. 成功项目策划“四要素”
  19. 若依框架,集成flowable工作流
  20. Python提取岛上书店书中所有书名后做成词云

热门文章

  1. C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535)
  2. vue h5端实现富文本图片预览(基于 Vant 的 ImagePreview 组件)
  3. 行走在数据库上的行癫(二)
  4. Codeforces 868C - Qualification Rounds 思维
  5. 最常被遗忘的 Web 性能优化:浏览器缓存
  6. 【多源融合】自适应卡尔曼滤波的多种形式:遗忘卡尔曼滤波、渐消记忆卡尔曼滤波和自适应卡尔曼滤波
  7. windows电脑打开jnlp文件设置
  8. Spark性能优化之-资源调优
  9. JVM和ART、DVM(dalvik VM)的区别
  10. 技术杂谈 | 分享Iteye的开涛对IoC的精彩讲解