图像数据增强-亮度lighting-blend-饱和度saturation-对比度contrast-光照brightness
前言:
因为真实数据图片太少,图片对光照影响太敏感,所以想着对数据做个增强。
我竟然没整理一套自己的数据增强函数,在师弟的帮助下,借助这个代码库的基础上,拆分了图像增强部分。
没有考虑坐标的问题,因为不涉及图像旋转,反转和裁剪。
直接上代码吧~
代码:
from PIL import Image
import random
import numpy as np
import cv2
def lighting_(data_rng, image, alphastd, eigval, eigvec):
alpha = data_rng.normal(scale=alphastd, size=(3, ))
image += np.dot(eigvec, eigval * alpha)
def blend_(alpha, image1, image2):
image1 *= alpha
image2 *= (1 - alpha)
image1 += image2
def saturation_(data_rng, image, gs, gs_mean, var):
alpha = 1. + data_rng.uniform(low=-var, high=var)
blend_(alpha, image, gs[:, :, None])
def brightness_(data_rng, image, gs, gs_mean, var):
alpha = 1. + data_rng.uniform(low=-var, high=var)
image *= alpha
def contrast_(data_rng, image, gs, gs_mean, var):
alpha = 1. + data_rng.uniform(low=-var, high=var)
blend_(alpha, image, gs_mean)
def grayscale(image):
return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
def color_aug(image,
data_rng=np.random.RandomState(),
eig_val=np.random.random(),
eig_vec=np.random.random()):
""" image color augmentation parameters: data_rng: np.random.RandomState() image: image.astype('float32')/255.0 eig_val: 0 - 1 (float) eig_vec: 0 - 1 (float) return: a image array 0-1.0(floatt) """
if np.any(image > 1.0):
image = image.astype("float32")/255.0
functions = [brightness_, contrast_, saturation_]
random.shuffle(functions)
gs = grayscale(image)
gs_mean = gs.mean()
for f in functions:
f(data_rng, image, gs, gs_mean, 0.4) lighting_(data_rng, image, 0.1, eig_val, eig_vec)
return image
def main():
image = np.random.random((224, 224, 3)) * 255
print(image.shape)
print(image)
image = color_aug(image)
cv2.imshow('image', image)
cv2.waitKey(0)
if __name__ == "__main__": main()