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

前言

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

#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])

python-快速图像增强-imgaug库的运用_第1张图片
接下来我们看看经过处理之后的图像:

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])

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

你可能感兴趣的:(图像处理,机器学习)