这里列出了图像数据增强的几种方式,包括随机裁剪、翻转、直方图均衡化、gamma变换、滤波和随机噪声及其python实现。
对图片随机0.6~1.0比率大小的区域裁剪,保持长宽比不变
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
将一张图片裁剪出随机大小的224×224大小的正方形区域
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
裁剪出图片四角上和中间的共5个正方形
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
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
这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。
通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
import numpy as np
def equalize(image):
image = cv2.equalizeHist(image)
return image.astype(np.int)
Gamma变换就是用来图像增强,通过非线性变换提升了暗部细节。
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)
高斯滤波器是根据高斯函数的形状来选择权值的线性平滑滤波器,滤波器符合二维高斯分布;
import numpy as np
import cv2
def gaussian(image, k_size=5):
image = cv2.GaussianBlur(image, (k_size, k_size), 3)
return image
中值滤波是一种基于排序统计理论的非线性平滑计数,能有效平滑噪声,且能有效保护图像的边缘信息,其基本原理是把数字图像或数字序列中的一点的值用该点邻域内所有的点排序后的中值来代替。
import numpy as np
import cv2
def Mean(image, k_size=5):
image = cv2.medianBlur(image, k_size)
return image
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)