图像数据增强方法综述及其python实现
图像数据增强广泛用于深度学习的训练,对模型的性能提升有很大的帮助;
这里列出了图像数据增强的几种方式,包括随机裁剪、翻转、直方图均衡化、gamma变换、滤波和随机噪声及其python实现。
1. 随机裁剪
1.1 random_crop
对图片随机0.6~1.0比率大小的区域裁剪,保持长宽比不变
1.1.1 代码
import random
import numpy as np
def random_crop(image, min_ratio=0.6, max_ratio=1.0):
h, w = image.shape[:2]
ratio = random.random()
scale = min_ratio + ratio * (max_ratio - min_ratio)
new_h = int(h*scale)
new_w = int(w*scale)
y = np.random.randint(0, h - new_h)
x = np.random.randint(0, w - new_w)
image = image[y:y+new_h, x:x+new_w, :]
return image
1.1.2 效果
处理前:
处理后:
1.2 random_resize_and_crop
将一张图片裁剪出随机大小的224×224大小的正方形区域
1.2.1 代码
import random
import numpy as np
import cv2
def random_crop_and_resize(image, size=224):
image = resize_image(image)
h, w = image.shape[:2]
y = np.random.randint(0, h-size)
x = np.random.randint(0, w-size)
image = image[y:y+size, x:x+size, :]
return image
def resize_image(image, size=224, bias=5):
image_shape = image.shape
size_min = np.min(image_shape[:2])
size_max = np.max(image_shape[:2])
min_size = size + np.random.randint(1, bias)
scale = float(min_size) / float(size_min)
image = cv2.resize(image, dsize=(0, 0), fx=scale, fy=scale)
return image
1.2.2 效果
处理前:
处理后:
1.3 random_crop_corner
裁剪出图片四角上和中间的共5个正方形
1.3.1 代码
import random
import numpy as np
import cv2
def random_crop_corner(image, size=224):
image = resize_image(image)
images = []
h, w = image.shape[:2]
Ys = (0, 0, h-size, h-size, int((h-size)/2))
Xs = (0, w-size, 0, w-size, int((h-size)/2))
for y, x in zip(Ys, Xs):
value = image[y:y+size, x:x+size, :]
images.append(value)
return images
def resize_image(image, size=224, bias=10):
image_shape = image.shape
size_min = np.min(image_shape[:2])
size_max = np.max(image_shape[:2])
min_size = size + bias
scale = float(min_size) / float(size_min)
image = cv2.resize(image, dsize=(0, 0), fx=scale, fy=scale)
return image
1.3.2 效果
处理前
处理后:
2. 随机翻转-random_flip
2.1 代码
import random
import numpy as np
def random_flip(image):
if random.randint(0, 1):
axis = random.randint(0, 2)
return np.flip(image, axis=axis)
return image
2. 2 效果
处理前
处理后
(注意最后一张是对RGB三通道翻转)
3. 直方图均衡化
3.1 概念
这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。
通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
3.2 代码
import numpy as np
def equalize(image):
image = cv2.equalizeHist(image)
return image.astype(np.int)
3.3 效果
处理前(灰度图)
处理后
4. gamma变换
4.1 概念
Gamma变换就是用来图像增强,通过非线性变换提升了暗部细节。
4.2 代码
import numpy as np
def gamma_transform(image, gamma=1.6):
max_value = np.max(image)
min_value = np.min(image)
value_l = max_value - min_value
image = (image - min_value)/value_l
image = np.power(image, gamma)
image = image * 255
return image.astype(np.int)
4.3 效果
处理前
处理后
5. 滤波
5.1 高斯滤波
5.1.1 概念
高斯滤波器是根据高斯函数的形状来选择权值的线性平滑滤波器,滤波器符合二维高斯分布;
5.1.2 代码
import numpy as np
import cv2
def gaussian(image, k_size=5):
image = cv2.GaussianBlur(image, (k_size, k_size), 3)
return image
5.1.3 效果
处理前
处理后
5.2 中值滤波
5.2.1 概念
中值滤波是一种基于排序统计理论的非线性平滑计数,能有效平滑噪声,且能有效保护图像的边缘信息,其基本原理是把数字图像或数字序列中的一点的值用该点邻域内所有的点排序后的中值来代替。
5.2.2 代码
import numpy as np
import cv2
def Mean(image, k_size=5):
image = cv2.medianBlur(image, k_size)
return image
5.2.3 效果
处理前
处理后
6. 随机噪声
6.1 代码
import numpy as np
import cv2
def add_noise(image, threshold=32):
noise = np.random.uniform(low=-1, high=1, size=image.shape)
image = image + noise * threshold
image = np.clip(image, 0, 255)
return image.astype(np.int)
6.2 效果
处理前
处理后