Source code for deepdraw.data.loader
# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
#
# SPDX-License-Identifier: GPL-3.0-or-later
"""Data loading code."""
import functools
import os
import numpy
import PIL.Image
import PIL.ImageFile
import skimage.exposure
from .sample import DelayedSample
PIL.ImageFile.LOAD_TRUNCATED_IMAGES = True
[docs]
def load_pil_raw_12bit_jsrt(path, width):
"""Loads a raw 16-bit sample data.
This method was designed to handle the raw images from the JSRT_ dataset.
It reads the data file and applies a simple histogram equalization to the
8-bit representation of the image to obtain something along the lines of
the PNG (unofficial) version distributed at `JSRT-Kaggle`_.
Parameters
----------
path : str
The full path leading to the image to be loaded
width : int
The desired width of the output image
Returns
-------
image : PIL.Image.Image
A PIL image in RGB mode, with `width`x`width` pixels
.. include:: ../../links.rst
"""
raw_image = numpy.fromfile(path, numpy.dtype(">u2")).reshape(2048, 2048)
raw_image[raw_image > 4095] = 4095
raw_image = 4095 - raw_image # invert colors
raw_image = (raw_image >> 4).astype(numpy.uint8) # 8-bit uint
raw_image = skimage.exposure.equalize_hist(raw_image)
return (
PIL.Image.fromarray((raw_image * 255).astype(numpy.uint8))
.resize((width, width))
.convert("RGB")
)
[docs]
def load_pil_rgb(path):
"""Loads a sample data.
Parameters
----------
path : str
The full path leading to the image to be loaded
Returns
-------
image : PIL.Image.Image
A PIL image in RGB mode
"""
return PIL.Image.open(path).convert("RGB")
[docs]
def load_pil_1(path):
"""Loads a sample binary label or mask.
Parameters
----------
path : str
The full path leading to the image to be loaded
Returns
-------
image : PIL.Image.Image
A PIL image in mode "1"
"""
return PIL.Image.open(path).convert(mode="1", dither=None)
[docs]
def make_delayed(sample, loader, key=None):
"""Returns a delayed-loading Sample object.
Parameters
----------
sample : dict
A dictionary that maps field names to sample data values (e.g. paths)
loader : object
A function that inputs ``sample`` dictionaries and returns the loaded
data.
key : str
A unique key identifier for this sample. If not provided, assumes
``sample`` is a dictionary with a ``data`` entry and uses its path as
key.
Returns
-------
sample : deepdraw.data.sample.DelayedSample
In which ``key`` is as provided and ``data`` can be accessed to trigger
sample loading.
"""
return DelayedSample(
functools.partial(loader, sample),
key=key or os.path.splitext(sample["data"])[0],
)