import cv2 import numpy as np import skimage as sk from PIL import Image, ImageOps from io import BytesIO from skimage import color ''' PIL resize (W,H) cv2 image is BGR PIL image is RGB ''' class Contrast: def __init__(self): pass def __call__(self, img, mag=-1, prob=1.): if np.random.uniform(0,1) > prob: return img #c = [0.4, .3, .2, .1, .05] c = [0.4, .3, .2] if mag<0 or mag>=len(c): index = np.random.randint(0, len(c)) else: index = mag c = c[index] img = np.array(img) / 255. means = np.mean(img, axis=(0, 1), keepdims=True) img = np.clip((img - means) * c + means, 0, 1) * 255 return Image.fromarray(img.astype(np.uint8)) class Brightness: def __init__(self): pass def __call__(self, img, mag=-1, prob=1.): if np.random.uniform(0,1) > prob: return img #W, H = img.size #c = [.1, .2, .3, .4, .5] c = [.1, .2, .3] if mag<0 or mag>=len(c): index = np.random.randint(0, len(c)) else: index = mag c = c[index] n_channels = len(img.getbands()) isgray = n_channels == 1 img = np.array(img) / 255. if isgray: img = np.expand_dims(img, axis=2) img = np.repeat(img, 3, axis=2) img = sk.color.rgb2hsv(img) img[:, :, 2] = np.clip(img[:, :, 2] + c, 0, 1) img = sk.color.hsv2rgb(img) #if isgray: # img = img[:,:,0] # img = np.squeeze(img) img = np.clip(img, 0, 1) * 255 img = Image.fromarray(img.astype(np.uint8)) if isgray: img = ImageOps.grayscale(img) return img #if isgray: #if isgray: # img = color.rgb2gray(img) #return Image.fromarray(img.astype(np.uint8)) class JpegCompression: def __init__(self): pass def __call__(self, img, mag=-1, prob=1.): if np.random.uniform(0,1) > prob: return img #c = [25, 18, 15, 10, 7] c = [25, 18, 15] if mag<0 or mag>=len(c): index = np.random.randint(0, len(c)) else: index = mag c = c[index] output = BytesIO() img.save(output, 'JPEG', quality=c) return Image.open(output) class Pixelate: def __init__(self): pass def __call__(self, img, mag=-1, prob=1.): if np.random.uniform(0,1) > prob: return img W, H = img.size #c = [0.6, 0.5, 0.4, 0.3, 0.25] c = [0.6, 0.5, 0.4] if mag<0 or mag>=len(c): index = np.random.randint(0, len(c)) else: index = mag c = c[index] img = img.resize((int(W* c), int(H * c)), Image.BOX) return img.resize((W, H), Image.BOX)