【图像增广库imgaug】官方文档翻译(一):加载并增强图片
文章目录
- 前言
- 一、加载并增广一张图片
- 二、加载并显示一张图片
- 三、增强图像
- 四、增强一组图像
- 五、同时用很多增强图像技术
- 六、增强不同尺寸的图片
前言
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】官方文档翻译(一):加载并增强图片相关推荐
- 【图像增广库imgaug】官方文档翻译(二):在多个 CPU 内核上进行扩充
文章目录 一.示例:augment_batches(..., background=True) 二.包含非图像数据的Batches 三.使用池 四.用生成器使用池 五.限速池可降低最大内存要求 总结 ...
- y空间兑换代码_进行图像增广的15+种功能总结和Python代码实现
python代码可以自己扩充图像数据集. 无论我们喜欢Keras还是Pytorch,我们都可以使用丰富的资料库来有效地增广我们的图像. 但是如果遇到特殊情况: 我们的数据集结构复杂(例如3个输入图 ...
- 进行图像增广的15+种功能总结和Python代码实现
python代码可以自己扩充图像数据集. 无论我们喜欢Keras还是Pytorch,我们都可以使用丰富的资料库来有效地增广我们的图像. 但是如果遇到特殊情况: 我们的数据集结构复杂(例如3个输入图 ...
- 街景字符识别2-图像读取及图像增广
1 目的 PIL读取数据 PIL+Torch生成小批量图像数据样本 理解Baseline中torchvision.transforms进行图像增广的基本使用方法. 2 图像读取 Python中完成数据 ...
- 动手学深度学习(二十六)——图像增广(一生二,二生三,三生万物?)
文章目录 一.图像增广 二.常用的图像增广方法 1. 翻转和裁减 2. 颜色改变 3. 叠加使用多种数据增广方法 三.使用图像增广进行训练 四.总结(干活分享) 一.图像增广 定义&解释: 通 ...
- 图像处理:手写实现图像增广算法(旋转、亮度调整、裁剪与拼接)
目录 前言 算法理论 基础实现 a.旋转 b.亮度调整 c.裁剪及拼接 随机调整参数 d.随机翻转算法 e.随机颜色明暗调整算法 f.随机裁剪算法 实验分析 本章小结 参考文章 前言 图像增广算法在计 ...
- 深度学习——图像增广
图像增广 图像增广是对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模.我们深知大型数据集是成功应用深度神经网络的先决条件.应用图像增广能够随机改变训练样本可以减小模型 ...
- 计算机视觉:数据预处理-图像增广方法
计算机视觉:数据预处理-图像增广方法 数据预处理 随机改变亮暗.对比度和颜色等 随机填充 随机裁剪 随机缩放 随机翻转 随机打乱真实框排列顺序 图像增广方法汇总 批量数据读取与加速 数据预处理 在计算 ...
- [pytorch、学习] - 9.1 图像增广
参考 9.1 图像增广 在5.6节(深度卷积神经网络)里我们提过,大规模数据集是成功应用神经网络的前提.图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但 ...
最新文章
- java spring框架 注解_史上最全的java spring注解
- python supervisord 远程命令执行漏洞(CVE-2017-11610)
- 1268 和为K的组合
- 【CyberSecurityLearning 65】业务安全+业务逻辑漏洞实战
- 【Kaggle】Intermediate Machine Learning(XGBoost + Data Leakage)
- mysql服务器默认操作字符集,如何在mysql中找到默认服务器字符集?
- vv7无法启动显示发动机故障_发动机电控系统常见故障(发动机不能启动)的解决方法...
- mysql教程查询语句_mysql-Mysql 查询语句怎么写?
- javascript模拟抽奖
- Servlet和Tomcat底层分析
- HeadFIrst Ruby 第二章总结 methods and classes
- StrongShop跨境电商系统源码 支持多语言多货币
- android usb独占模式,Android USB主机模式和附件模式
- python文件去重软件_python去重工具
- 盖茨、马斯克都遵循的学习法则:知识不由学科划分
- 没事干的时候可以看这些,超全超多…
- 粒子群优化算法实现寻找函数最值
- 成功项目策划“四要素”
- 若依框架,集成flowable工作流
- Python提取岛上书店书中所有书名后做成词云
热门文章
- C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535)
- vue h5端实现富文本图片预览(基于 Vant 的 ImagePreview 组件)
- 行走在数据库上的行癫(二)
- Codeforces 868C - Qualification Rounds 思维
- 最常被遗忘的 Web 性能优化:浏览器缓存
- 【多源融合】自适应卡尔曼滤波的多种形式:遗忘卡尔曼滤波、渐消记忆卡尔曼滤波和自适应卡尔曼滤波
- windows电脑打开jnlp文件设置
- Spark性能优化之-资源调优
- JVM和ART、DVM(dalvik VM)的区别
- 技术杂谈 | 分享Iteye的开涛对IoC的精彩讲解