Source code for jacinle.image.backend

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# File   : backend.py
# Author : Jiayuan Mao
# Email  : maojiayuan@gmail.com
# Date   : 01/19/2018
#
# This file is part of Jacinle.
# Distributed under terms of the MIT license.

import time
import functools
import numpy as np
from jacinle.logging import get_logger

logger = get_logger(__file__)

try:
    import cv2
except ImportError:
    cv2 = None

try:
    from PIL import Image
except ImportError:
    Image = None

if cv2 is None:
    if Image is not None:
        logger.warning('Fail to import OpenCV; use PIL library.')
    else:
        logger.error('Can not find either PIL OpenCV; you can not use most function in tartist.image.')


FORCE_PIL_BGR = True


[docs] def opencv_or_pil(func): @functools.wraps(func) def new_func(*args, **kwargs): if cv2 is None and Image is None: assert False, 'Call {} without OpenCV or PIL.'.format(func) return func(*args, **kwargs) return new_func
[docs] def opencv_only(func): @functools.wraps(func) def new_func(*args, **kwargs): if cv2 is None: assert False, 'Call {} without OpenCV.'.format(func) return func(*args, **kwargs) return new_func
[docs] def pil_only(func): @functools.wraps(func) def new_func(*args, **kwargs): if Image is None: assert False, 'Call {} without PIL.'.format(func) return func(*args, **kwargs) return new_func
[docs] def pil_img2nd(image, require_chl3=True): nd = np.array(image) if FORCE_PIL_BGR: nd = nd[:, :, ::-1] if require_chl3 and len(nd.shape) == 2: return nd[:, :, np.newaxis] return nd
[docs] def pil_nd2img(image): if FORCE_PIL_BGR: image = image[:, :, ::-1] if len(image.shape) == 3 and image.shape[2] == 1: image = image[:, :, 0] return Image.fromarray(image)
[docs] @opencv_or_pil def imread(path): if cv2: return cv2.imread(path) else: image = Image.open(path) return pil_img2nd(image)
[docs] @opencv_or_pil def imwrite(path, image): if cv2: return cv2.imwrite(path, image) else: image = pil_nd2img(image) return image.save(path)
[docs] @opencv_or_pil def imshow(title, image): if cv2: cv2.imshow(title, image) cv2.waitKey(0) else: image = pil_nd2img(image) image.show(title) time.sleep(0.5)
[docs] @opencv_or_pil def resize(image, dsize, interpolation='LINEAR'): assert interpolation in ('NEAREST', 'LINEAR', 'CUBIC', 'LANCZOS4') dsize = tuple(map(int, dsize)) assert len(dsize) == 2 if cv2: interpolation = getattr(cv2, 'INTER_' + interpolation) return cv2.resize(image, dsize, interpolation=interpolation) else: if interpolation == 'NEAREST': interpolation = Image.NEAREST elif interpolation == 'LANCZOS4': interpolation = Image.LANCZOS else: interpolation = getattr(Image, 'BI' + interpolation) image = pil_nd2img(image) image = image.resize(dsize, resample=interpolation) return pil_img2nd(image)