Releases: colour-science/colour
Colour 0.4.6
Colour 0.4.6 - Alpha Milestone
Fixes
Dependencies
- trimesh was incorrectly added as a required dependency during the uv migration. (4649c11, @KelSolaar)
colour.models
- Revert c25934e which incorrectly changed Canon Cinema Gamut whitepoint to D55. (92dcd6d, @KelSolaar)
Colour 0.4.5
Colour 0.4.5 - Alpha Milestone
Features
Dependencies
- Support for Python 3.13 was implemented. (#1302, @ KelSolaar)
- Support for Numpy 2 was implemented. (#1279, @KelSolaar)
- pygraphviz was replaced with pydot so that installation is easier:
pygraphviz
needs to be built , which is not trivial, whereaspydot
is a pure Python package.
The following scientific packages minimum versions are required:
- numpy >= 1.24
- scipy >= 1.10
- matplotlib >= 3.7
- networkx >= 3
- pandas >= 2
Development Environment
Astral's uv
-
We switched from Poetry to uv and hatch for managing the development environment and build our wheels. (#1300)
- uv is faster at resolving the environment and the team at astral.sh has been doing wonders for the Python ecosystem, we have been using ruff for a while now.
- It is so good that it literally only requires
uv run --with colour-science my_script.py
to run a script using Colour. - Thanks a ton to @charliermarsh et al.!
-
Improve static typing checks using multi-threading thanks to @erictraut suggestion.
Environment
It is now possible to create a ~/.colour-science/colour-science.jenv
JSON file from which Colour will load environment variables from: (#1239, @KelSolaar)
{
"COLOUR_SCIENCE__COLOUR__SHOW_WARNINGS_WITH_TRACEBACK": 1
}
The following new environment variables are now supported:
COLOUR_SCIENCE__FILTER_RUNTIME_WARNINGS
: Filter Colour runtime warnings.COLOUR_SCIENCE__FILTER_USAGE_WARNINGS
: Filter Colour usage warnings.COLOUR_SCIENCE__FILTER_COLOUR_WARNINGS
: Filter Colour warnings, this also filters Colour usage and runtime warnings.COLOUR_SCIENCE__FILTER_PYTHON_WARNINGS
: Filter Python warnings.
Input and Output
- Definitions reading from and writing to files now support the
pathlib.Path
type. (ff4fe99, @KelSolaar)
colour.adaptation
- Implement support for vK20 chromatic adaptation transform with
colour.adaptation.matrix_chromatic_adaptation_vk20
andcolour.adaptation.chromatic_adaptation_vK20
definitions. (#1131, @KelSolaar)
colour.characterisation
- Add the ColorChecker SG chromaticity coordinates with the
colour.CCS_COLOURCHECKERS["ColorCheckerSG - Before November 2014"]
andcolour.CCS_COLOURCHECKERS["ColorCheckerSG - After November 2014"]
attribute keys.
colour.colorimetry
- Use
shape
if passed, to also reshape thecolour.continuous.AbstractContinuousSignal
sub-classes incolour.colorimetry.sd_to_XYZ_integration
definition. (#1250, @KelSolaar)
colour.models
-
Programmatically add polar conversions to the following definitions: (#1183, #1272, @KelSolaar)
-
colour.Lab_to_LCHab
* -
colour.LCHab_to_Lab
* -
colour.Luv_to_LCHuv
* -
colour.LCHuv_to_Luv
* -
colour.hdr_CIELab_to_hdr_CIELCHab
-
colour.hdr_CIELCHab_to_hdr_CIELab
-
colour.Hunter_Lab_to_Hunter_LCHab
-
colour.Hunter_LCHab_to_Hunter_Lab
-
colour.Hunter_Rdab_to_Hunter_RdCHab
-
colour.Hunter_RdCHab_to_Hunter_Rdab
-
colour.ICaCb_to_ICHab
-
colour.ICHab_to_ICaCb
-
colour.ICtCp_to_ICHtp
-
colour.ICHtp_to_ICtCp
-
colour.IgPgTg_to_IgCHpt
-
colour.IgCHpt_to_IgPgTg
-
colour.IPT_to_ICH
-
colour.ICH_to_IPT
-
colour.Izazbz_to_IzCHab
-
colour.IzCHab_to_Izazbz
-
colour.Jzazbz_to_JzCHab
-
colour.JzCHab_to_Jzazbz
-
colour.hdr_IPT_to_hdr_ICH
-
colour.hdr_ICH_to_hdr_IPT
-
colour.Oklab_to_Oklch
-
colour.Oklch_to_Oklab
-
colour.ProLab_to_ProLCHab
-
colour.ProLCHab_to_ProLab
-
colour.IPT_Ragoo2021_to_ICH_Ragoo2021
-
colour.ICH_Ragoo2021_to_IPT_Ragoo2021
* Now programmatically defined
colour.utilities
Port-Based Nodes and Graphs (#1277, @KelSolaar)
6 new classes were introduced to support for a port-based node-graph:
colour.utilities.Port
colour.utilities.PortNode
colour.utilities.PortGraph
colour.utilities.For
colour.utilities.ParallelForThread
colour.utilities.ParallelForMultiProcess
They enable the construction of processing graphs:
class NodeAdd(PortNode):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.description = "Perform the addition of the two input port values."
self.add_input_port("a")
self.add_input_port("b")
self.add_output_port("output")
def process(self):
a = self.get_input("a")
b = self.get_input("b")
if a is None or b is None:
return
self._output_ports["output"].value = a + b
self.dirty = False
class NodeMultiply(PortNode):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.description = (
"Perform the multiplication of the two input port values."
)
self.add_input_port("a")
self.add_input_port("b")
self.add_output_port("output")
def process(self):
a = self.get_input("a")
b = self.get_input("b")
if a is None or b is None:
return
self._output_ports["output"].value = a * b
self.dirty = False
node_add = NodeAdd()
node_add.set_input("a", 1)
node_add.set_input("b", 1)
node_multiply = NodeMultiply()
node_multiply.set_input("b", 2)
graph = PortGraph()
graph.add_node(node_add)
graph.add_node(node_multiply)
graph.connect(node_add, "output", node_multiply, "a")
graph.process()
print(node_multiply.get_output("output"))
graph.to_graphviz().draw("Graph.png", prog="dot")
colour-hdri uses the new classes to implement a multi-processed HDRI merging graph: https://github.com/colour-science/colour-hdri/blob/develop/colour_hdri/examples/examples_advanced_processing_with_an_input_device_transform.ipynb
Fixes
colour.colorimetry
- Fix issue where
colour.colorimetry.sds_and_msds_to_msds
definition did not always copy the converted spectral distributions and was causing seemingly random unit tests failure. (891d364, @KelSolaar) - Fix issue when passing a
colour.MultiSpectralDistributions
tocolour.sd_to_XYZ
definition using the ASTM E308 method. (20fb963, @KelSolaar, @gul916)
colour.io
- Ensure that
colour.io.process_image_OpenColorIO
definition handles non-contiguous arrays. (387c9e5, @nick-shaw, @KelSolaar)
colour.models
- Change Canon Cinema Gamut whitepoint to D55. (c25934e, @MrLixm, @KelSolaar)
colour.notation
- Reduce various thresholds in Munsell Renotation computations to allow sRGB colours to be converted. (#1173, 4b0c38d, @KelSolaar)
colour.utilities
- Ensure that caches are systematically cleared when changing dtype: It was causing seemingly random unit tests failure. (8faeb09, @KelSolaar)
Changes
colour.algebra
Object | Name | Author |
---|---|---|
colour.algebra.vector_dot |
vecmul |
@KelSolaar |
colour.plotting
Object | Signature | Author |
---|---|---|
colour.plotting.plot_RGB_colourspace_section |
plot_RGB_colourspace_section(colourspace: (RGB_Colourspace | LiteralRGBColourspace | str | Sequence[RGB_Colourspace | LiteralRGBColourspace | str]) ,model: LiteralColourspaceModel | str = "CIE xyY", axis: Literal["+z", "+x", "+y"] | str = "+z", origin: float = 0.5, normalise: bool = True,size: float = 1.0, show_section_colours: bool = True, show_section_contour: bool = True, segments: int = 64, **kwargs: Any) -> Tuple[Figure, Axes] |
@KelSolaar |
colour.utilities
- ~
colour.utilities.is_string
: (@KelSolaar)- Remove
Colour 0.4.4
Colour 0.4.4 - Alpha Milestone
This release implements support for Python 3.12 (#1224).
We are now using isort to order our imports. We improved the repository style using the Scientific Python Repository Review page.
colour-visuals was made public: It is a new repository implementing various WebGPU-based visuals on top of Colour and pygfx.
Features
Packaging
We have solved the clash with https://github.com/vaab/colour by loading a known subset of the objects given by vaab/colour-0.1.5 into our namespace if the COLOUR_SCIENCE__COLOUR__IMPORT_VAAB_COLOUR=True
environment variable is defined. (#1222, @KelSolaar, @tjdcs, @MichaelMauderer)
See the following issues for more information:
colour.hints
- Various new literals have been added to help packages using
Colour
with typing annotations. (#1198, @KelSolaar, @jamesmyatt)
colour.models
- Implement support for Apple Log Profile with
colour.models.log_encoding_AppleLogProfile
andcolour.models.log_decoding_AppleLogProfile
definitions. (@KelSolaar)
colour.plotting
-
Add new definitions to generate data useful for other plotting definitions and used by colour-visuals: (@KelSolaar)
-
colour.plotting.lines_daylight_locus
-
colour.plotting.lines_planckian_locus
-
colour.plotting.lines_pointer_gamut
-
colour.plotting.lines_spectral_locus
Fixes
colour.continuous
- Ensure that
colour.continuous.AbstractContinuousFunction
class and sub-classes, e.g.colour.SpectralDistribution
class, can be pickled. (#66c26b6, @KelSolaar)
colour.difference
- Fix numerical precision issue in
colour.difference.delta_E_CIE1994
definition. (#1206, @volrak, @KelSolaar)
colour.utilities
- Fix issue in
colour.utilities.verbose.multiline_repr
definition when an attribute representation isNone
. (#1466, @KelSolaar)
Changes
Unit Tests
- We have changed our unit tests to use
np.testing.assert_allclose
rather thannp.testing.assert_array_almost_equal
to help with tests failing on Github Actions because of minor precision issues when usingpytest-xdist
, multi-threading and caching. (@KelSolaar)
colour.constants
Object | Name | Author |
---|---|---|
colour.constants.DEFAULT_INT_DTYPE |
DTYPE_INT_DEFAULT |
@KelSolaar |
colour.constants.DEFAULT_FLOAT_DTYPE |
DTYPE_FLOAT_DEFAULT |
... |
Colour 0.4.3
Colour 0.4.3 - Alpha Milestone
We worked on many optimisations around colour quality metrics that should result in overall performance increase, thanks again to @tjdcs for the heavy lifting!
@charliermarsh's ruff is now used as a replacement for:
We also replaced mypy with pyright for performance reasons. We took that opportunity to simplify our type annotations.
The colour.XYZ_to_RGB
and colour.RGB_to_XYZ
definition signatures have been changed to be easier to use, please update any code using them. See #1127 for more information.
With this release, the following scientific packages minimum versions are required:
- numpy >= 1.22
- scipy >= 1.8
- matplotlib >= 3.5
- networkx >= 2.7
- pandas >= 1.4
Features
colour.characterisation
- Add TE226 V2 colour checker reference values. (#1113, #901, @Rusching)
- Add
colour.apply_matrix_colour_correction
definition andcolour.APPLY_MATRIX_COLOUR_CORRECTION_METHODS
attribute to conveniently apply a colour-correction matrix computed with thecolour.matrix_colour_correction
definition. (@KelSolaar) - Add terms 4 and 35 to Cheung (2004) polynomial transformation. (#1160, @chnmasta05)
colour.colorimetry
- The continuous signal classes are now iterable, e.g.
colour.SpectralDistribution
andcolour.MultiSpectralDistributions
. (#1088, @KelSolaar)
import colour
sd = colour.SDS_ILLUMINANTS["A"]
for i in sd:
print(i)
[ 300. 0.930483]
[ 305. 1.12821]
[ 310. 1.35769]
...
[ 780. 241.675]
import colour
sd = colour.MSDS_CMFS["CIE 2012 2 Degree Standard Observer"]
for i in sd:
print(i)
[ 3.90000000e+02 3.76964700e-03 4.14616100e-04 1.84726000e-02]
[ 3.91000000e+02 4.53241600e-03 5.02833300e-04 2.22110100e-02]
[ 3.92000000e+02 5.44655300e-03 6.08499100e-04 2.66981900e-02]
...
[ 8.30000000e+02 1.76246500e-06 7.05386000e-07 0.00000000e+00]
colour.models
- Implement support for Kirk (2019) Yrg colourspace with
colour.XYZ_to_Yrg
andcolour.Yrg_to_XYZ
definitions. (#1152, @KelSolaar) - Implement support for Fujifilm F-Log2 encodings with
colour.models.log_decoding_FLog2
andcolour.models.log_encoding_FLog2
definitions. (#1076, @zachlewis) - Implement support for PLASA ANSI E1.54 colourspace with
colour.models.RGB_COLOURSPACE_PLASA_ANSI_E154
attribute. (#1193, @KelSolaar)
colour.notation
- Implement support for CSS Color 3 with
colour.notation.CSS_COLOR_3
attribute andcolour.notation.keyword_to_RGB_CSSColor3
definition. (#1140, @KelSolaar)
colour.plotting
- Make RGB encoding optional in
colour.plotting.plot_RGB_chromaticities_in_chromaticity_diagram_CIE1931
,colour.plotting.plot_RGB_chromaticities_in_chromaticity_diagram_CIE1960UCS
andcolour.plotting.plot_RGB_chromaticities_in_chromaticity_diagram_CIE1976UCS
definitions. (@KelSolaar)
RGB = np.random.random((128, 128, 3))
plot_RGB_chromaticities_in_chromaticity_diagram(RGB, "ITU-R BT.709", scatter_kwargs={"apply_cctf_encoding": False})
- Add a new
colour.plotting.temperature.plot_daylight_locus
definition. (@KelSolaar) - Add a new
planckian_locus_use_mireds
keyword argument tocolour.plotting.temperature.plot_planckian_locus
definition. (@KelSolaar)
colour.temperature
- Add
colour.temperature.mired_to_CCT
andcolour.temperature.CCT_to_mired
definitions to perform micro reciprocal degree and CCT conversions. (#1114, @KelSolaar) - Add
colour.temperature.XYZ_to_CCT_Ohno2013
andcolour.temperature.CCT_to_XYZ_Ohno2013
convenient definitions. (#1120, @tjdcs)
colour.utilities
- Add
colour.utilities.int_digest
definition using xxhash to compute 64-bit integer hashes. (#1149, @KelSolaar, @tjdcs)
Performance
- The Colour Fidelity Index (2017), i.e.
colour.quality.colour_fidelity_index_CIE2017
definition, and TM 30-18, i.e.colour.quality.colour_fidelity_index_ANSIIESTM3018
definition, metrics performance has been improved by x100 thanks to overall optimizations, e.g.colour.temperature.uv_to_CCT_Ohno2013
definition is x5 faster. (#1120, @tjdcs, @KelSolaar)
Fixes
Dependencies
- Implement support for Numpy 1.24.0. (#1087, @KelSolaar)
colour.io
- Fix incorrect bit-depth conversion in
colour.io.write_image_OpenImageIO
definition when writing 16-bit integer images (82ef2c4, @nick-shaw, @KelSolaar)
colour.colorimetry
- Fix incorrect
colour.colorimetry.sd_gaussian_fwhm
definition output (#1184, @EricFlyMeToTheMoon, @tjdcs, @KelSolaar)
colour.models
- Implement various minor corrections from Sarifuddin (2021) to
colour.RGB_to_HCL
definition. (1a580ef, @KelSolaar)
colour.phenomena
- Fix incorrect CO2 concentration scaling in
colour.phenomena.rayleigh.F_air_Bodhaine1999
definition. (#307, #1167, @chnmasta05, @KelSolaar)
colour.utilities
- Fix dimensionality reduction issue in
colour.utilities.as_float
definition that was causing issue with 1-pixel images processing. (#1189, @KelSolaar, @MrLixm)
Changes
colour.colorimetry
Object | Signature | Author |
---|---|---|
colour.sd_single_led |
`sd_single_led(peak_wavelength: float, shape: SpectralShape = SPECTRAL_SHAPE_DEFAULT, method: Literal["Ohno 2005"] | str = "Ohno 2005", **kwargs: Any) -> SpectralDistribution` |
colour.sd_multi_leds |
`sd_multi_leds(peak_wavelengths: ArrayLike, shape: SpectralShape = SPECTRAL_SHAPE_DEFAULT, method: Literal["Ohno 2005"] | str = "Ohno 2005", **kwargs: Any) -> SpectralDistribution` |
colour.colorimetry.sd_single_led_Ohno2005 |
sd_single_led_Ohno2005(peak_wavelength: float, half_spectral_width: float, shape: SpectralShape = SPECTRAL_SHAPE_DEFAULT, **kwargs: Any) -> SpectralDistribution |
... |
colour.colorimetry.sd_multi_leds_Ohno2005 |
`sd_multi_leds_Ohno2005(peak_wavelengths: ArrayLike, half_spectral_widths: ArrayLike, peak_power_ratios: ArrayLike | None = None, shape: SpectralShape = SPECTRAL_SHAPE_DEFAULT, **kwargs: Any) -> SpectralDistribution` |
colour.characterisation
- Ensure that the matrix returned by
colour.matrix_idt
definition is whitepoint preserving using thecolour.characterisation.optimisation_factory_rawtoaces_v1
optimisation factory. (@KelSolaar) - Implement support for Finlayson et al. (2015) root-polynomials colour correction with
colour.characterisation.optimisation_factory_Oklab_15
optimisation factory. (@KelSolaar) - The
colour.matrix_idt
definition optimisation factories are now returning 4 objects. (@KelSolaar)
colour.models
- The
colour.XYZ_to_xy
andcolour.XYZ_to_xyY
definitions do no return the parameter illuminant chromaticities when the luminanceY
is equal to zero. This behaviour was motivated by a note from Bruce Justin Lindbloom but does not have a CIE or ASTM recommendation. (#1153, @KelSolaar)
Object | Name | Author |
---|---|---|
colour.XYZ_to_IPT_Munish2021 |
XYZ_to_IPT_Ragoo2021 |
@blue-j, @KelSolaar |
colour.IPT_Munish2021_to_XYZ |
IPT_Ragoo2021_to_XYZ |
... |
Object | Signature | Author |
---|---|---|
colour.XYZ_to_RGB |
`XYZ_to_RGB(XYZ: ArrayLike, colourspace: RGB_Colourspace | str, illuminant: ArrayLike |
Colour 0.4.2
Colour 0.4.2 - Alpha Milestone
This release implements support for Python 3.11. It includes the remaining contributions of the GSoC 2021 work from Cédric (@villirion). New RGB colourspaces, transfer functions, colour models and colour appearance models have been added. Various performance improvements have been implemented.
We would like to especially thanks @tjdcs for his recent contributions.
With this release, the minimum Python version is 3.9 and the following scientific packages minimum versions are required:
- numpy >= 1.20
- scipy >= 1.7
- matplotlib >= 3.4
- networkx >= 2.6
- pandas >= 1.3
Features
colour.appearance
- Implement support for Hellwig and Fairchild (2022) colour appearance model with
colour.XYZ_to_Hellwig2022
andcolour.Hellwig2022_to_XYZ
definitions. (#972 @KelSolaar) - Implement support for CIECAM16 colour appearance model with
colour.XYZ_to_CIECAM16
andcolour.CIECAM16_to_XYZ
definitions. (#1015, @KelSolaar)
colour.colorimetry
- Add convenient
colour.SpectralShape.wavelengths
property. (@KelSolaar)
colour.difference
- Implement support for Recommendation ITU-R BT.2124 with
colour.difference.delta_E_ITP
definition. (#981, @sabarish-srinivasan)
colour.io
- Implement simple wrapper for the Color Transformation Language (CTL) with the
colour.io.ctl_render
andcolour.io.process_image_ctl
definitions. (#977, @KelSolaar)
colour.models
-
Implement support for Munish Ragoo and Farup (2021) Optimised IPT colourspace with
colour.XYZ_to_IPT_Munish2021
andcolour.IPT_Munish2021_to_XYZ
definitions. (#990, @KelSolaar) -
Implement support for Leica L-Log log encodings with
colour.models.log_encoding_LLog
andcolour.models.log_decoding_LLog
definitions. (#986, @KelSolaar, @nick-shaw, @zachlewis) -
Implement support for Recommendation ITU-T H.273 / INTERNATIONAL STANDARD ISO/IEC 23091-2 code points for video signal type identification with
colour.COLOUR_PRIMARIES_ITUTH273
,colour.TRANSFER_CHARACTERISTICS_ITUTH273
andcolour.MATRIX_COEFFICIENTS_ITUTH273
attributes andcolour.models.describe_video_signal_colour_primaries
,colour.models.describe_video_signal_transfer_characteristics
andcolour.models.describe_video_signal_matrix_coefficients
definitions. (#987, #1033, @fxthomas, @KelSolaar). -
Implement support for ARRI Wide Gamut 4 colourspace and ARRI LogC4 log encodings with
colour.models.RGB_COLOURSPACE_ARRI_WIDE_GAMUT_4
attribute andcolour.models.log_encoding_ARRILogC4
andcolour.models.log_decoding_ARRILogC4
definitions. (#1056, @KelSolaar)For consistency:
- The
colour.models.RGB_COLOURSPACE_ALEXA_WIDE_GAMUT
attribute has been renamed toRGB_COLOURSPACE_ARRI_WIDE_GAMUT_3
. - The
colour.models.log_encoding_ALEXALogC
andcolour.models.log_decoding_ALEXALogC
definitions have been renamed tolog_encoding_ARRILogC3
andlog_decoding_ARRILogC3
respectively. - Keys in the various mappings, e.g.
colour.RGB_COLOURSPACES
,colour.LOG_ENCODINGS
, have been renamed accordingly.
- The
colour.recovery
GSoC - 2021
- Implement support for Jiang et al. (2013) camera RGB sensitivities recovery with
colour.recovery.RGB_to_msds_camera_sensitivities_Jiang2013
definition. (#1002, @villirion, @KelSolaar)
colour.utilities
- The
colour.utilities.CanonicalMapping
andcolour.utilities.LazyCanonicalMapping
, fomerlycolour.utilities.CaseInsensitiveMapping
andcolour.utilities.LazyCaseInsensitiveMapping
, respectively, support canonical (and sluggified) keys: (#993, @KelSolaar, @zachlewis)
>>> import colour
>>> colour.RGB_COLOURSPACES['ALEXA Wide Gamut'].name
'ALEXA Wide Gamut'
>>> colour.RGB_COLOURSPACES['alexa-wide-gamut'].name
'ALEXA Wide Gamut'
>>> colour.RGB_COLOURSPACES['alexawidegamut'].name
'ALEXA Wide Gamut'
>>> 'ALEXA Wide Gamut' in colour.RGB_COLOURSPACES
True
>>> 'alexa-wide-gamut' in colour.RGB_COLOURSPACES
True
>>> 'alexawidegamut' in colour.RGB_COLOURSPACES
True
>>> del colour.RGB_COLOURSPACES['alexa-wide-gamut']
>>> 'ALEXA Wide Gamut' in colour.RGB_COLOURSPACES
False
>>> list(colour.RGB_COLOURSPACES.slugified_keys())
['aces2065-1', 'acescc', 'acescct', 'acescg', 'acesproxy', 'adobe-rgb-1998', 'adobe-wide-gamut-rgb', 'apple-rgb', 'best-rgb', 'beta-rgb', 'blackmagic-wide-gamut', 'cie-rgb', 'cinema-gamut', 'colormatch-rgb', 'dcdm-xyz', 'dci-p3', 'dci-p3-p', 'dji-d-gamut', 'dragoncolor', 'dragoncolor2', 'davinci-wide-gamut', 'display-p3', 'don-rgb-4', 'eci-rgb-v2', 'erimm-rgb', 'ekta-space-ps-5', 'f-gamut', 'filmlight-e-gamut', 'itu-r-bt2020', 'itu-r-bt470-525', 'itu-r-bt470-625', 'itu-r-bt709', 'max-rgb', 'n-gamut', 'ntsc-1953', 'ntsc-1987', 'p3-d65', 'palsecam', 'prophoto-rgb', 'protune-native', 'redwidegamutrgb', 'redcolor', 'redcolor2', 'redcolor3', 'redcolor4', 'rimm-rgb', 'romm-rgb', 'russell-rgb', 's-gamut', 's-gamut3', 's-gamut3cine', 'smpte-240m', 'smpte-c', 'sharp-rgb', 'v-gamut', 'venice-s-gamut3', 'venice-s-gamut3cine', 'xtreme-rgb', 'srgb', 'aces', 'adobe1998', 'prophoto']
>>> list(colour.RGB_COLOURSPACES.canonical_keys())
['aces20651', 'acescc', 'acescct', 'acescg', 'acesproxy', 'adobergb1998', 'adobewidegamutrgb', 'applergb', 'bestrgb', 'betargb', 'blackmagicwidegamut', 'ciergb', 'cinemagamut', 'colormatchrgb', 'dcdmxyz', 'dcip3', 'dcip3p', 'djidgamut', 'dragoncolor', 'dragoncolor2', 'davinciwidegamut', 'displayp3', 'donrgb4', 'ecirgbv2', 'erimmrgb', 'ektaspaceps5', 'fgamut', 'filmlightegamut', 'iturbt2020', 'iturbt470525', 'iturbt470625', 'iturbt709', 'maxrgb', 'ngamut', 'ntsc1953', 'ntsc1987', 'p3d65', 'palsecam', 'prophotorgb', 'protunenative', 'redwidegamutrgb', 'redcolor', 'redcolor2', 'redcolor3', 'redcolor4', 'rimmrgb', 'rommrgb', 'russellrgb', 'sgamut', 'sgamut3', 'sgamut3cine', 'smpte240m', 'smptec', 'sharprgb', 'vgamut', 'venicesgamut3', 'venicesgamut3cine', 'xtremergb', 'srgb', 'aces', 'adobe1998', 'prophoto']
>>> list(colour.MSDS_CMFS.slugified_keys())
['stockman-sharpe-2-degree-cone-fundamentals', 'stockman-sharpe-10-degree-cone-fundamentals', 'smith-pokorny-1975-normal-trichromats', 'wright-guild-1931-2-degree-rgb-cmfs', 'stiles-burch-1955-2-degree-rgb-cmfs', 'stiles-burch-1959-10-degree-rgb-cmfs', 'cie-1931-2-degree-standard-observer', 'cie-1964-10-degree-standard-observer', 'cie-2012-2-degree-standard-observer', 'cie-2012-10-degree-standard-observer', 'cie-2015-2-degree-standard-observer', 'cie-2015-10-degree-standard-observer', 'cie_2_1931', 'cie_10_1964']
>>> list(colour.MSDS_CMFS.canonical_keys())
['stockmansharpe2degreeconefundamentals', 'stockmansharpe10degreeconefundamentals', 'smithpokorny1975normaltrichromats', 'wrightguild19312degreergbcmfs', 'stilesburch19552degreergbcmfs', 'stilesburch195910degreergbcmfs', 'cie19312degreestandardobserver', 'cie196410degreestandardobserver', 'cie20122degreestandardobserver', 'cie201210degreestandardobserver', 'cie20152degreestandardobserver', 'cie201510degreestandardobserver', 'cie21931', 'cie101964']
Most of the datasets Colour ship with benefit from this new feature.
Performance
colour.temperature.uv_to_CCT_Ohno2013
definition is ~100x faster. (#951, @KelSolaar)colour.temperature.CCT_to_uv_Ohno2013
definition is ~425x faster. (#951, @KelSolaar)- Creation of the
colour.Signal
class underlying continuous function now happens lazilly. (#1057, @tjdcs) colour.SpectralDistribution.shape
property getter is faster by ensuring monotonicity of thecolour.SpectralDistribution.domain
property. (#1067, 85f6a57, @tjdcs, @KelSolaar)
Fixes
colour.contrast
- Fix incorrect log function in the pupil diameter computation of Barten (1999) contrast sensitivity function. (#1022, @xmsguan, @KelSolaar)
Changes
colour.algebra
Object | Access Change | Author |
---|---|---|
colour.algebra.ellipse_coefficients_general_form |
colour.geometry.ellipse_coefficients_general_form |
@KelSolaar |
colour.algebra.ellipse_coefficients_canonical_form |
colour.geometry.ellipse_coefficients_canonical_form |
... |
colour.algebra.point_at_angle_on_ellipse |
colour.geometry.point_at_angle_on_ellipse |
... |
colour.algebra.ellipse_fitting_Halir1998 |
colour.geometry.ellipse_fitting_Halir1998 |
... |
colour.algebra.ELLIPSE_FITTING_METHODS |
colour.geometry.ELLIPSE_FITTING_METHODS |
... |
colour.algebra.ellipse_fitting |
colour.geometry.ellipse_fitting |
... |
colour.algebra.extend_line_segment |
colour.geometry.extend_line_segment |
... |
colour.algebra.extend_line_segment |
colour.geometry.extend_line_segment |
... |
colour.algebra.extend_line_segment |
colour.geometry.extend_line_segment |
... |
colour.characterisation
Object | Signature ...
Colour 0.4.1
Colour 0.4.1 - Alpha Milestone
This release is a maintenance release that mainly addresses packaging issues experienced by the MSYS2 maintainers and import issues when using Colour with Numpy 1.19.x and 1.20.x.
Fixes
Dependencies
- Fix import issues when trying to import
colour
with Numpy 1.19.x and 1.20.x. (@KelSolaar, @remia)
Distribution
- Fix incorrectly generated
setup.py
file. (@KelSolaar, @kmilos)
colour.colorimetry
- Fix intersection filtering in
colour.colorimetry.closest_spectral_locus_wavelength
definition. (@KelSolaar, @sobotka)
Colour 0.4.0
Colour 0.4.0 - Alpha Milestone
Over a year in the making, this release integrates most of the GSoC 2021 work from Cédric (@villirion), all the code from Geetansh (@SGeetansh) and the remaining GSoC 2020 code from Nishant (@njwardhan). We would like to thank them again for their great contributions!
Python 2.7 support has been dropped and the minimal version is Python 3.8 as per https://scientific-python.org/. The following minimal dependency versions are also required:
The highlights of this release are as follows:
- Colour now runs on iOS and iPadOS with Pyto.
- The import of
colour
is now 3.6 times faster. - Typing annotations have been added and the codebase is checked with Mypy.
- The documentation has been updated and uses the pydata-sphinx-theme and has better compliance with PEP257.
- The code formatter is now Black,
- Many Python 3 features such as f-Strings or the
dataclass
decorator have been adopted. - The plotting API has been improved to be more consistent when setting the colours of some figures, e.g. spectral or planckian locus.
- New colour appearance models:
- Zhai and Luo (2018) chromatic adaptation model.
- Kim, Weyrich and Kautz (2009) colour appearance model.
- ZCAM colour appearance model.
- Helmholtz-Kohlrausch effect estimation.
- New colour models:
- Oklab colour model.
- Hanbury (2003) IHLS (Improved HLS) colourspace.
- DIN99b, DIN99c, and DIN99d refined formulas.
- ProLab colourspace.
- Sarifuddin and Missaoui (2005) HCL colourspace.
- New RGB colourspaces and transfer functions:
- Nikon N-Gamut colourspace and the N-Log log encoding.
- Blackmagic Wide Gamut colourspace and the associated Blackmagic Film Generation 5 OETF.
- DaVinci Intermediate OETF.
- RED Log3G10 encoding and decoding curves with linear extension.
- Other notable features:
- Huang et al. (2015) power-functions.
- LUT 1D, LUT 3x1D and LUT 3D inversion.
- UPRTek and Sekonic spectral data parsers.
- SPImtx LUT input and output.
- R'G'B' to Y'CbCr matrices computation.
- Gamut ring/section plotting.
- Rösch-MacAdam colour solid hue lines.
- Support for OpenColorIO processor.
- Note that the optional dependency is not specified in the
pyproject.toml
, see AcademySoftwareFoundation/OpenColorIO#1573 for more information.
- Note that the optional dependency is not specified in the
Thanks again to all the contributors to this release!
- @aforsythe
- @fredsavoir
- @ilia3101
- @jedypod
- @JGoldstone
- @nick-shaw
- @njwardhan
- @Paul-Sims
- @ramparvathaneni
- @romanovar
- @saransh
- @SGeetansh
- @sobotka
- @villirion
- @zachlewis
Features
Typing
- The API has been fully annotated with typing annotations, a new
colour.hints
sub-package exporting all the hints has been created.
Performance
- Import time has been reduced to ~1.5secs from 5.5secs on @KelSolaar's MacBook Pro (Retina, 13-inch, Mid 2014) by using a lazy load mechanism for the spectral data and delaying various imports in the
colour.plotting.tm3018
module. See PR #840 for more information. - Repetitive spectral computations are now cached and a small cache management API has been created, see
colour.utilities.CACHE_REGISTRY
attribute for more information. - The
colour.sd_to_XYZ
andcolour.msds_to_XYZ
definitions now use the same n-dimensional code under the hood. Some minor numerical differences are expected as the explicit summations and multiplications have been replaced withnp.dot
.
colour.adaptation
GSoC - 2021
- Implement support for Zhai and Luo (2018) chromatic adaptation model with
colour.adaptation.chromatic_adaptation_Zhai2018
definition. (@villirion, @KelSolaar)
colour.appearance
GSoC - 2021
- Implement support for Kim, Weyrich and Kautz (2009) colour appearance model with
colour.XYZ_to_Kim2009
andcolour.Kim2009_to_XYZ
definitions. (@villirion, @KelSolaar)
- Implement support for ZCAM colour appearance model with the
colour.XYZ_to_ZCAM
andcolour.ZCAM_to_XYZ
definitions. (@KelSolaar) - Implement support for Helmholtz-Kohlrausch effect estimation with
colour.HelmholtzKohlrausch_effect_object_Nayatani1997
andcolour.HelmholtzKohlrausch_effect_luminous_Nayatani1997
definitions. (@ilia3101, @KelSolaar) - Colour appearance models now use a dataclass-like class output instead of the
namedtuple
and thus are mutable.
colour.characterisation
- Various ACES Input Device Transform computation objects have been updated to generate additional data and support more features for the Academy Input Device Transform (IDT) calculator. (@KelSolaar, @aforsythe)
- Add
colour.camera_RGB_to_ACES2065_1
definition. (@KelSolaar, @aforsythe)
colour.colorimetry
- Implement support for spectral uniformity computation with
colour.spectral_uniformity
definition. (@KelSolaar) - Add
colour.TVS_ILLUMINANTS
attribute providing a reference for the CIE XYZ tristimulus values of the CIE illuminants. (@KelSolaar) - Ensure that
colour.SpectralShape
and dictKeysView
class instances can be passed as domain tocolour.SpectralDistribution
andcolour.MutliSpectralDistributions
classes. (@KelSolaar) - The
colour.colorimetry.yellowness_ASTME313
definition has been updated to use the recommended Yellowness Index equation as given by ASTME313. The alternative method has been renamed tocolour.colorimetry.yellowness_ASTME313_alternative
. (@KelSolaar, @romanovar)
colour.difference
- Implement support for STRESS index computation according to García et al. (2007) method with
colour.index_stress
definition andcolour.INDEX_STRESS_METHODS
attribute. (@KelSolaar) - Implement support for Huang et al. (2015) power-functions improving colour-difference formulas with
colour.difference.power_function_Huang2015
definition. (@KelSolaar)
colour.io
GSoC - 2020
- Implement support for LUT 1D, LUT 3x1D and LUT 3D inversion with the
colour.LUT1D.invert
,colour.LUT3x1D.invert
andcolour.LUT3D.invert
methods. (@njwardhan, @KelSolaar)
GSoC - 2021
- Implement support for UPRTek and Sekonic spectral data parsers with the
colour.SpectralDistribution_UPRTek
andcolour.SpectralDistribution_Sekonic
classes. (@SGeetansh, @KelSolaar)
- Implement support for OpenColorIO processor with
colour.io.process_image_OpenColorIO
definition. (@KelSolaar) - Implement support for SPImtx LUT input and output with new
colour.io.read_LUT_SonySPImtx
andcolour.io.write_LUT_SonySPImtx
definitions andcolour.io.LUTOperatorMatrix
support class. (@nick-shaw, @KelSolaar, @zachlewis) - The
colour.io.tm2714.Header_IESTM2714
class can now be hashed and compared for equality. (@JGoldstone)
colour.models
GSoC - 2021
- Implement support for Hanbury (2003) IHLS (Improved HLS) colourspace with
colour.RGB_to_IHLS
andcolour.IHLS_to_RGB
definitions. (@SGeetansh, @KelSolaar) - Implement support for DIN99b, DIN99c, and DIN99d refined formulas in
colour.Lab_to_DIN99
andcolour.DIN99_to_Lab
definitions. (@SGeetansh) - Implement support for ProLab colourspace with
colour.ProLab_to_XYZ
andcolour.XYZ_to_ProLab
definitions. (@SGeetansh, @KelSolaar)
- Implement support for Sarifuddin and Missaoui (2005) HCL colourspace with
colour.RGB_to_HCL
andcolour.HCL_to_RGB
definitions. (@Saransh-cpp, @KelSolaar) - Implement wrapper
colour.XYZ_to_ICTCP
andcolour.ICTCP_to_XYZ
definitions. (@KelSolaar) - Implement wrapper
colour.XYZ_to_CAM02LCD
,colour.CAM02LCD_to_XYZ
,colour.XYZ_to_CAM02SCD
,colour.CAM02SCD_to_XYZ
,colour.XYZ_to_CAM02UCS
and
colour.CAM02UCS_to_XYZ
definitions. (@KelSolaar) - Implement wrapper
colour.XYZ_to_CAM16LCD
,colour.CAM16LCD_to_XYZ
,colour.XYZ_to_CAM16SCD
,colour.CAM16SCD_to_XYZ
,colour.XYZ_to_CAM16UCS
and
colour.CAM16UCS_to_XYZ
definitions. (@KelSolaar) - Implement support for R'G'B' to Y'CbCr matrices computation with
colour.matrix_YCbCr
andcolour.offset_YCbCr
definitions. (@KelSolaar, @nick-shaw) - Implement support for Oklab colour model with
colour.XYZ_to_Oklab
andcolour.Oklab_to_XYZ
definitions. (@KelSolaar) - Implement support for Nikon N-Gamut colourspace and the N-Log log encoding and decoding curves with
colour.models.RGB_COLOURSPACE_N_GAMUT
class andcolour.models.log_encoding_NLOG
andcolour.models.log_decoding_NLOG
definitions. (@sobotka, @KelSolaar) - Implement support for RED Log3G10 encoding and decoding curves that uses a linear extension as given in the final version of White Paper on REDWideGamutRGB and Log3G10. (@jedypod)
- Implement support for Blackmagic Wide Gamut colourspace and the associated Blackmagic Film Generation 5 OETF and its inverse with
colour.models.RGB_COLOURSPACE_BLACKMAGIC_WIDE_GAMUT
attribute,colour.models.oetf_BlackmagicFilmGeneration5
andcolour.models.oetf_inverse_BlackmagicFilmGeneration5
definitions. (@KelSolaar) - Implement support for *DaVinci Inte...
Colour 0.3.16
Colour 0.3.16 - Alpha Milestone
This release integrates all the GSoC work from Pawel (@enneract), most of the code from Nishant (@njwardhan) and, the optimizations from Omar (@OmarWagih1). We would like to thank them again for their great contributions!
We stop testing for Python 3.5 and, Scipy>=1.1.0 becomes the minimum version. This is the last feature release to support Python 2.7! We will also trim the deprecation code in the next version thus, please make sure to update your code accordingly.
The colour.SpectralDistribution.interpolate
and colour.MultiSpectralDistributions.interpolate
methods now honour class instantiation time interpolation parameters instead of blindly applying CIE 167:2005 recommendation, this introduces minor numerical changes.
Many definitions, methods and, module attributes have been renamed to improve consistency and we are reaching a satisfactory point in that regard, hopefully, the names will be much more stable from now on.
Features
colour.algebra
- Add
colour.algebra.smoothstep
definition. (@KelSolaar)
colour.characterisation
- Support for ACES Input Device Transform (IDT) generation: The implementation follows to some extent RAW to ACES v1 and P-2013-001 procedure. (@KelSolaar)
Usage is simple and as follows:
>>> sensitivities = colour.CAMERA_RGB_SPECTRAL_SENSITIVITIES['Nikon 5100 (NPL)']
>>> illuminant = colour.ILLUMINANT_SDS['D55']
>>> colour.matrix_idt(sensitivities, illuminant)
array([[ 0.46579991, 0.13409239, 0.01935141],
[ 0.01786094, 0.77557292, -0.16775555],
[ 0.03458652, -0.16152926, 0.74270359]])
The following ISO 7589 and 6728 spectral data has been added: (@KelSolaar)
-
ISO 6728 Standard Lens
-
ISO 7589 Diffuser
-
New attributes
colour.SDS_LENSES
containing the ISO 6728 Standard Lens andcolour.SDS_FILTERS
containing the ISO 7589 Diffuser have been added. -
The ISO 17321-1 24 patches reflectance data has been added as an alias to Ohta (1997) measurements. (@KelSolaar)
colour.colorimetry
The following ISO 7589 illuminants have been added: (@KelSolaar)
-
ISO 7589 Photographic Daylight
-
ISO 7589 Sensitometric Daylight
-
ISO 7589 Studio Tungsten
-
ISO 7589 Sensitometric Studio Tungsten
-
ISO 7589 Photoflood
-
ISO 7589 Sensitometric Photoflood
-
ISO 7589 Sensitometric Printer
-
Add
colour.msds_constant
,colour.msds_zeros
andcolour.msds_ones
definitions. (@KelSolaar)
colour.difference
- Add
colour.difference.JND_CIE1976
attribute representing the Just Noticeable Difference (JND) according to CIE 1976 colour difference formula.
colour.geometry
The geometry primitives generation code has been consolidated into a new colour.geometry
sub-package. The following objects are available: (@KelSolaar)
Primitives
colour.geometry.primitive_grid
colour.geometry.primitive_cube
colour.PRIMITIVE_METHODS
colour.primitive
Primitives Vertices
colour.geometry.primitive_vertices_quad_mpl
(for Matplotlib usage only)colour.geometry.primitive_vertices_grid_mpl
(for Matplotlib usage only)colour.geometry.primitive_vertices_cube_mpl
(for Matplotlib usage only)colour.geometry.primitive_vertices_sphere
colour.PRIMITIVE_VERTICES_METHODS
colour.primitive_vertices
colour.models
GSoC - 2020
- Add
colour.models.log_encoding_Log2
andcolour.models.log_decoding_Log2
log encoding and decoding definitions. (@njwardhan, @KelSolaar) - Add
colour.models.exponent_function_basic
andcolour.models.exponent_function_monitor_curve
definitions. (@njwardhan) - Add
colour.models.logarithmic_function_basic
,colour.models.logarithmic_function_quasilog
andcolour.models.logarithmic_function_camera
definitions. (@njwardhan, @nick-shaw, @KelSolaar)
- Implement support for IGPGTG colourspace by Hellwig and Fairchild (2020) with the
colour.XYZ_to_IGPGTG
andcolour.IGPGTG_to_XYZ
definitions. (@KelSolaar) - Implement support for DaVinci Wide Gamut colourspace. (@KelSolaar)
colour.plotting
- Implement support for ANSI/IES TM-30-18 Colour Rendition Report. (@enneract, @KelSolaar)
- Implement support for RGB colourspaces chromatic adaptation in various plotting routines: (@KelSolaar)
colour.quality
GSoC - 2020
- Implement support for CIE 2017 Colour Fidelity Index quality metric computation
colour.quality.colour_fidelity_index_CIE2017
definition. (@enneract) - Implement support for ANSI/IES TM-30-18 Colour Fidelity Index quality metric computation
colour.quality.colour_fidelity_index_ANSIIESTM3018
definition. (@enneract)
colour.recovery
GSoC - 2020
- Implement support for Jakob and Hanika (2019) spectral upsampling method with the
colour.recovery.XYZ_to_sd_Jakob2019
definition. (@enneract, @KelSolaar) - Implement support for Mallett and Yuksel (2019) spectral upsampling method with the
colour.recovery.RGB_to_sd_Mallett2019
definition. (@enneract) - Implement support for Otsu, Yamamoto and Hachisuka (2018) spectral upsampling method with the
colour.recovery.XYZ_to_sd_Otsu2018
definition. (@enneract, @KelSolaar)
colour.utilities
- Float precision can be set globally with the
colour.utilities.set_float_precision
definition and theCOLOUR_SCIENCE__FLOAT_PRECISION
environment variable. It will affect almost the entire API and lead to increase performance at the price of broken capabilities. (@KelSolaar) - It is now possible to pass an
axis
argument to thecolour.utilities.metric_mse
andcolour.utilities.metric_psnr
definitions. (@KelSolaar) - Add
colour.utilities.LazyCaseInsensitiveMapping
class for lazily loading slow and heavy datasets. (@KelSolaar)
Fixes
colour.characterisation
- The Finlayson, MacKiewicz and Hurlbert (2015) colour correction method was defective when root-polynomial expansion is in use. (@ChunHsinWang, @KelSolaar)
colour.colorimetry
- The
colour.SpectralDistribution.align
,colour.MultiSpectralDistributions.align
,colour.SpectralDistribution.interpolate
andcolour.MultiSpectralDistributions.interpolate
methods did not honour the instantiation time interpolation class and were forcibly using either thecolour.SpragueInterpolator
orcolour.CubicSplineInterpolator
classes unless aninterpolator
argument was passed. This behaviour was not desirable and was changed so that if the instantiation time interpolation class is not one ofcolour.SpragueInterpolator
orcolour.CubicSplineInterpolator
, then, it will be used instead and thus it will take precedence over the CIE 167:2005 recommendation. (@KelSolaar)
The immediate consequence is small numerical changes to various spectral computations, for example:
>>> illuminant = ILLUMINANTS_SDS['D65']
>>> sd_to_XYZ_tristimulus_weighting_factors_ASTME308(
... sd, cmfs, illuminant) # doctest: +ELLIPSIS
- array([ 10.8402899..., 9.6843539..., 6.2160858...])
+ array([ 10.8405832..., 9.6844909..., 6.2155622...])
>>> from colour import COLOURCHECKERS_SDS
>>> sd = COLOURCHECKERS_SDS['ColorChecker N Ohta']['dark skin']
>>> sd_to_aces_relative_exposure_values(sd) # doctest: +ELLIPSIS
- array([ 0.1171785..., 0.0866347..., 0.0589707...])
+ array([ 0.1171814..., 0.0866360..., 0.0589726...])
Colour quality metrics are affected a bit more severely:
```diff
>>> from colour import ILLUMINANTS_SDS
>>> sd = ILLUMINANTS_SDS['FL2']
>>> colour_rendering_index(sd) # doctest: +ELLIPSIS
- 64.1515202...
+ 64.2337241...
>>> from colour import ILLUMINANTS_SDS
>>> sd = ILLUMINANTS_SDS['FL2']
>>> colour_quality_scale(sd) # doctest: +ELLIPSIS
- 64.0172835...
+ 64.1117031...
CIE Illuminant D Series D60 chromaticity have also been modified:
- 'D60': np.array([0.321626242047397, 0.337736995955436]),
+ 'D60': np.array([0.321616709705268, 0.337619916550817]),
See #566 for more details.
colour.models
colour.OETF_INVERSES
attribute ITU-R BT.2100 HLG key was incorrectly named ITU-R BT.2100 HLD. (@jchwei)colour.HSL_to_RGB
definition output was incorrect when saturation was equal to 1. (@KelSolaar, @nadersadoughi)
colour.plotting
- The
colour.plotting.diagrams.plot_chromaticity_diagram
definition was not passing anymore the CMFS to the underlyingcolour.plotting.diagrams.plot_spectral_locus
andcolour.plotting.diagrams.plot_chromaticity_diagram_colours
definitions. (@KelSolaar, @sobotka)
colour.utilities
- The
colour.utilities.filter_warnings
definition was not behaving properly and has been fixed. (@KelSolaar)
Examples
colour.plotting.plot_RGB_colourspaces_gamuts
definition was using an incorrectstyle
argument. (@sianyi)
C...
Colour 0.3.15
Colour 0.3.15 - Alpha Milestone
This is mainly a maintenance release implementing support for Python 3.8, Numpy 1.18 and fixing a major issue in Krystek (1985) correlated colour temperature computation.
Features
colour.colorimetry
- The typical CIE LED illuminants spectral power distributions and chromaticity coordinates have been added to the datasets: (@KelSolaar)
- LED-B1
- LED-B2
- LED-B3
- LED-B4
- LED-B5
- LED-BH1,
- LED-RGB1
- LED-V1
- LED-V2
- The recommended indoor illuminants ID65 and ID50 spectral power distributions and chromaticity coordinates have been added to the datasets. (@KelSolaar)
- Add
colour.colorimetry.sds_and_multi_sds_to_multi_sds
definition that converts given spectral and multi-spectral distributions to multi-spectral distributions. (@KelSolaar)
colour.models
- Implement support for Display P3 RGB colourspace as per https://developer.apple.com/documentation/coregraphics/cgcolorspace/1408916-displayp3#discussion. (@sobotka)
- Add
colour.models.Jab_to_JCh
andcolour.models.JCh_to_Jab
definitions. (@KelSolaar)
Fixes
colour
Various fixes have been implemented to ensure compatibility with Python 3.8 and Numpy 1.18. (@KelSolaar, @MaxSchambach, @mzszym)
colour.io
- Prevent spi3d LUT index duplicates because of floating point precision related issues. (@KelSolaar, @sobotka, @nick-shaw)
colour.notation
- Fix incorrect Domain-Range scale in Munsell Renotation System implementation. (@KelSolaar)
colour.temperature
colour.temperature.CCT_to_uv_Krystek1985
definition was incorrectly implemented. Incorrect reading of the reference publications ended up with exponentiations being different, e.g.10**4
was replaced with10e4
. (@OlliNiemitalo)
Changes
colour.algebra
colour.algebra.cartesian_to_spherical
andcolour.algebra.spherical_to_cartesian
use ISO conversion convention. ρ is in range [0, +inf], θ is in range [0, pi] radians, i.e. [0, 180] degrees, and φ is in range [-pi, pi] radians, i.e. [-180, 180] degrees.
colour.volume
colour.is_within_visible_spectrum
: (@KelSolaar)- Signature:
XYZ_outer_surface(XYZ, cmfs=STANDARD_OBSERVERS_CMFS['CIE 1931 2 Degree Standard Observer'].clone().align(DEFAULT_SPECTRAL_SHAPE_XYZ_OUTER_SURFACE), illuminant=sd_ones(DEFAULT_SPECTRAL_SHAPE_XYZ_OUTER_SURFACE), tolerance=None, **kwargs)
- Signature:
colour.volume.XYZ_outer_surface
: (@KelSolaar)- Signature:
XYZ_outer_surface(cmfs=STANDARD_OBSERVERS_CMFS['CIE 1931 2 Degree Standard Observer'].clone().align(DEFAULT_SPECTRAL_SHAPE_XYZ_OUTER_SURFACE), illuminant=sd_ones(DEFAULT_SPECTRAL_SHAPE_XYZ_OUTER_SURFACE), **kwargs)
- Implementation: The generated CIE XYZ tristimulus values are not normalised anymore, this will only affect computation if a different illuminant than CIE Illuminant E is chosen.
- Signature:
colour.plotting
: (@KelSolaar)colour.plotting.common.wrap_title
- Remove
Colour 0.3.14
Colour 0.3.14 - Alpha Milestone
We would like to thanks all the contributors as usual!
With this release we are getting close to have a beta candidate in the coming months. It will likely be the last version to support Python 2.x.
NumFOCUS
Colour is now a NumFOCUS affiliated project:
We had a few new contributors for the 2019 edition of the Hacktoberfest. Thanks to @Chinmayrane16, @evalevanto, @feralpoosum, @BPearlstine and, @pavithraes for their contributions!
Automatic Colour Conversion Graph
Colour now implements an automatic colour conversion graph based on NetworkX and enabling easier colour conversions:
>>> sd = colour.COLOURCHECKERS_SDS['ColorChecker N Ohta']['dark skin']
>>> convert(sd, 'Spectral Distribution', 'sRGB', verbose={'mode': 'Short'})
Image Input and Output
Imageio is now a requirement for reading and writing images, it will be used if OpenImageIO is not available. If you wish to read OpenEXR files or develop Colour, you will need to install the FreeImage plugin as follows:
$ python -c "import imageio;imageio.plugins.freeimage.download()"
Support for OpenImageIO 2.x has also been implemented.
Name and Signature Changes
Various colour component transfer functions objects have been either renamed or their signature changed, most notably the sRGB transfer functions and the colour.oetf
definition.
All the reverse words have been replaced with inverse in object names, file names and, docstrings.
Coverage
Coverage was raised to 100%. It does not mean that all the possible code paths are covered but it certainly strengthen the API.
Dependency Management
We have adopted Poetry to manage the development dependencies, the setup.py
file has been replaced with a standardized pyproject.toml
file.
Continuous Integration
Travis-ci and Azure Pipelines have been replaced with Github Actions.
Documentation
The README and the Manual have been slightly reorganised to create a better separation between the tutorials, API reference and, the new How-To Guide.
Features
colour.colorimetry
- Add
colour.sds_and_multi_sds_to_sds
definition that converts given spectral and multi-spectral distributions to a flat list of spectral distributions. (@KelSolaar) - Implement support for ICC D50 illuminant computed from the following CIE XYZ tristimulus values [96.42, 100.00, 82.49]. (@KelSolaar)
- Add
colour.colorimetry.multi_sds_to_XYZ_ASTME308
definition that converts given multi-spectral distributions to CIE XYZ tristimulus values according to to practise ASTM E308-15 method. (@KelSolaar) - Implement support for ICC D50 illuminant computed from the following CIE XYZ tristimulus values [96.42, 100.00, 82.49]. (@KelSolaar)
colour.corresponding
colour.corresponding_chromaticities_prediction
definition can now use acolour.CorrespondingColourDataset
class instance as argument. (@KelSolaar)
colour.io
- The
colour.read_image
andcolour.write_image
definitions support Imageio and will fallback to it if OpenImageIO is not available. - OpenImageIO 2.x is now supported.
colour.graph
- The new
colour.convert
definition leverages an automatic colour conversion graph enabling easier colour conversions:
>>> sd = colour.COLOURCHECKERS_SDS['ColorChecker N Ohta']['dark skin']
>>> convert(sd, 'Spectral Distribution', 'sRGB', verbose={'mode': 'Short'})
===============================================================================
* *
* [ Conversion Path ] *
* *
* "sd_to_XYZ" --> "XYZ_to_sRGB" *
* *
===============================================================================
array([ 0.45675795, 0.30986982, 0.24861924])
>>> illuminant = colour.ILLUMINANTS_SDS['FL2']
>>> convert(sd, 'Spectral Distribution', 'sRGB', sd_to_XYZ={'illuminant': illuminant})
array([ 0.47924575, 0.31676968, 0.17362725])
colour.models
- Implement support for Recommendation ITU-R BT.2100-2 with the modified black lift handling of HLG EOTF. (@KelSolaar, @nick-shaw)
- Implement support for Fujifilm F-Gamut RGB colourspace with
colour.models.F_GAMUT_COLOURSPACE
class and Fujifilm F-Log withcolour.models.log_encoding_FLog
andcolour.models.log_decoding_FLog
transfer functions. (@sobotka, @KelSolaar, @nick-shaw) - Re-implement support for SMPTE C RGB colourspace with
colour.models.SMPTE_C_COLOURSPACE
class and related NTSC (1987) RGB colourspace withcolour.models.NTSC_1987_COLOURSPACE
class. (@KelSolaar)
colour.plotting
- Add
colour.plotting.plot_constant_hue_loci
definition plotting Constant Hue Loci as given by Hung and Berns (1995) or Ebner and Fairchild (1998). It is intended to be used with Colour - Datasets as follows:
from colour_datasets import load
from colour.plotting import plot_constant_hue_loci
plot_constant_hue_loci(load('3362536'), 'IPT')
colour.temperature
- Add various optimization based correlated colour temperature computation definitions: (@KelSolaar)
colour.temperature.xy_to_CCT_CIE_D
colour.temperature.CCT_to_xy_Hernandez1999
, this definition is not a bijective function and might produce unexpected results. It is given for consistency with other correlated colour temperature computation methods but should be avoided for practical applications.colour.temperature.xy_to_CCT_Kang2002
colour.temperature.uv_to_CCT_Krystek1985
colour.temperature.CCT_to_xy_McCamy1992
, this definition is not a bijective function and might produce unexpected results. It is given for consistency with other correlated colour temperature computation methods but should be avoided for practical applications.
Fixes
colour.quality
- The individual colour scales returned by
colour.colour_quality_scale
definition when using theadditional_data
argument were incorrectly scaled and have been fixed. (@KelSolaar)
Changes
colour.adaptation
colour.adaptation.chromatic_adaptation_reverse_CMCCAT2000
: (@KelSolaar)- Name:
chromatic_adaptation_inverse_CMCCAT2000
- Name:
colour.appearance
yield
based tests dependent onnosetests
have been replaced. (@MichaelMauderer)
colour.characterisation
- The following colour checkers now use ICC D50 illuminant instead of D50: (@KelSolaar)
- ColorChecker 2005
- BabelColor Average
- ColorChecker24 - Before November 2014
- ColorChecker24 - After November 2014
colour.colorimetry
colour.ASTME30815_PRACTISE_SHAPE
: (@KelSolaar)- Name:
ASTME308_PRACTISE_SHAPE
- Name:
colour.MultiSpectralDistribution
: (@KelSolaar)- Name:
MultiSpectralDistributions
- Name:
colour.multi_sds_to_XYZ
: (@KelSolaar)- Signature:
multi_sds_to_XYZ(msds, cmfs=STANDARD_OBSERVERS_CMFS['CIE 1931 2 Degree Standard Observer'].copy().trim(DEFAULT_SPECTRAL_SHAPE), illuminant=sd_ones(), k=None, method='ASTM E308-15', **kwargs)
- Signature:
colour.colorimetry.multi_sds_to_XYZ_integration
: (@KelSolaar)- Signature:
multi_sds_to_XYZ_integration(msds, cmfs=STANDARD_OBSERVERS_CMFS['CIE 1931 2 Degree Standard Observer']. copy().trim(DEFAULT_SPECTRAL_SHAPE), illuminant=sd_ones(), k=None, shape=DEFAULT_SPECTRAL_SHAPE)
- Signature:
colour.colorimetry.adjust_tristimulus_weighting_factors_ASTME30815
: (@KelSolaar)- Name:
adjust_tristimulus_weighting_factors_ASTME308
- Name:
colour.colorimetry.lagrange_coefficients_ASTME202211
: (@KelSolaar)- Name:
lagrange_coefficients_ASTME2022
- Name:
colour.colorimetry.luminance_ASTMD153508
: (@KelSolaar)- Name:
luminance_ASTMD1535
- Name:
colour.colorimetry.sd_to_XYZ_ASTME30815
: (@KelSolaar)- Name:
sd_to_XYZ_ASTME308
- Name:
colour.colorimetry.sd_to_XYZ_tristimulus_weighting_factors_ASTME30815
: (@KelSolaar)- Name:
sd_to_XYZ_tristimulus_weighting_factors_ASTME308
- Name:
colour.colorimetry.tristimulus_weighting_factors_ASTME202211
: (@KelSolaar)- Name:
tristimulus_weighting_factors_ASTME2022
- Name:
colour.continuous
colour.continuous.MultiSignal
: (@KelSolaar)- Name:
MultiSignals
- Name:
colour.io
...