Source code for colour_datasets.loaders.jiang2013
"""
Camera Spectral Sensitivity Database - Jiang et al. (2013)
==========================================================
Define the objects implementing support for *Jiang, Liu, Gu and Süsstrunk
(2013)* *Camera Spectral Sensitivity Database* dataset loading:
- :class:`colour_datasets.loaders.DatasetLoader_Jiang2013`
- :func:`colour_datasets.loaders.build_Jiang2013`
References
----------
- :cite:`Jiang2013` : Jiang, J., Liu, D., Gu, J., & Susstrunk, S. (2013).
What is the space of spectral sensitivity functions for digital color
cameras? 2013 IEEE Workshop on Applications of Computer Vision (WACV),
168-179. doi:10.1109/WACV.2013.6475015
"""
from __future__ import annotations
import codecs
import os
import re
import numpy as np
from colour import SpectralShape
from colour.characterisation import RGB_CameraSensitivities
from colour.hints import Dict
from colour.utilities import as_float_array
from colour_datasets.loaders import AbstractDatasetLoader
from colour_datasets.records import datasets
__author__ = "Colour Developers"
__copyright__ = "Copyright 2019 Colour Developers"
__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
__maintainer__ = "Colour Developers"
__email__ = "colour-developers@colour-science.org"
__status__ = "Production"
__all__ = [
"DatasetLoader_Jiang2013",
"build_Jiang2013",
]
[docs]
class DatasetLoader_Jiang2013(AbstractDatasetLoader):
"""
Define the *Jiang et al. (2013)* *Camera Spectral Sensitivity Database*
dataset loader.
Attributes
----------
- :attr:`colour_datasets.loaders.DatasetLoader_Jiang2013.ID`
Methods
-------
- :meth:`colour_datasets.loaders.DatasetLoader_Jiang2013.__init__`
- :meth:`colour_datasets.loaders.DatasetLoader_Jiang2013.load`
References
----------
:cite:`Jiang2013`
"""
ID: str = "3245883"
"""Dataset record id, i.e., the *Zenodo* record number."""
def __init__(self) -> None:
super().__init__(datasets()[DatasetLoader_Jiang2013.ID])
[docs]
def load(self) -> Dict[str, RGB_CameraSensitivities]:
"""
Sync, parse, convert and return the *Jiang et al. (2013)*
*Camera Spectral Sensitivity Database* dataset content.
Returns
-------
:class:`dict`
*Jiang et al. (2013)* *Camera Spectral Sensitivity Database*
dataset content.
Examples
--------
>>> from colour_datasets.utilities import suppress_stdout
>>> dataset = DatasetLoader_Jiang2013()
>>> with suppress_stdout():
... dataset.load()
>>> len(dataset.content.keys())
28
"""
super().sync()
shape = SpectralShape(400, 720, 10)
self._content = {}
database_path = os.path.join(
self.record.repository, "dataset", "camspec_database.txt"
)
with codecs.open(database_path, encoding="utf-8") as database_file:
lines = filter(None, (line.strip() for line in database_file.readlines()))
camera = None
for line in lines:
if re.match("[a-zA-Z]+", line):
camera = line
self._content[camera] = []
continue
self._content[camera].extend(
[float(value) for value in line.split("\t")]
)
for camera, values in self._content.items():
self._content[camera] = RGB_CameraSensitivities(
np.transpose(np.reshape(as_float_array(values), (3, 33))),
shape.range(),
name=camera,
)
return self._content
_DATASET_LOADER_JIANG2013: DatasetLoader_Jiang2013 | None = None
"""
Singleton instance of the *Jiang et al. (2013)*
*Camera Spectral Sensitivity Database* dataset loader.
"""
[docs]
def build_Jiang2013(load: bool = True) -> DatasetLoader_Jiang2013:
"""
Singleton factory that builds the *Jiang et al. (2013)*
*Camera Spectral Sensitivity Database* dataset loader.
Parameters
----------
load
Whether to load the dataset upon instantiation.
Returns
-------
:class:`colour_datasets.loaders.DatasetLoader_Jiang2013`
Singleton instance of the *Jiang et al. (2013)*
*Camera Spectral Sensitivity Database* dataset loader.
References
----------
:cite:`Jiang2013`
"""
global _DATASET_LOADER_JIANG2013 # noqa: PLW0603
if _DATASET_LOADER_JIANG2013 is None:
_DATASET_LOADER_JIANG2013 = DatasetLoader_Jiang2013()
if load:
_DATASET_LOADER_JIANG2013.load()
return _DATASET_LOADER_JIANG2013