import cv2 import numpy as np import random def random_brightness_np(image, max_abs_change=50): delta = random.uniform(-max_abs_change, max_abs_change) return np.clip(image + delta, 0, 255) def random_contrast_np(image, strength_range=[0.3, 1.5]): delta = random.uniform(*strength_range) mean = image.mean() return np.clip((image - mean) * delta + mean, 0, 255) def motion_blur_np(img, max_kernel_size=3): # Either vertial, hozirontal or diagonal blur mode = np.random.choice(["h", "v", "diag_down", "diag_up"]) ksize = np.random.randint(0, (max_kernel_size + 1) / 2) * 2 + 1 # make sure is odd center = int((ksize - 1) / 2) kernel = np.zeros((ksize, ksize)) if mode == "h": kernel[center, :] = 1.0 elif mode == "v": kernel[:, center] = 1.0 elif mode == "diag_down": kernel = np.eye(ksize) elif mode == "diag_up": kernel = np.flip(np.eye(ksize), 0) var = ksize * ksize / 16.0 grid = np.repeat(np.arange(ksize)[:, np.newaxis], ksize, axis=-1) gaussian = np.exp( -(np.square(grid - center) + np.square(grid.T - center)) / (2.0 * var) ) kernel *= gaussian kernel /= np.sum(kernel) img = cv2.filter2D(img, -1, kernel) return np.clip(img, 0, 255) def additive_gaussian_noise(image, stddev_range=[5, 95]): stddev = random.uniform(*stddev_range) noise = np.random.normal(size=image.shape, scale=stddev) noisy_image = np.clip(image + noise, 0, 255) return noisy_image def photaug(img): img = random_brightness_np(img) img = random_contrast_np(img) # img = additive_gaussian_noise(img) img = motion_blur_np(img) return img