|
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): |
|
|
|
crop_shape = crop.shape |
|
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) |
|
|