Skip to content

Releases: colour-science/colour

Colour 0.4.6

11 Oct 05:41
Compare
Choose a tag to compare

Colour 0.4.6 - Alpha Milestone

Fixes

Dependencies

colour.models

Colour 0.4.5

10 Oct 07:46
Compare
Choose a tag to compare

Colour 0.4.5 - Alpha Milestone

Features

Dependencies

The following scientific packages minimum versions are required:

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 and colour.adaptation.chromatic_adaptation_vK20 definitions. (#1131, @KelSolaar)

colour.characterisation

  • Add the ColorChecker SG chromaticity coordinates with the colour.CCS_COLOURCHECKERS["ColorCheckerSG - Before November 2014"] and colour.CCS_COLOURCHECKERS["ColorCheckerSG - After November 2014"] attribute keys.

image
image

colour.colorimetry

  • Use shape if passed, to also reshape the colour.continuous.AbstractContinuousSignal sub-classes in colour.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")

image

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 to colour.sd_to_XYZ definition using the ASTM E308 method. (20fb963, @KelSolaar, @gul916)

colour.io

colour.models

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

17 Dec 03:36
Compare
Choose a tag to compare

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

colour.models

  • Implement support for Apple Log Profile with colour.models.log_encoding_AppleLogProfile and colour.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

colour.utilities

  • Fix issue in colour.utilities.verbose.multiline_repr definition when an attribute representation is None. (#1466, @KelSolaar)

Changes

Unit Tests

  • We have changed our unit tests to use np.testing.assert_allclose rather than np.testing.assert_array_almost_equal to help with tests failing on Github Actions because of minor precision issues when using pytest-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

26 Aug 09:43
Compare
Choose a tag to compare

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:

Features

colour.characterisation

  • Add TE226 V2 colour checker reference values. (#1113, #901, @Rusching)
  • Add colour.apply_matrix_colour_correction definition and colour.APPLY_MATRIX_COLOUR_CORRECTION_METHODS attribute to conveniently apply a colour-correction matrix computed with the colour.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 and colour.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 and colour.Yrg_to_XYZ definitions. (#1152, @KelSolaar)
  • Implement support for Fujifilm F-Log2 encodings with colour.models.log_decoding_FLog2 and colour.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 and colour.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 and colour.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 to colour.plotting.temperature.plot_planckian_locus definition. (@KelSolaar)

image

colour.temperature

  • Add colour.temperature.mired_to_CCT and colour.temperature.CCT_to_mired definitions to perform micro reciprocal degree and CCT conversions. (#1114, @KelSolaar)
  • Add colour.temperature.XYZ_to_CCT_Ohno2013 and colour.temperature.CCT_to_XYZ_Ohno2013 convenient definitions. (#1120, @tjdcs)

colour.utilities

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

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

colour.models

  • Implement various minor corrections from Sarifuddin (2021) to colour.RGB_to_HCL definition. (1a580ef, @KelSolaar)

colour.phenomena

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 the colour.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 and colour.XYZ_to_xyY definitions do no return the parameter illuminant chromaticities when the luminance Y 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
Read more

Colour 0.4.2

29 Nov 09:42
Compare
Choose a tag to compare

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:

Features

colour.appearance

  • Implement support for Hellwig and Fairchild (2022) colour appearance model with colour.XYZ_to_Hellwig2022 and colour.Hellwig2022_to_XYZ definitions. (#972 @KelSolaar)
  • Implement support for CIECAM16 colour appearance model with colour.XYZ_to_CIECAM16 and colour.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

colour.models

  • Implement support for Munish Ragoo and Farup (2021) Optimised IPT colourspace with colour.XYZ_to_IPT_Munish2021 and colour.IPT_Munish2021_to_XYZ definitions. (#990, @KelSolaar)

  • Implement support for Leica L-Log log encodings with colour.models.log_encoding_LLog and colour.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 and colour.MATRIX_COEFFICIENTS_ITUTH273 attributes and colour.models.describe_video_signal_colour_primaries, colour.models.describe_video_signal_transfer_characteristics and colour.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 and colour.models.log_encoding_ARRILogC4 and colour.models.log_decoding_ARRILogC4 definitions. (#1056, @KelSolaar)

    For consistency:

    • The colour.models.RGB_COLOURSPACE_ALEXA_WIDE_GAMUT attribute has been renamed to RGB_COLOURSPACE_ARRI_WIDE_GAMUT_3.
    • The colour.models.log_encoding_ALEXALogC and colour.models.log_decoding_ALEXALogC definitions have been renamed to log_encoding_ARRILogC3 and log_decoding_ARRILogC3 respectively.
    • Keys in the various mappings, e.g. colour.RGB_COLOURSPACES, colour.LOG_ENCODINGS, have been renamed accordingly.

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)

Camera RGB Sensitivities Recovery

colour.utilities

  • The colour.utilities.CanonicalMapping and colour.utilities.LazyCanonicalMapping, fomerly colour.utilities.CaseInsensitiveMapping and colour.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 the colour.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 ...

Read more

Colour 0.4.1

25 Feb 23:23
Compare
Choose a tag to compare

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

Distribution

colour.colorimetry

  • Fix intersection filtering in colour.colorimetry.closest_spectral_locus_wavelength definition. (@KelSolaar, @sobotka)

Colour 0.4.0

20 Feb 07:02
Compare
Choose a tag to compare

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.

Thanks again to all the contributors to this release!

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 and colour.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 with np.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 and colour.Kim2009_to_XYZ definitions. (@villirion, @KelSolaar)

  • Implement support for ZCAM colour appearance model with the colour.XYZ_to_ZCAM and colour.ZCAM_to_XYZ definitions. (@KelSolaar)
  • Implement support for Helmholtz-Kohlrausch effect estimation with colour.HelmholtzKohlrausch_effect_object_Nayatani1997 and colour.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 dict KeysView class instances can be passed as domain to colour.SpectralDistribution and colour.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 to colour.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 and colour.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 and colour.LUT3D.invert methods. (@njwardhan, @KelSolaar)

GSoC - 2021

  • Implement support for UPRTek and Sekonic spectral data parsers with the colour.SpectralDistribution_UPRTek and colour.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 and colour.io.write_LUT_SonySPImtx definitions and colour.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 and colour.IHLS_to_RGB definitions. (@SGeetansh, @KelSolaar)
  • Implement support for DIN99b, DIN99c, and DIN99d refined formulas in colour.Lab_to_DIN99 and colour.DIN99_to_Lab definitions. (@SGeetansh)
  • Implement support for ProLab colourspace with colour.ProLab_to_XYZ and colour.XYZ_to_ProLab definitions. (@SGeetansh, @KelSolaar)

  • Implement support for Sarifuddin and Missaoui (2005) HCL colourspace with colour.RGB_to_HCL and colour.HCL_to_RGB definitions. (@Saransh-cpp, @KelSolaar)
  • Implement wrapper colour.XYZ_to_ICTCP and colour.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 and colour.offset_YCbCr definitions. (@KelSolaar, @nick-shaw)
  • Implement support for Oklab colour model with colour.XYZ_to_Oklab and colour.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 and colour.models.log_encoding_NLOG and colour.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 and colour.models.oetf_inverse_BlackmagicFilmGeneration5 definitions. (@KelSolaar)
  • Implement support for *DaVinci Inte...
Read more

Colour 0.3.16

27 Nov 09:14
Compare
Choose a tag to compare

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 and colour.SDS_FILTERScontaining 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 and colour.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 and colour.models.log_decoding_Log2 log encoding and decoding definitions. (@njwardhan, @KelSolaar)
  • Add colour.models.exponent_function_basic and colour.models.exponent_function_monitor_curve definitions. (@njwardhan)
  • Add colour.models.logarithmic_function_basic, colour.models.logarithmic_function_quasilog and colour.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 and colour.IGPGTG_to_XYZ definitions. (@KelSolaar)
  • Implement support for DaVinci Wide Gamut colourspace. (@KelSolaar)

colour.plotting

image
image
image

  • Implement support for RGB colourspaces chromatic adaptation in various plotting routines: (@KelSolaar)

image
image

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 the COLOUR_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 the colour.utilities.metric_mse and colour.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 and colour.MultiSpectralDistributions.interpolate methods did not honour the instantiation time interpolation class and were forcibly using either the colour.SpragueInterpolator or colour.CubicSplineInterpolator classes unless an interpolator argument was passed. This behaviour was not desirable and was changed so that if the instantiation time interpolation class is not one of colour.SpragueInterpolator or colour.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 underlying colour.plotting.diagrams.plot_spectral_locus and colour.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 incorrect style argument. (@sianyi)

C...

Read more

Colour 0.3.15

25 Jan 05:18
Compare
Choose a tag to compare

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

Fixes

colour

Various fixes have been implemented to ensure compatibility with Python 3.8 and Numpy 1.18. (@KelSolaar, @MaxSchambach, @mzszym)

colour.io

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 with 10e4. (@OlliNiemitalo)

Changes

colour.algebra

  • colour.algebra.cartesian_to_spherical and colour.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)
  • 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.

colour.plotting

  • colour.plotting.common.wrap_title: (@KelSolaar)
    • Remove

Colour 0.3.14

26 Oct 10:06
Compare
Choose a tag to compare

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:

image

Hacktoberfest - 2019

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 a colour.CorrespondingColourDataset class instance as argument. (@KelSolaar)

colour.io

  • The colour.read_image and colour.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])

image

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 with colour.models.log_encoding_FLog and colour.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 with colour.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')

image

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 the additional_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

colour.appearance

  • yield based tests dependent on nosetests 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
  • colour.MultiSpectralDistribution: (@KelSolaar)
    • Name: MultiSpectralDistributions
  • 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)
  • 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)
  • colour.colorimetry.adjust_tristimulus_weighting_factors_ASTME30815: (@KelSolaar)
    • Name: adjust_tristimulus_weighting_factors_ASTME308
  • colour.colorimetry.lagrange_coefficients_ASTME202211: (@KelSolaar)
    • Name: lagrange_coefficients_ASTME2022
  • colour.colorimetry.luminance_ASTMD153508: (@KelSolaar)
    • Name: luminance_ASTMD1535
  • colour.colorimetry.sd_to_XYZ_ASTME30815: (@KelSolaar)
    • Name: sd_to_XYZ_ASTME308
  • colour.colorimetry.sd_to_XYZ_tristimulus_weighting_factors_ASTME30815: (@KelSolaar)
    • Name: sd_to_XYZ_tristimulus_weighting_factors_ASTME308
  • colour.colorimetry.tristimulus_weighting_factors_ASTME202211: (@KelSolaar)
    • Name: tristimulus_weighting_factors_ASTME2022

colour.continuous

  • colour.continuous.MultiSignal: (@KelSolaar)
    • Name: MultiSignals

colour.io

...

Read more