|
034、imgaug图像数据增强之Augmenters常用函数
- import imgaug as ia
- import imgaug.augmenters as iaa
- import numpy as np
- import imageio
- print(ia.__version__)
- img_path = 'dfy_imgs/ai111.jpg'
- img = imageio.imread(img_path)
- print(type(img), img.shape)
- ia.seed(666)
- seq = iaa.Noop()
- batch_images = np.array([img, img, img])
- print(batch_images.shape)
- batch_images_auged = seq.augment_images(batch_images)
- print('增强后的:', type(batch_images_auged), batch_images_auged.shape)
- ia.imshow(np.hstack([np.vstack(batch_images), np.vstack(batch_images_auged)]))
- # ia.imshow(np.vstack(batch_images_auged))
复制代码
- # -*- coding: utf-8 -*-
- __author__ = u'东方耀 微信:dfy_88888'
- __date__ = '2020/1/13 9:32'
- __product__ = 'PyCharm'
- __filename__ = '01_Augmenters常用函数'
- import imgaug as ia
- import imgaug.augmenters as iaa
- import imageio
- import numpy as np
- print(ia.__version__)
- img_path = 'dfy_imgs/ai111.jpg'
- img = imageio.imread(img_path)
- print(type(img), img.shape)
- ia.seed(666)
- # iaa.Sequential() 产生一个处理图片的Sequential
- seq1 = iaa.Sequential(children=[
- # iaa.Crop(px=(100, 102)),
- # iaa.CropAndPad(px=(100, 102)),
- iaa.Fliplr(p=0.5), # left right
- iaa.Flipud(p=0.5), # up down
- # iaa.GaussianBlur(sigma=(0, 3.0)),
- iaa.AdditiveGaussianNoise(scale=(30, 90)),
- ], random_order=False)
- # iaa.someOf() 将Augmenter中的部分变换应用在图片处理上,而不是应用所有的Augmenter。
- # 例如:可以定义20种变换,但每次只选择其中的5个。但是不支持固定选择某一个Augmenter
- # n=(1, None) 每次使用1到多个Augmenter来处理图片,每个batch中的Augmenters顺序不一样。
- # n=(1, 3) 使用1~3个Augmenter来处理图片,每个batch中的Augmenters顺序一样。
- # n=2 每次选择2个变换
- seq2 = iaa.SomeOf(n=(1, None), children=[
- iaa.Flipud(p=0.5),
- iaa.Fliplr(p=0.5),
- iaa.GaussianBlur(sigma=1.0),
- ])
- # iaa.OneOf() 每次从一系列Augmenters中选择一个来变换
- # iaa.Sometimes(p=0.5, then_list=, else_list=) 对batch中的一部分图片应用一部分Augmenters,剩下的图片应用另外的Augmenters
- # 注意变换的图片应用的Augmenter只能是then_list或者else_list中的一个
- # iaa.WithColorspace(to_colorspace=) 在某个特定的颜色空间对图像进行变换。
- # 即:先将图片从一个颜色空间变换到另一个颜色空间,然后在另一个颜色空间中对图像进行变换,最后再变换回原来的颜色空间
- # 先将图片从RGB变换到HSV(色调(H),饱和度(S),明度(V)),然后将H值增加10,然后再变换回RGB
- # iaa.WithChannels:从图片中挑选出一个Channel来进行变换,变换完了之后再将该channel merge回去。
- seq3 = iaa.WithColorspace(to_colorspace='HSV', children=[
- iaa.WithChannels(channels=0, children=[
- iaa.Add(10)
- ])
- ])
- # iaa.Noop() 不进行任何变换。某些情况下只想使用一个Augmenter作为占位符,
- # 这样可以继续调用augment_image()函数,但实际不作变换。例如进行测试的时候可以使用这个。
- # iaa.Lambda(func_images=,func_heatmaps=,func_segmentation_maps=,func_keypoints=) 自定义一些变换函数
- def func_images(images, random_state, parents, hooks):
- images[:, ::2, :, :] = 0
- return images
- def func_keypoints(keypoints_on_images, random_state, parents, hooks):
- return keypoints_on_images
- # 将每张图片每隔两行的像素点变成黑色的条带,关键点保留
- seq4 = iaa.Lambda(
- func_images=func_images,
- func_keypoints=func_keypoints
- )
- # iaa.AssertShape(shape=[NHWC]) assert要变换的图片和keypoint的shape。如果不满足就抛出异常
- # 先检查图片的高度是否是200<=H<300, 宽度是否是617, channel是否是1或者3。如果都满足则执行水平翻转,否则报错。
- seq5 = iaa.Sequential([
- # iaa.AssertShape(shape=(None, 296, 617, 3)),
- iaa.AssertShape((None, (200, 300), 617, [1, 3])),
- iaa.Fliplr(0.5)
- ])
- # iaa.Scale() 将图像缩放到固定大小 Resize has the exactly same interface as Scale.
- # iaa.Resize(size=,interpolation='cubic')
- # size: 字符串”keep”,此时保持图像原大小不坐缩放。
- # 如果是一个整数n,则缩放成(n, n)。如果是一个float v,则每张图片会被缩放成(H*v, W*v),此时每张图像大小仍然不一样
- # •interpolation: 缩放方法。如果是All, 则会随机从下面挑选一个: nearest、linear、area、cubic,注意每张图片可能不一样
- # 如果是string,则该种方法会被一直使用,必须是下面的一种: nearest, linear, area, cubic
- seq6 = iaa.Sequential(children=[
- # iaa.Resize(size='keep', interpolation='cubic'),
- iaa.KeepSizeByResize(children=[
- iaa.Resize(size=0.6, interpolation='cubic'),
- ], interpolation='cubic'),
- ])
- # iaa.CropAndPad(px=,percent=,pad_mode=,pad_cval=,keep_size=True)
- # •px: 想要crop(negative values)的或者pad(positive values)的像素点。注意与percent不能同时存在。
- # •pad_mode: 填充方式。可以是All, string, string list。
- # 可选的填充方式有: constant, edge, linear_ramp, maximum, median, minimum, reflect, symmetric, wrap 具体含义可查numpy文档
- # pad_cval(constant value):当pad_mode=constant的时候选择填充的值
- seq7 = iaa.Sequential(children=[
- # iaa.CropAndPad(percent=0.2, pad_mode='constant', pad_cval=255, keep_size=True),
- iaa.CropAndPad(px=(10, 102), pad_mode='linear_ramp', keep_size=True),
- iaa.GaussianBlur(sigma=1.2)
- ])
- # iaa.ChangeColorspace(to_colorspace=) linear_ramp
- # iaa.Grayscale(alpha=) 变成灰度图
- # iaa.GaussianBlur(sigma=) 高斯扰动 •sigma: 高斯变换的标准差 常见的有0,不扰动。3,强扰动
- # iaa.AverageBlur(k=3) 从最邻近像素中取均值来扰动 •k:窗口大小
- # iaa.MedianBlur(k=) 通过最近邻中位数来扰动
- # iaa.BilateralBlur(d=) Bilateral Blur(双边滤波)
- # iaa.MotionBlur(k=) 移动模糊也就是物体移动时会产生模糊的现象,可以说是相对观察相机快速变动的物体
- # (与其说是物体,还不如说是相应的片元fragment)产生的残影与物体本体叠加在一个范围,产生的模糊现象
- seq8 = iaa.Sequential(children=[
- # iaa.GaussianBlur(sigma=2),
- # iaa.AverageBlur(k=3),
- # iaa.MedianBlur(k=3),
- # iaa.BilateralBlur(d=3),
- iaa.MotionBlur(k=5),
- ])
- # iaa.Convolve(matrix=) 对图像使用卷积操作
- # iaa.Sharpen(alpha=0, lightness=1), 锐化
- # iaa.Emboss 浮雕效果
- # iaa.EdgeDetect 边缘检测
- # iaa.DirectedEdgeDetect 特定方向的边缘检测
- seq9 = iaa.Sequential(children=[
- # iaa.Convolve(matrix=np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]])),
- # iaa.Sharpen(alpha=1, lightness=1),
- # iaa.Emboss(alpha=1, strength=1),
- # iaa.EdgeDetect(alpha=0.3),
- iaa.DirectedEdgeDetect(alpha=0.3, direction=(0.0, 1.0)),
- ])
- seq10 = iaa.Sequential(children=[
- # iaa.Add(value=100, per_channel=True),
- # iaa.AddElementwise(value=10, per_channel=False), # 按像素加
- # iaa.AdditiveGaussianNoise(loc=0, scale=30) # 添加高斯噪声
- # iaa.Multiply(mul=2.0) # 给图像中的每个像素点乘一个值使得图片更亮或者更暗
- # iaa.MultiplyElementwise() # 按像素值乘
- # iaa.Dropout(p=0.1), # 随机去掉一些像素点, 即把这些像素点变成0
- # iaa.CoarseDropout(), # 将矩形框的值设置为0
- iaa.Invert(p=0.5), # 将每个像素值p变成255-p
- ])
- seq11 = iaa.Sequential(children=[
- # 改变图像的对比度
- # iaa.contrast.LinearContrast(alpha=1.6, per_channel=True),
- # iaa.contrast.GammaContrast(gamma=1.6),
- # iaa.contrast.LogContrast(gain=1.6),
- iaa.contrast.SigmoidContrast(gain=10),
- ])
- # 仿射变换。包含:平移(Translation)、旋转(Rotation)、放缩(zoom)、错切(shear)。
- # 仿设变换通常会产生一些新的像素点,我们需要指定这些新的像素点的生成方法,这种指定通过设置cval和mode两个参数来实现。
- # 参数order用来设置插值方法
- # •scale: 图像缩放因子。1表示不缩放,0.5表示缩小到原来的50%
- # •translate_percent: 平移比例,0表示不平移,0.5表示平移50%。 用正负来表示平移方向
- # •translate_px: 按照像素来进行平移
- # •rotate: 旋转角度,0~360度之间,正负也可以表示方向
- # •shear: 错切的程度,0~360度之间,正负表示方向
- # •order: 插值顺序,与skimage中定义相同。下面0和1方法快,3比较慢,4、5特别慢
- # •0:最邻近插值。
- # •1: 双线性插值(默认)。
- # •2: 双二次插值(不推荐)。
- # •3:双三次插值。
- # •4: Bi-quartic。
- # •5:Bi-quintic。
- # •cval: 当平移后使用常量填充的时候指定填充的常量值,只有在mode=constant的时候才会生效
- # •mode: 采用何种方式填充经过变换后空白的像素点
- # •constant: 采用一个常量填充。
- # •edge: 边缘填充。
- # •symmetric: 镜面对称填充。
- # •reflect: Pads with the reflection of the vector mirrored on the first and last values of the vector along each axis.
- # •wrap: Pads with the wrap of the vector along the axis. The first values are used to pad the end and the end values are used to pad the beginning.
- seq12 = iaa.Sequential(children=[
- iaa.Affine(translate_px={'x': 100, 'y': 50}, shear=20),
- ])
- # iaa.PiecewiseAffine 随机放置一些规则的网格点然后移动这些点的周围的像素。这回导致局部的扭曲
- # iaa.ElasticTransformation 通过移动局部像素来变换
- seq13 = iaa.Sequential(children=[
- # iaa.PiecewiseAffine(scale=0.2),
- iaa.ElasticTransformation(alpha=10, sigma=10, order=3),
- ])
- batch_images = np.array([img, img, img])
- print(batch_images.shape)
- batch_images_auged = seq13.augment_images(batch_images)
- print('增强后的:', type(batch_images_auged), batch_images_auged.shape)
- ia.imshow(np.hstack([np.vstack(batch_images), np.vstack(batch_images_auged)]))
- # ia.imshow(np.vstack(batch_images_auged))
复制代码
|
|