from PIL import Image, ImageEnhance, ImageOps import random class ShearX(object): def __init__(self, fillcolor=(128, 128, 128)): self.fillcolor = fillcolor def __call__(self, x, magnitude): return x.transform( x.size, Image.AFFINE, (1, magnitude * random.choice([-1, 1]), 0, 0, 1, 0), Image.BICUBIC, fillcolor=self.fillcolor) class ShearY(object): def __init__(self, fillcolor=(128, 128, 128)): self.fillcolor = fillcolor def __call__(self, x, magnitude): return x.transform( x.size, Image.AFFINE, (1, 0, 0, magnitude * random.choice([-1, 1]), 1, 0), Image.BICUBIC, fillcolor=self.fillcolor) class TranslateX(object): def __init__(self, fillcolor=(128, 128, 128)): self.fillcolor = fillcolor def __call__(self, x, magnitude): return x.transform( x.size, Image.AFFINE, (1, 0, magnitude * x.size[0] * random.choice([-1, 1]), 0, 1, 0), fillcolor=self.fillcolor) class TranslateY(object): def __init__(self, fillcolor=(128, 128, 128)): self.fillcolor = fillcolor def __call__(self, x, magnitude): return x.transform( x.size, Image.AFFINE, (1, 0, 0, 0, 1, magnitude * x.size[1] * random.choice([-1, 1])), fillcolor=self.fillcolor) class Rotate(object): # from https://stackoverflow.com/questions/ # 5252170/specify-image-filling-color-when-rotating-in-python-with-pil-and-setting-expand def __call__(self, x, magnitude): rot = x.convert("RGBA").rotate(magnitude * random.choice([-1, 1])) return Image.composite(rot, Image.new("RGBA", rot.size, (128,) * 4), rot).convert(x.mode) class Color(object): def __call__(self, x, magnitude): return ImageEnhance.Color(x).enhance(1 + magnitude * random.choice([-1, 1])) class Posterize(object): def __call__(self, x, magnitude): return ImageOps.posterize(x, magnitude) class Solarize(object): def __call__(self, x, magnitude): return ImageOps.solarize(x, magnitude) class Contrast(object): def __call__(self, x, magnitude): return ImageEnhance.Contrast(x).enhance(1 + magnitude * random.choice([-1, 1])) class Sharpness(object): def __call__(self, x, magnitude): return ImageEnhance.Sharpness(x).enhance(1 + magnitude * random.choice([-1, 1])) class Brightness(object): def __call__(self, x, magnitude): return ImageEnhance.Brightness(x).enhance(1 + magnitude * random.choice([-1, 1])) class AutoContrast(object): def __call__(self, x, magnitude): return ImageOps.autocontrast(x) class Equalize(object): def __call__(self, x, magnitude): return ImageOps.equalize(x) class Invert(object): def __call__(self, x, magnitude): return ImageOps.invert(x)