图像处理|python-快速图像增强-imgaug库的运用

前言 以下示例显示了包含许多不同增强器的大型增强序列,从而导致增强图像发生重大变化。根据用例,这些增强可能过于强大,有可能导致图像的破坏,为了削弱的影响,可以降低的值来减少。如以下代码的概率

#Sometimes(0.5, ...) 以50%的概率下应用我们指定的图像增强, sometimes = lambda aug: iaa.Sometimes(0.3, aug)

代码 【图像处理|python-快速图像增强-imgaug库的运用】直接上代码,每一段都添加了注释。注意一点,不需要把所有的功能都运用到你的模型中去(过多的操作可能导致图片原始休息被破坏),通过注释的方式选择合理的处理操作。
# 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'].valuestrain_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])

图像处理|python-快速图像增强-imgaug库的运用
文章图片

接下来我们看看经过处理之后的图像:
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])

图像处理|python-快速图像增强-imgaug库的运用
文章图片

如上是使用所有操作后的图像。这里再次建议,合理选择需要的操作,不然不止你不认得处理出来是个啥玩意,你的模型也不会认得…

    推荐阅读