import os from pathlib import Path import cv2 from PIL import Image from torchvision import transforms class NormalizeImage(object): """Normalize given tensor into given mean and standard dev Args: mean (float): Desired mean to substract from tensors std (float): Desired std to divide from tensors """ def __init__(self, mean, std): assert isinstance(mean, (float)) if isinstance(mean, float): self.mean = mean if isinstance(std, float): self.std = std self.normalize_1 = transforms.Normalize(self.mean, self.std) self.normalize_3 = transforms.Normalize([self.mean] * 3, [self.std] * 3) self.normalize_18 = transforms.Normalize([self.mean] * 18, [self.std] * 18) def __call__(self, image_tensor): if image_tensor.shape[0] == 1: return self.normalize_1(image_tensor) elif image_tensor.shape[0] == 3: return self.normalize_3(image_tensor) elif image_tensor.shape[0] == 18: return self.normalize_18(image_tensor) else: assert "Please set proper channels! Normalization implemented only for 1, 3 and 18" def naive_cutout(img, mask): empty = Image.new("RGBA", (img.size), 0) cutout = Image.composite(img, empty, mask.resize(img.size, Image.LANCZOS)) return cutout def resize_by_bigger_index(crop): # function resizes and keeps the aspect ratio same crop_shape = crop.shape # hxwxc if crop_shape[0] / crop_shape[1] <= 1.33: resized_crop = image_resize(crop, width=768) else: resized_crop = image_resize(crop, height=1024) return resized_crop def image_resize(image, width=None, height=None): dim = None (h, w) = image.shape[:2] if width is None and height is None: return image if width is None: r = height / float(h) dim = (int(w * r), height) else: r = width / float(w) dim = (width, int(h * r)) resized = cv2.resize(image, dim) return resized def convert_to_jpg(image_path, output_dir, size=None): """ Convert image to jpg format :param image_path: image path :param output_dir: output directory :param size: desired size of the image (w, h) """ img = cv2.imread(image_path) if size is not None: img = image_resize(img, width=size[0], height=size[1]) filename = Path(image_path).name cv2.imwrite(os.path.join(output_dir, filename.split(".")[0] + ".jpg"), img)