2020-02-10 07:38:56 +08:00
|
|
|
# encoding: utf-8
|
|
|
|
"""
|
|
|
|
@author: liaoxingyu
|
|
|
|
@contact: sherlockliao01@gmail.com
|
|
|
|
"""
|
|
|
|
import numpy as np
|
|
|
|
from PIL import Image, ImageOps
|
|
|
|
|
|
|
|
from fastreid.utils.file_io import PathManager
|
|
|
|
|
|
|
|
|
|
|
|
def read_image(file_name, format=None):
|
|
|
|
"""
|
|
|
|
Read an image into the given format.
|
|
|
|
Will apply rotation and flipping if the image has such exif information.
|
2021-01-22 21:11:19 +08:00
|
|
|
|
2020-02-10 07:38:56 +08:00
|
|
|
Args:
|
|
|
|
file_name (str): image file path
|
|
|
|
format (str): one of the supported image modes in PIL, or "BGR"
|
|
|
|
Returns:
|
|
|
|
image (np.ndarray): an HWC image
|
|
|
|
"""
|
|
|
|
with PathManager.open(file_name, "rb") as f:
|
|
|
|
image = Image.open(f)
|
|
|
|
|
2020-12-28 14:45:09 +08:00
|
|
|
# work around this bug: https://github.com/python-pillow/Pillow/issues/3973
|
2020-02-10 07:38:56 +08:00
|
|
|
try:
|
|
|
|
image = ImageOps.exif_transpose(image)
|
|
|
|
except Exception:
|
|
|
|
pass
|
|
|
|
|
|
|
|
if format is not None:
|
|
|
|
# PIL only supports RGB, so convert to RGB and flip channels over below
|
|
|
|
conversion_format = format
|
|
|
|
if format == "BGR":
|
|
|
|
conversion_format = "RGB"
|
|
|
|
image = image.convert(conversion_format)
|
|
|
|
image = np.asarray(image)
|
2020-12-28 14:45:09 +08:00
|
|
|
|
2020-02-10 07:38:56 +08:00
|
|
|
# PIL squeezes out the channel dimension for "L", so make it HWC
|
|
|
|
if format == "L":
|
|
|
|
image = np.expand_dims(image, -1)
|
2020-12-28 14:45:09 +08:00
|
|
|
|
|
|
|
# handle formats not supported by PIL
|
|
|
|
elif format == "BGR":
|
|
|
|
# flip channels if needed
|
|
|
|
image = image[:, :, ::-1]
|
|
|
|
|
|
|
|
# handle grayscale mixed in RGB images
|
|
|
|
elif len(image.shape) == 2:
|
|
|
|
image = np.repeat(image[..., np.newaxis], 3, axis=-1)
|
|
|
|
|
2020-02-10 07:38:56 +08:00
|
|
|
image = Image.fromarray(image)
|
2020-12-28 14:45:09 +08:00
|
|
|
|
2020-02-10 07:38:56 +08:00
|
|
|
return image
|