zoukankan      html  css  js  c++  java
  • Image Processing 必备(一): Imgaug之导入和增强图像

    Date: 2020-08-27

    官方教程:https://nbviewer.jupyter.org/github/aleju/imgaug-doc/blob/master/notebooks/A01%20-%20Load%20and%20Augment%20an%20Image.ipynb

    在机器视觉领域,想将深度学习应用于实际工程项目,并最终落地,会遇到很多问题:光照、遮挡等。而采集到的数据通常难以满足各种现实环境,需要进行数据增强操作。 imgaug是一个基于OpenCV的更高级的API,包含很多集成好的图像增强的方法。

    安装方式:

    1. conda config --add channels conda-forge

    2. conda install imgaug

    导入和增强图像

    输入的图像需要符合以下两种规格之一:

    1. 可以是4D的numpy数组,形状需要满足“NHWC”原则,即(N, height, width, channels)

    2. 也可以是一个由3D numpy数组组成的列表list,3D numpy数组的形状需要满足(height, width, channels) 对于灰度图像,其形状必须满足(height, width, 1)

    并且所有的图像必须是numpy数组的uint8格式,数值需要是在0-255之间。

    uint8是所有API测试最彻底的数据类型,其余的格式例如float32,需要查看imgaug API的文档是否支持。

    图像导入函数

    imgaug只是进行图像增强的库函数,其中并没有相关图像的读取和输出的函数。因此,需要使用其他的库进行图像的导入:

    1. imageio

    2. cv2.imread()

    另外,值得注意的是,cv2.imread()函数返回的图像颜色空间是BGR,而不是RGB,因此,需要手动改变其通道组成: cv2.imread(path)[:, :, ::-1]

    因此,提倡使用imageio进行图像的导入。

    导入并增强一张图片

    imagio.imread("/path/to/the/file.jpg")

    windows: imagio.imread("C:path o hefile.jpg") 返回的是一个uint8格式的numpy数组,形状为HWC--RGB空间。

    1 import imageio
    2 import imgaug as ia
    3 %matplotlib inline    
    4 5 image = imageio.imread("./pick1.jpg")   # Image格式
    6 7 print("Original")
    8 ia.imshow(image)
    Original

    png

    imgaug没有读图像的语句,但是有显示图像的语句。

     1 # 增强
     2 from imgaug import augmenters as iaa
     3  4 ia.seed(4)
     5  6 rotate = iaa.Affine(rotate=(-25, 25))  # 旋转
     7 image_aug = rotate(image=image)   # 处理后是numpy数组格式
     8  9 print("Augmented:")
    10 ia.imshow(image_aug)
    Augmented:

    png

    可以看出,图像发生了[-25, 25]之间角度的旋转。

    在使用imgaug中包含的数据增强功能时,需要先通过传参生成某种数据增强的实例,再通过实例对图像进行处理。

    • 尝试一下ia.seed(4),观察是否可以让旋转的角度相同。

    1 ia.seed(4)
    2 image_aug = rotate(image=image)
    3 4 print("Re-Augmented:")
    5 ia.imshow(image_aug)
    Re-Augmented:

    png

    仿佛每次的结果都是一样的。

    • 再试试更改一下数值。

    1 ia.seed(5)
    2 image_aug = rotate(image=image)
    3 4 print("Augmented:")
    5 ia.imshow(image_aug)
    Augmented:

    png

    结果发生了随机性的变化。

    增强一个batch数量的图像

    实际使用中,我们通常需要处理更多份的图像数据,而不是一张。此时,可以将图形数据按照NHWC的形式或者由列表组成的HWC的形式对批量的图像进行处理。

    如下述代码,将一份图像存储多次形成一个batch数量的图像。经过处理后,使用np.hstack()对处理后的图像进行显示。

    1 import numpy as np
    2 3 images = [image, image, image, image, image]
    4 images_aug = rotate(images=images)
    5 6 print("Augmented batch:")
    7 ia.imshow(np.hstack(images_aug))
    Augmented batch:

    png

    同时使用多种增强技术

    之前使用的方法仅仅在一张图像或者多张图像上使用了一种Affine的增强技术,在实际深度学习模型训练中,往往需要同时使用多种图像增强技术,从而让模型适应变化的外界条件。

    在使用多种图像增强技术时,可以使用imgaug中类似keras和Pytorch中Sequential方法,将多种增强技术拼接在一起。如下所示:

    1 seq = iaa.Sequential([iaa.Affine(rotate=(-25, 25)), 
    2                      iaa.AdditiveGaussianNoise(scale=(10, 60)),
    3                      iaa.Crop(percent=(0, 0.2))
    4                      ])
    5 6 images_aug = seq(images=images)
    7 8 print("Augmented:")
    9 ia.imshow(np.hstack(images_aug))
    Augmented:

    png

    Crop()默认会保持输入图像的尺寸,如果将keep_size=False,输入输出的尺寸将可能会发生变化。即该参数表示是否保持图像尺寸一致。

    下述代码在Sequential中设置了random_order=True,并使用单张图片重复8次得到的结果。该参数表示是否启用随机顺序增强。

    1 seq = iaa.Sequential([iaa.Affine(rotate=(-25, 25)),
    2                      iaa.AdditiveGaussianNoise(scale=(30, 90)),
    3                      iaa.Crop(percent=(0, 0.4))], random_order=True)
    4 5 images_aug = [seq(image=image) for _ in range(8)]
    6 7 print("Augmented:")
    8 ia.imshow(ia.draw_grid(images_aug, cols=4, rows=2))
    Augmented:

    png

    增强图像(不同尺寸)

    在收集训练集时,训练集的尺寸往往难以做到统一尺寸。之前的示例中也总是使用的相同尺寸的图像。下述代码介绍了不同尺寸图像的处理和展示。

    对于不同尺寸的图像,肯定不能使用numpy数组组成NHWC的形式,只能将不同尺寸的图像存储于列表中。

     1 seq = iaa.Sequential([
     2     iaa.CropAndPad(percent=(-0.2, 0.2), pad_mode="edge"),  # crop and pad images
     3     iaa.AddToHueAndSaturation((-60, 60)),  # change their color
     4     iaa.ElasticTransformation(alpha=90, sigma=9),  # water-like effect
     5     iaa.Cutout()  # replace one squared area within the image by a constant intensity value
     6 ], random_order=True)
     7  8 # load images with different sizes
     9 images_different_sizes = [
    10     imageio.imread("./pick1.jpg"),
    11     imageio.imread("./flower.jpg"),
    12     imageio.imread("./samoye.jpg")
    13 ]
    14 15 # augment them as one batch
    16 images_aug = seq(images=images_different_sizes)
    17 18 # visualize the results
    19 print("Image 0 (input shape: %s, output shape: %s)" % (images_different_sizes[0].shape, images_aug[0].shape))
    20 ia.imshow(np.hstack([images_different_sizes[0], images_aug[0]]))
    21 22 print("Image 1 (input shape: %s, output shape: %s)" % (images_different_sizes[1].shape, images_aug[1].shape))
    23 ia.imshow(np.hstack([images_different_sizes[1], images_aug[1]]))
    24 25 print("Image 2 (input shape: %s, output shape: %s)" % (images_different_sizes[2].shape, images_aug[2].shape))
    26 ia.imshow(np.hstack([images_different_sizes[2], images_aug[2]]))
    Image 0 (input shape: (313, 500, 3), output shape: (313, 500, 3))

    png

    Image 1 (input shape: (621, 500, 3), output shape: (621, 500, 3))

    png

    Image 2 (input shape: (406, 500, 3), output shape: (406, 500, 3))

    png

    整理总结

    本节教程主要包含以下几个方面的内容:

    1. 在利用imgaug图像增强的方法中,如何读取和显示图像; imageio.imread() imgaug.imshow() 不推荐使用opencv,因为其读入图像默认为BGR模式;

    2. 单/多张图像如何利用一/多种图像增强方法;

    3. 如何将不同尺寸的图像组合在一起进行图像增强。

    本节教程中包含的图像增强的方法:

    1. iaa.Affine(rotate=(-25, 25))

      • 实现仿射变换,本节仅利用了其中的旋转操作;

    2. iaa.AdditiveGaussianNoise(scale=(10, 60))

      • 添加高斯白噪声

    3. iaa.Crop(percent=(0, 0.2))

      • 实现裁剪,参数为裁剪比例

    4. iaa.CropAndPad(percent=(-0.2, 0.2), pad_mode="edge")

      • 实现裁剪和边缘补充

    5. iaa.AddToHueAndSaturation((-60, 60))

      • Hue空间调整饱和度

    6. iaa.ElasticTransformation(alpha=90, sigma=9)

      • 随机弹性变换(仿射变换的一种)

    7. iaa.Cutout()

      • 图像增强之 cutout 生成遮挡块


    * CropAndPad使用效果:*

     1 import imageio
     2 import imgaug as ia
     3 from imgaug import augmenters as iaa
     4 import numpy as np
     5 %matplotlib inline    
     6  7 image = imageio.imread("./pick1.jpg")
     8  9 crop = iaa.CropAndPad(percent=(-0.2, 0.2), pad_mode="edge")
    10 img_aug = crop(image=image)
    11 12 print("Original")
    13 ia.imshow(np.hstack([image, img_aug]))
    14 #ia.imshow(image) 
    15 #ia.imshow(img_aug)
    Original

    png


    * AddToHueAndSaturation使用效果 *

     1 import imageio
     2 import imgaug as ia
     3 from imgaug import augmenters as iaa
     4 %matplotlib inline    
     5  6 image = imageio.imread("./pick1.jpg")
     7  8 hue = iaa.AddToHueAndSaturation((-60, 60))
     9 img_aug = hue(image=image)
    10 11 print("Original")
    12 ia.imshow(np.hstack([image, img_aug]))
    13 #ia.imshow(image) 
    14 #ia.imshow(img_aug)
    Original

    png


    * ElasticTransformation使用效果 *

     1 import imageio
     2 import imgaug as ia
     3 from imgaug import augmenters as iaa
     4 %matplotlib inline    
     5  6 image = imageio.imread("./pick1.jpg")
     7  8 trans = iaa.ElasticTransformation(alpha=90, sigma=9)
     9 img_aug = trans(image=image)
    10 11 print("Original")
    12 ia.imshow(np.hstack([image, img_aug]))
    13 #ia.imshow(image) 
    14 #ia.imshow(img_aug)
    Original

    png

     

  • 相关阅读:
    视频分解图片,图片合成视频
    获取图片中指定区域图片
    CALayer alpha mask not working
    多媒体编程ios摄像头图像抓取工具类
    10月17日
    10月16日
    10月15日
    10月14日
    10月13日
    10月12日
  • 原文地址:https://www.cnblogs.com/monologuesmw/p/13686442.html
Copyright © 2011-2022 走看看