Source code for secml.data.loader.loader_utils

"""
.. module:: LoaderUtils
   :synopsis: Collection of mixed utilities for Data Loaders

.. moduleauthor:: Marco Melis <marco.melis@unica.it>
.. moduleauthor:: Angelo Sotgiu

"""
from PIL import Image

__all__ = ['resize_img', 'crop_img']


[docs]def resize_img(img, shape): """Resize input image to desired shape. If the input image is bigger than desired, the LANCZOS filter will be used. If calculates the output pixel value using a truncated sinc filter on all pixels that may contribute to the output value. Otherwise, a LINEAR filter will be used. It calculates the output pixel value using linear interpolation on all pixels that may contribute to the output value. Parameters ---------- img : PIL.Image.Image Image to be resized. shape : tuple Desired output image dimensions (height, width). Returns ------- PIL.Image Resized image. """ w, h = img.size if w != shape[1] or h != shape[0]: # Resize only if necessary if w > shape[1] or h > shape[0]: # LANCZOS is a slow filter, # but has the best performance for downscaling interpolation = Image.LANCZOS else: # LINEAR is faster and ok for upscaling interpolation = Image.LINEAR # Reverse the tuple as Pillow convention is (width, height) img = img.resize(shape[::-1], interpolation) return img
[docs]def crop_img(img, crop): """Extract a center crop of the input image. Parameters ---------- img : PIL.Image.Image Image to be cropped. crop : tuple Dimensions of the desired crop (height, width). Returns ------- PIL.Image Cropped image. Notes ----- The image center will be computed by rounding the coordinates if necessary. Python round default behavior is toward the closest even decimal. """ w, h = img.size if crop[1] >= w or crop[0] >= h: raise ValueError( "crop dimensions cannot be higher than {:}".format(img.size)) x1 = int(round((w - crop[1]) / 2.)) y1 = int(round((h - crop[0]) / 2.)) return img.crop((x1, y1, x1 + crop[1], y1 + crop[0]))