以下示例显示了包含许多不同增强器的大型增强序列,从而导致增强图像发生重大变化。根据用例,这些增强可能过于强大,有可能导致图像的破坏,为了削弱的影响,可以降低的值来减少。如以下代码的概率
#Sometimes(0.5, ...) 以50%的概率下应用我们指定的图像增强,
sometimes = lambda aug: iaa.Sometimes(0.3, aug)
直接上代码,每一段都添加了注释。注意一点,不需要把所有的功能都运用到你的模型中去(过多的操作可能导致图片原始休息被破坏),通过注释的方式选择合理的处理操作。
# Sometimes(0.5, ...) 以50%的概率下应用我们指定的图像增强,
sometimes = lambda aug: iaa.Sometimes(0.3, aug)
# 定义将应用于每个图像的增强步骤序列。
seq = iaa.Sequential(
[
#
#1, 将以下增强器应用于大多数图像.
#
iaa.Fliplr(0.5), # 水平翻转所有图像的50%
iaa.Flipud(0.2), # 垂直翻转所有图像的20%
#2,将一些图像裁剪为其高度/宽度的0-10%
sometimes(iaa.Crop(percent=(0, 0.1))),
# 对某些图像应用仿射变换
# - 缩放到图像高度/宽度的80-120%(每个轴独立)
# - 相对于高度/宽度(每轴)从-20转换为+20
# - 旋转-45到+45度
# - 剪切-16到+16度
# - order:使用最近邻居或双线性插值(快速)
# - mode:使用任何可用模式填充新创建的像素
# 查看可用模式的API或scikit-image
# - cval:如果模式是常量,则使用随机亮度
# 为新创建的像素(例如,有时是黑色,
# 有时是白色的)
#3
sometimes(iaa.Affine(
scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},
translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)},
rotate=(-45, 45),
shear=(-16, 16),
order=[0, 1],
cval=(0, 255),
mode=ia.ALL
)),
# 4,每个执行0到5个以下(不太重要)的增强器图片。 不要执行所有这些,因为这往往太强大了,会导致图片信息破坏。
iaa.SomeOf((0, 5),
[
#4-1,将一些图像转换为超像素表示,每个图像采样20到200个超像素,但不要用平均值替换所有超像素,只用其中一些(p_replace)。
sometimes(
iaa.Superpixels(
p_replace=(0, 1.0),
n_segments=(20, 200)
)
),
#4-2,用不同的强度模糊每个图像
#curssian blur(sigma在0到3.0之间),
#average / uniform blur(内核大小介于2x2和7x7之间)
#incentral blur(内核大小介于3x3和11x11之间)。
iaa.OneOf([
iaa.GaussianBlur((0, 3.0)),
iaa.AverageBlur(k=(2, 7)),
iaa.MedianBlur(k=(3, 11)),
]),
,4-3锐化每个图像,使用0(无锐化)和1(完全锐化效果)之间的alpha将结果与原始图像叠加。
iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)),
# 4-4与锐化相同,但具有压花效果。
iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)),
#4-5 在一些图像中搜索所有边缘或有向边缘。 然后将这些边缘标记为黑白图像,并使用0到0.7的alpha覆盖原始图像。
sometimes(iaa.OneOf([
iaa.EdgeDetect(alpha=(0, 0.7)),
iaa.DirectedEdgeDetect(
alpha=(0, 0.7), direction=(0.0, 1.0)
),
])),
# 4-6,为某些图像添加高斯噪声。 在50%概率下,每个通道和像素随机采样噪声。在所有情况的另外50%中,每个像素采样一次(即亮度改变)。
iaa.AdditiveGaussianNoise(
loc=0, scale=(0.0, 0.05*255), per_channel=0.5
),
#4-7,随机丢弃所有像素的1到10%(即将它们设置为黑色)或将它们放在原始大小的2-5%的图像上。
iaa.OneOf([
iaa.Dropout((0.01, 0.1), per_channel=0.5),
iaa.CoarseDropout(
(0.03, 0.15), size_percent=(0.02, 0.05),
per_channel=0.2
),
]),
#4-8,以5%的概率反转每个图像的通道。
iaa.Invert(0.05, per_channel=True),
# 4-9,为每个像素添加-10到10的值。
iaa.Add((-10, 10), per_channel=0.5),
#4-10, 更改图像的亮度(原始值的50-150%)。
iaa.Multiply((0.5, 1.5), per_channel=0.5),
# 4-11,提高或降低图像的对比度。
iaa.ContrastNormalization((0.5, 2.0), per_channel=0.5),
#4-12,将每个图像转换为灰度,然后使用随机alpha覆盖原始图像。即 去除不同强度的颜色。
iaa.Grayscale(alpha=(0.0, 1.0)),
# 4-13, 在一些图像中局部移动像素(具有随机强度)。
sometimes(
iaa.ElasticTransformation(alpha=(0.5, 3.5), sigma=0.25)
),
#4-14 ,在一些图像中,扭曲局部区域的强度。
sometimes(iaa.PiecewiseAffine(scale=(0.01, 0.05)))
],
# 以随机顺序执行上述所有增强操作
random_order=True
)
],
#以随机顺序执行上述所有增强操作
random_order=True
)
这里用到的是kaggle比赛的数据,如下:
import numpy as np
import imgaug as ia
import imgaug.augmenters as iaa
ia.seed(1)
#读取图片
train_file=pd.read_csv("train.csv")['id_code'].values
train_label=pd.read_csv("train.csv")['diagnosis'].values
train_file1=[]
for file in tqdm(train_file):
dirs_="train_images/"+file+".png"
train_file1.append(dirs_)
train_img=[]
for name in tqdm(train_file1[0:12]):
img =cv2.resize(cv2.imread(name),(224,224))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#img = crop_image_from_gray(img)
train_img.append(img)
del img
train_img=np.array(train_img,dtype="uint8")
#显示原始图像
fig, ax = plt.subplots(nrows=1, ncols=11, figsize=(20,12))
for i in range(11):
ax[i].imshow(train_img[i])
images_aug = seq(images=train_img) #把原始数据进行处理
fig, ax = plt.subplots(nrows=1, ncols=11, figsize=(20,12)) #显示图像
for i in range(11):
ax[i].imshow(images_aug[i])