第3 章预处理图像数据

3.1 数据增强简介

提高模型泛化能力的最重要的三大因素是数据、模型、损失函数,其中数据又是三个因素中最重要的因素,但数据的获取往往不充分或成本比较高。是否有其他方法可以快速又便捷地增加数据量呢?在一些领域是存在的,如在图像识别、语言识别领域,可以通过水平或垂直翻转图像、裁剪、色彩变换、扩展和旋转等数据增强(Data Augmentation)技术来增加数据量。
通过数据增强技术不仅可以扩大训练数据集的规模、降低模型对某些属性的依赖,从而提高模型的泛化能力,也可以对图像进行不同方式的裁剪,使感兴趣的物体出现在不同位置,从而减轻模型对物体出现位置的依赖性,还可以通过调整亮度、色彩等因素来降低模型对色彩的敏感度等。当然,对图像做这些预处理时,不宜使用会改变其类别的转换,如对于手写的数字,如果旋转90度,就有可能把9变成6,或把6变为9。
此外,把随机噪声添加到输入数据或隐藏单元中也是增加数据量的方法之一。

3.2 使用OpenCV实现图像增强

3.2.1导入需要的库

3.2.2导入图像数据

运行结果

3.2.3增加高斯噪声

读取处理后的图像

运行结果

3.2.4图像缩小为0.5倍

运行结果

3.2.5图像水平翻转

读取处理后的图像

运行结果

3.2.6图像垂直翻转

读取处理后的图像

运行结果

3.2.6增强图像亮度

读取处理后的图像

运行结果

3.2.7混合增强

读取处理后的图像

运行结果

3.3 图像去雾

图像去雾的研究算法有很多,但是主要分为两类:基于图像增强的去雾算法和基于图像复原的去雾算法。 基于图像增强的去雾算法:基于图像增强的去雾算法出发点是尽量去除图像噪声,提高图像对比度,从而恢复出无雾清晰图像。代表性方法有:直方图均衡化(HLE)、自适应直方图均衡化(AHE)、限制对比度自适应直方图均衡化(CLAHE)、Retinex算法、小波变换、同态滤波等 基于图像复原的去雾算法:这一系列方法基本是基于大气退化模型,进行响应的去雾处理。代表性算法有来自何凯明博士的暗通道去雾算法、基于导向滤波的暗通道去雾算法、Fattal的单幅图像去雾算法(Single image dehazing)、Tan的单一图像去雾算法(Visibility in bad weather from a single image)、Tarel的快速图像恢复算法(Fast visibility restoration from a single color or gray level image)、贝叶斯去雾算法(Single image defogging by multiscale depth fusion),基于大气退化模型的去雾效果普遍好于基于图像增强的去雾算法,后面挑选的传统去雾算法例子也大多是基于图像复原的去雾算法。
这里主要介绍的基于图像增强的图像去雾,在此使用直方图均衡化和局部直方图均衡化进行图像的去雾处理。

3.3.1 显示原图

3.3.2全局直方图均衡化

运行结果

3.3.3 局部直方图均衡化

运行结果

3.3.4 比较直方图

运行结果

最明显的变化就是某一些像素点数比较少的亮度级别消失了,而且图像直方图的变化也没有那么突兀了,图像也就更加清晰了。

3.4 使用PyTorch实现图像增强

使用pytorch中的torchvision模块实现数据增强。

3.4.1 按比例缩放

随机比例缩放主要使用的是 torchvision.transforms.Resize()函数。
1)显示原图。

运行结果如图3-1所示。

图3-1 小猫原图
2)随机比例缩放。

运行结果如图3-2所示。
原图像大小: (500, 414)
缩放后大小: (200, 100)

图3-2 缩放后的图像

3.4.2 裁剪

随机裁剪有两种方式,一种是对图像在随机位置进行截取,可传入裁剪大小,使用的函数为torchvision.transforms.RandomCrop();另一种是在中心,按比例裁剪,函数为 torchvision.transforms.CenterCrop()。

运行结果如图3-3所示。

图3-3 剪辑后的图像

3.4.3 翻转

翻转猫还是猫,不会改变其类别。通过翻转图像可以增加其多样性,所以随机翻转也是一种非常有效的手段。在 torchvision 中,随机翻转使用的是 torchvision.transforms.RandomHorizontalFlip() 、torchvision.transforms.RandomVerticalFlip()和 torchvision.transforms.RandomRotation()等函数。

运行结果如图3-4所示。

图3-4 翻转后的图像

3.4.4改变颜色

除了形状变化外,颜色变化又是另外一种增强方式,其中可以设置亮度变化,对比度变化和颜色变化等,在 torchvision 中主要是用 torchvision.transforms.ColorJitter() 来实现的。

运行结果如图3-5所示。

图3-5 改变颜色后的图像

3.4.5组合多种增强方法

我们可用torchvision.transforms.Compose() 函数把以上这些变化组合在一起。

运行结果如图3-6所示。

图3-6实现图像增强后的部分图像