def modify_contrast(img, factor, optimize=False): if optimize: img_mod = ImageOps.autocontrast(numpy_to_pil(img)) else: modifier = ImageEnhance.Contrast(numpy_to_pil(img)) img_mod = modifier.enhance(factor) return pil_to_numpy(img_mod)
def pixelate(img, **kwargs): img_mod = numpy_to_pil(img) img_size = img_mod.size # boost saturation of image sat_booster = ImageEnhance.Color(img_mod) img_mod = sat_booster.enhance(float(kwargs.get("saturation", 1.25))) # increase contrast of image contr_booster = ImageEnhance.Contrast(img_mod) img_mod = contr_booster.enhance(float(kwargs.get("contrast", 1.2))) # reduce the number of colors used in picture img_mod = img_mod.convert('P', palette=Image.ADAPTIVE, colors=int(kwargs.get("n_colors", 10))) # reduce image size superpixel_size = int(kwargs.get("superpixel_size", 10)) reduced_size = (img_size[0] // superpixel_size, img_size[1] // superpixel_size) img_mod = img_mod.resize(reduced_size, Image.BICUBIC) # resize to original shape to give pixelated look img_mod = img_mod.resize(img_size, Image.BICUBIC) img_mod = img_mod.convert('RGB') img_mod = pil_to_numpy(img_mod) return img_mod
def draw_rectangle_from_blcorner_angle(img, xy, length, theta, color, degree_fmt=True, debug=False): img_mod = numpy_to_pil(img) if degree_fmt: theta = deg_to_rad(theta) opp_xy = (xy[0] + length * math.cos(theta), xy[1] + length * math.sin(theta)) if debug: print('Opposite point coords : {}'.format(opp_xy)) coords = [invert_iterable(xy), invert_iterable(opp_xy)] draw = ImageDraw.Draw(img_mod) draw.rectangle(coords, fill=tuple(color)) return pil_to_numpy(img_mod)
def load_rgb(imgfile, show_info=False): check_imgfile_arg(imgfile) img = pil_to_numpy(Image.open(imgfile)) if img.ndim == 2: raise ValueError('Numpy array has two dimensions only.') elif img.ndim == 3: if show_info: display_info(imgfile, img=img) if img.shape[2] == 3: return img elif img.shape[2] == 4: # if RGBA, we check that the transparency mask does # not filter anything mask = 255 * np.ones_like(img[..., 0]) if np.allclose(img[..., -1], mask): return img[..., :3] else: raise ValueError('Detected transparency layer.') else: raise ValueError('Numpy array has more than 3 dimensions.')
def modify_vividness(img, factor): modifier = ImageEnhance.Color(numpy_to_pil(img)) img_mod = modifier.enhance(factor) return pil_to_numpy(img_mod)
def blur(img, radius=2.): f = ImageFilter.GaussianBlur(radius) img_mod = numpy_to_pil(img).filter(f) return pil_to_numpy(img_mod)
def to_negative(img): img_mod = ImageOps.invert(numpy_to_pil(img)) return pil_to_numpy(img_mod)
def to_grayscale(img): img_mod = ImageOps.grayscale(numpy_to_pil(img)) return pil_to_numpy(img_mod, from_grayscale=True)
def modify_brightness(img, factor): modifier = ImageEnhance.Brightness(numpy_to_pil(img)) img_mod = modifier.enhance(factor) return pil_to_numpy(img_mod)
def draw_general_rectangle(img, coords, color): img_mod = numpy_to_pil(img) draw = ImageDraw.Draw(img_mod) draw.polygon(coords, fill=tuple(color)) return pil_to_numpy(img_mod)