东方耀AI技术分享
标题:
034、imgaug图像数据增强之Augmenters常用函数
[打印本页]
作者:
东方耀
时间:
2020-1-13 16:30
标题:
034、imgaug图像数据增强之Augmenters常用函数
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))
复制代码
作者:
xsoft
时间:
2020-2-3 15:21
谢谢老师答疑解惑
欢迎光临 东方耀AI技术分享 (http://www.ai111.vip/)
Powered by Discuz! X3.4