def test_domain_range_scale_Lab_to_LCHab(self): """ Tests :func:`colour.models.cie_lab.Lab_to_LCHab` definition domain and range scale support. """ Lab = np.array([41.52787529, 52.63858304, 26.92317922]) LCHab = Lab_to_LCHab(Lab) d_r = (('reference', 1, 1), (1, 0.01, np.array([0.01, 0.01, 1 / 360])), (100, 1, np.array([1, 1, 1 / 3.6]))) for scale, factor_a, factor_b in d_r: with domain_range_scale(scale): np.testing.assert_almost_equal( Lab_to_LCHab(Lab * factor_a), LCHab * factor_b, decimal=7)
def vs_colorimetry_data(spd_test, spd_reference, spds_vs, cmfs, chromatic_adaptation=False): XYZ_t = spectral_to_XYZ(spd_test, cmfs) XYZ_t /= XYZ_t[1] XYZ_r = spectral_to_XYZ(spd_reference, cmfs) XYZ_r /= XYZ_r[1] xy_r = XYZ_to_xy(XYZ_r) vs_data = [] for _key, value in sorted(VS_INDEXES_TO_NAMES.items()): spd_vs = spds_vs.get(value) XYZ_vs = spectral_to_XYZ(spd_vs, cmfs, spd_test) XYZ_vs /= 100 if chromatic_adaptation: XYZ_vs = chromatic_adaptation_VonKries(XYZ_vs, XYZ_t, XYZ_r, transform='CMCCAT2000') Lab_vs = XYZ_to_Lab(XYZ_vs, illuminant=xy_r) _L_vs, C_vs, _Hab = Lab_to_LCHab(Lab_vs) vs_data.append(VS_ColorimetryData(spd_vs.name, XYZ_vs, Lab_vs, C_vs)) return vs_data
def test_n_dimensional_Lab_to_LCHab(self): """ Tests :func:`colour.models.cie_lab.Lab_to_LCHab` definition n-dimensional arrays support. """ Lab = np.array([41.52787529, 52.63858304, 26.92317922]) LCHab = Lab_to_LCHab(Lab) Lab = np.tile(Lab, (6, 1)) LCHab = np.tile(LCHab, (6, 1)) np.testing.assert_almost_equal(Lab_to_LCHab(Lab), LCHab, decimal=7) Lab = np.reshape(Lab, (2, 3, 3)) LCHab = np.reshape(LCHab, (2, 3, 3)) np.testing.assert_almost_equal(Lab_to_LCHab(Lab), LCHab, decimal=7)
def test_n_dimensional_Lab_to_LCHab(self): """ Tests :func:`colour.models.cie_lab.Lab_to_LCHab` definition n-dimensional arrays support. """ Lab = np.array([37.98562910, -23.62302887, -4.41417036]) LCHab = np.array([37.98562910, 24.03190365, 190.58415972]) np.testing.assert_almost_equal(Lab_to_LCHab(Lab), LCHab, decimal=7) Lab = np.tile(Lab, (6, 1)) LCHab = np.tile(LCHab, (6, 1)) np.testing.assert_almost_equal(Lab_to_LCHab(Lab), LCHab, decimal=7) Lab = np.reshape(Lab, (2, 3, 3)) LCHab = np.reshape(LCHab, (2, 3, 3)) np.testing.assert_almost_equal(Lab_to_LCHab(Lab), LCHab, decimal=7)
def test_n_dimensional_Lab_to_LCHab(self): """ Tests :func:`colour.models.cie_lab.Lab_to_LCHab` definition n-dimensional arrays support. """ Lab = np.array([37.98562910, -23.62907688, -4.41746615]) LCHab = np.array([37.98562910, 24.03845422, 190.58923377]) np.testing.assert_almost_equal(Lab_to_LCHab(Lab), LCHab, decimal=7) Lab = np.tile(Lab, (6, 1)) LCHab = np.tile(LCHab, (6, 1)) np.testing.assert_almost_equal(Lab_to_LCHab(Lab), LCHab, decimal=7) Lab = np.reshape(Lab, (2, 3, 3)) LCHab = np.reshape(LCHab, (2, 3, 3)) np.testing.assert_almost_equal(Lab_to_LCHab(Lab), LCHab, decimal=7)
def test_Lab_to_LCHab(self): """ Tests :func:`colour.models.cie_lab.Lab_to_LCHab` definition. """ np.testing.assert_almost_equal( Lab_to_LCHab(np.array([37.98562910, -23.62907688, -4.41746615])), np.array([37.98562910, 24.03845422, 190.58923377]), decimal=7) np.testing.assert_almost_equal( Lab_to_LCHab(np.array([65.70971880, 41.56438554, 37.78303554])), np.array([65.70971880, 56.17077461, 42.27159870]), decimal=7) np.testing.assert_almost_equal( Lab_to_LCHab(np.array([50.86223896, 32.76150086, 20.25483590])), np.array([50.86223896, 38.51719507, 31.72647736]), decimal=7)
def test_Lab_to_LCHab(self): """ Tests :func:`colour.models.cie_lab.Lab_to_LCHab` definition. """ np.testing.assert_almost_equal( Lab_to_LCHab(np.array([100, 0.83871284, -21.55579303])), np.array([100., 21.57210357, 272.2281935]), decimal=7) np.testing.assert_almost_equal( Lab_to_LCHab(np.array([100, 129.04406346, 406.69765889])), np.array([100., 426.67945353, 72.39590835]), decimal=7) np.testing.assert_almost_equal( Lab_to_LCHab(np.array([100, 8.32281957, -73.58297716])), np.array([100., 74.05216981, 276.45318193]), decimal=7)
def test_Lab_to_LCHab(self): """ Tests :func:`colour.models.cie_lab.Lab_to_LCHab` definition. """ np.testing.assert_almost_equal( Lab_to_LCHab(np.array([37.98562910, -23.62302887, -4.41417036])), np.array([37.98562910, 24.03190365, 190.58415972]), decimal=7) np.testing.assert_almost_equal( Lab_to_LCHab(np.array([65.70971880, 41.57577646, 37.78652063])), np.array([65.70971880, 56.18154795, 42.26641468]), decimal=7) np.testing.assert_almost_equal( Lab_to_LCHab(np.array([50.86223896, 32.77078577, 20.25804815])), np.array([50.86223896, 38.52678179, 31.7232794]), decimal=7)
def test_Lab_to_LCHab(self): """ Tests :func:`colour.models.cie_lab.Lab_to_LCHab` definition. """ np.testing.assert_almost_equal( Lab_to_LCHab(np.array([41.52787529, 52.63858304, 26.92317922])), np.array([41.52787529, 59.12425901, 27.08848784]), decimal=7) np.testing.assert_almost_equal( Lab_to_LCHab(np.array([55.11636304, -41.08791787, 30.91825778])), np.array([55.11636304, 51.42135412, 143.03889556]), decimal=7) np.testing.assert_almost_equal( Lab_to_LCHab(np.array([29.80565520, 20.01830466, -48.34913874])), np.array([29.80565520, 52.32945383, 292.49133666]), decimal=7)
def vs_colorimetry_data( sd_test: SpectralDistribution, sd_reference: SpectralDistribution, sds_vs: Dict[str, SpectralDistribution], cmfs: MultiSpectralDistributions, chromatic_adaptation: Boolean = False, ) -> Tuple[VS_ColorimetryData, ...]: """ Return the *VS test colour samples* colorimetry data. Parameters ---------- sd_test Test spectral distribution. sd_reference Reference spectral distribution. sds_vs *VS test colour samples* spectral distributions. cmfs Standard observer colour matching functions. chromatic_adaptation Whether to perform chromatic adaptation. Returns ------- :class:`tuple` *VS test colour samples* colorimetry data. """ XYZ_t = sd_to_XYZ(sd_test, cmfs) XYZ_t /= XYZ_t[1] XYZ_r = sd_to_XYZ(sd_reference, cmfs) XYZ_r /= XYZ_r[1] xy_r = XYZ_to_xy(XYZ_r) vs_data = [] for _key, value in sorted(INDEXES_TO_NAMES_VS.items()): sd_vs = sds_vs[value] with domain_range_scale("1"): XYZ_vs = sd_to_XYZ(sd_vs, cmfs, sd_test) if chromatic_adaptation: XYZ_vs = chromatic_adaptation_VonKries(XYZ_vs, XYZ_t, XYZ_r, transform="CMCCAT2000") Lab_vs = XYZ_to_Lab(XYZ_vs, illuminant=xy_r) _L_vs, C_vs, _Hab = Lab_to_LCHab(Lab_vs) vs_data.append(VS_ColorimetryData(sd_vs.name, XYZ_vs, Lab_vs, C_vs)) return tuple(vs_data)
def highlights_recovery_LCHab(RGB, threshold=None, RGB_colourspace=sRGB_COLOURSPACE): """ Performs highlights recovery in *CIE L\\*C\\*Hab* colourspace. Parameters ---------- RGB : array_like *RGB* colourspace array. threshold : numeric, optional Threshold for highlights selection, automatically computed if not given. RGB_colourspace : RGB_Colourspace, optional Working *RGB* colourspace to perform the *CIE L\\*C\\*Hab* to and from. Returns ------- ndarray Highlights recovered *RGB* colourspace array. """ L, _C, H = tsplit( Lab_to_LCHab( XYZ_to_Lab( RGB_to_XYZ(RGB, RGB_colourspace.whitepoint, RGB_colourspace.whitepoint, RGB_colourspace.RGB_to_XYZ_matrix), RGB_colourspace.whitepoint))) _L_c, C_c, _H_c = tsplit( Lab_to_LCHab( XYZ_to_Lab( RGB_to_XYZ(np.clip(RGB, 0, threshold), RGB_colourspace.whitepoint, RGB_colourspace.whitepoint, RGB_colourspace.RGB_to_XYZ_matrix), RGB_colourspace.whitepoint))) return XYZ_to_RGB( Lab_to_XYZ(LCHab_to_Lab(tstack([L, C_c, H])), RGB_colourspace.whitepoint), RGB_colourspace.whitepoint, RGB_colourspace.whitepoint, RGB_colourspace.XYZ_to_RGB_matrix)
def test_nan_Lab_to_LCHab(self): """ Tests :func:`colour.models.cie_lab.Lab_to_LCHab` definition nan support. """ cases = [-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan] cases = set(permutations(cases * 3, r=3)) for case in cases: Lab = np.array(case) Lab_to_LCHab(Lab)
def vs_colorimetry_data(sd_test, sd_reference, sds_vs, cmfs, chromatic_adaptation=False): """ Returns the *VS test colour samples* colorimetry data. Parameters ---------- sd_test : SpectralDistribution Test spectral distribution. sd_reference : SpectralDistribution Reference spectral distribution. sds_vs : dict *VS test colour samples* spectral distributions. cmfs : XYZ_ColourMatchingFunctions Standard observer colour matching functions. chromatic_adaptation : bool, optional Perform chromatic adaptation. Returns ------- list *VS test colour samples* colorimetry data. """ XYZ_t = sd_to_XYZ(sd_test, cmfs) XYZ_t /= XYZ_t[1] XYZ_r = sd_to_XYZ(sd_reference, cmfs) XYZ_r /= XYZ_r[1] xy_r = XYZ_to_xy(XYZ_r) vs_data = [] for _key, value in sorted(VS_INDEXES_TO_NAMES.items()): sd_vs = sds_vs[value] with domain_range_scale('1'): XYZ_vs = sd_to_XYZ(sd_vs, cmfs, sd_test) if chromatic_adaptation: XYZ_vs = chromatic_adaptation_VonKries(XYZ_vs, XYZ_t, XYZ_r, transform='CMCCAT2000') Lab_vs = XYZ_to_Lab(XYZ_vs, illuminant=xy_r) _L_vs, C_vs, _Hab = Lab_to_LCHab(Lab_vs) vs_data.append(VS_ColorimetryData(sd_vs.name, XYZ_vs, Lab_vs, C_vs)) return vs_data
def XYZ_to_colourspace_model(XYZ, illuminant, model, **kwargs): """ Converts from *CIE XYZ* tristimulus values to given colourspace model. Parameters ---------- XYZ : array_like *CIE XYZ* tristimulus values. illuminant : array_like *CIE XYZ* tristimulus values *illuminant* *xy* chromaticity coordinates. model : unicode **{'CIE XYZ', 'CIE xyY', 'CIE xy', 'CIE Lab', 'CIE LCHab', 'CIE Luv', 'CIE Luv uv', 'CIE LCHuv', 'CIE UCS', 'CIE UCS uv', 'CIE UVW', 'DIN 99', 'Hunter Lab', 'Hunter Rdab', 'IPT', 'JzAzBz, 'OSA UCS', 'hdr-CIELAB', 'hdr-IPT'}**, Colourspace model to convert the *CIE XYZ* tristimulus values to. Other Parameters ---------------- \\**kwargs : dict, optional Keywords arguments. Returns ------- ndarray Colourspace model values. Examples -------- >>> import numpy as np >>> XYZ = np.array([0.20654008, 0.12197225, 0.05136952]) >>> W = np.array([0.31270, 0.32900]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE XYZ') array([ 0.2065400..., 0.1219722..., 0.0513695...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE xyY') array([ 0.5436955..., 0.3210794..., 0.1219722...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE xy') array([ 0.5436955..., 0.3210794...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE Lab') array([ 0.4152787..., 0.5263858..., 0.2692317...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE LCHab') array([ 0.4152787..., 0.5912425..., 0.0752458...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE Luv') array([ 0.4152787..., 0.9683626..., 0.1775210...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE Luv uv') array([ 0.3772021..., 0.5012026...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE LCHuv') array([ 0.4152787..., 0.9844997..., 0.0288560...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE UCS uv') array([ 0.3772021..., 0.3341350...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE UVW') array([ 0.9455035..., 0.1155536..., 0.4054757...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'DIN 99') array([ 0.5322822..., 0.2841634..., 0.0389839...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'Hunter Lab') array([ 0.3492452..., 0.4703302..., 0.1439330...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'Hunter Rdab') array([ 0.1219722..., 0.5709032..., 0.1747109...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'IPT') array([ 0.3842619..., 0.3848730..., 0.1888683...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'JzAzBz') array([ 0.0053504..., 0.0092430..., 0.0052600...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'OSA UCS') array([-0.0300499..., 0.0299713..., -0.0966784...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'hdr-CIELAB') array([ 0.5187002..., 0.6047633..., 0.3214551...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'hdr-IPT') array([ 0.4839376..., 0.4244990..., 0.2201954...]) """ with domain_range_scale(1): values = None if model == 'CIE XYZ': values = XYZ elif model == 'CIE xyY': values = XYZ_to_xyY(XYZ, illuminant) elif model == 'CIE xy': values = XYZ_to_xy(XYZ, illuminant) elif model == 'CIE Lab': values = XYZ_to_Lab(XYZ, illuminant) elif model == 'CIE LCHab': values = Lab_to_LCHab(XYZ_to_Lab(XYZ, illuminant)) elif model == 'CIE Luv': values = XYZ_to_Luv(XYZ, illuminant) elif model == 'CIE Luv uv': values = Luv_to_uv(XYZ_to_Luv(XYZ, illuminant), illuminant) elif model == 'CIE LCHuv': values = Luv_to_LCHuv(XYZ_to_Luv(XYZ, illuminant)) elif model == 'CIE UCS': values = XYZ_to_UCS(XYZ) elif model == 'CIE UCS uv': values = UCS_to_uv(XYZ_to_UCS(XYZ)) elif model == 'CIE UVW': values = XYZ_to_UVW(XYZ, illuminant) elif model == 'DIN 99': values = Lab_to_DIN99(XYZ_to_Lab(XYZ, illuminant)) elif model == 'Hunter Lab': values = XYZ_to_Hunter_Lab(XYZ, xy_to_XYZ(illuminant)) elif model == 'Hunter Rdab': values = XYZ_to_Hunter_Rdab(XYZ, xy_to_XYZ(illuminant)) elif model == 'IPT': values = XYZ_to_IPT(XYZ) elif model == 'JzAzBz': values = XYZ_to_JzAzBz(XYZ) elif model == 'OSA UCS': values = XYZ_to_OSA_UCS(XYZ) elif model == 'hdr-CIELAB': values = XYZ_to_hdr_CIELab(XYZ, illuminant, **kwargs) elif model == 'hdr-IPT': values = XYZ_to_hdr_IPT(XYZ, **kwargs) if values is None: raise ValueError( '"{0}" not found in colourspace models: "{1}".'.format( model, ', '.join(COLOURSPACE_MODELS))) return values
def XYZ_to_colourspace_model(XYZ, illuminant, model, **kwargs): """ Converts from *CIE XYZ* tristimulus values to given colourspace model. Parameters ---------- XYZ : array_like *CIE XYZ* tristimulus values. illuminant : array_like Reference *illuminant* *CIE xy* chromaticity coordinates or *CIE xyY* colourspace array. model : unicode **{'CIE XYZ', 'CIE xyY', 'CIE xy', 'CIE Lab', 'CIE LCHab', 'CIE Luv', 'CIE Luv uv', 'CIE LCHuv', 'CIE UCS', 'CIE UCS uv', 'CIE UVW', 'DIN 99', 'Hunter Lab', 'Hunter Rdab', 'IPT', 'JzAzBz, 'OSA UCS', 'hdr-CIELAB', 'hdr-IPT'}**, Colourspace model to convert the *CIE XYZ* tristimulus values to. Other Parameters ---------------- \\**kwargs : dict, optional Keywords arguments. Returns ------- ndarray Colourspace model values. Warnings -------- This definition is is deprecated and will be removed in a future release. :func:`colour.convert` definition should be used instead. Examples -------- >>> import numpy as np >>> XYZ = np.array([0.20654008, 0.12197225, 0.05136952]) >>> W = np.array([0.31270, 0.32900]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE XYZ') array([ 0.2065400..., 0.1219722..., 0.0513695...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE xyY') array([ 0.5436955..., 0.3210794..., 0.1219722...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE xy') array([ 0.5436955..., 0.3210794...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE Lab') array([ 0.4152787..., 0.5263858..., 0.2692317...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE LCHab') array([ 0.4152787..., 0.5912425..., 0.0752458...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE Luv') array([ 0.4152787..., 0.9683626..., 0.1775210...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE Luv uv') array([ 0.3772021..., 0.5012026...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE LCHuv') array([ 0.4152787..., 0.9844997..., 0.0288560...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE UCS') array([ 0.1376933..., 0.1219722..., 0.1053731...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE UCS uv') array([ 0.3772021..., 0.3341350...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE UVW') array([ 0.9455035..., 0.1155536..., 0.4054757...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'DIN 99') array([ 0.5322822..., 0.2841634..., 0.0389839...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'Hunter Lab') array([ 0.3492452..., 0.4703302..., 0.1439330...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'Hunter Rdab') array([ 0.1219722..., 0.5709032..., 0.1747109...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'IPT') array([ 0.3842619..., 0.3848730..., 0.1888683...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'JzAzBz') array([ 0.0053504..., 0.0092430..., 0.0052600...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'OSA UCS') array([-0.0300499..., 0.0299713..., -0.0966784...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'hdr-CIELAB') array([ 0.5187002..., 0.6047633..., 0.3214551...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'hdr-IPT') array([ 0.4839376..., 0.4244990..., 0.2201954...]) >>> try: ... XYZ_to_colourspace_model(XYZ, W, 'Undefined') ... except ValueError as error: ... print(error) "Undefined" not found in colourspace models: "CIE XYZ, CIE xyY, CIE Lab, \ CIE LCHab, CIE Luv, CIE Luv uv, CIE LCHuv, CIE UCS, CIE UCS uv, CIE UVW, \ DIN 99, Hunter Lab, Hunter Rdab, IPT, JzAzBz, OSA UCS, hdr-CIELAB, hdr-IPT". """ from colour.models import ( Lab_to_DIN99, Lab_to_LCHab, Luv_to_LCHuv, Luv_to_uv, UCS_to_uv, XYZ_to_IPT, XYZ_to_Hunter_Lab, XYZ_to_Hunter_Rdab, XYZ_to_Lab, XYZ_to_Luv, XYZ_to_OSA_UCS, XYZ_to_UCS, XYZ_to_UVW, XYZ_to_hdr_CIELab, XYZ_to_hdr_IPT, XYZ_to_JzAzBz, XYZ_to_xy, XYZ_to_xyY, xy_to_XYZ) with domain_range_scale(1): values = None if model == 'CIE XYZ': values = XYZ elif model == 'CIE xyY': values = XYZ_to_xyY(XYZ, illuminant) elif model == 'CIE xy': values = XYZ_to_xy(XYZ, illuminant) elif model == 'CIE Lab': values = XYZ_to_Lab(XYZ, illuminant) elif model == 'CIE LCHab': values = Lab_to_LCHab(XYZ_to_Lab(XYZ, illuminant)) elif model == 'CIE Luv': values = XYZ_to_Luv(XYZ, illuminant) elif model == 'CIE Luv uv': values = Luv_to_uv(XYZ_to_Luv(XYZ, illuminant), illuminant) elif model == 'CIE LCHuv': values = Luv_to_LCHuv(XYZ_to_Luv(XYZ, illuminant)) elif model == 'CIE UCS': values = XYZ_to_UCS(XYZ) elif model == 'CIE UCS uv': values = UCS_to_uv(XYZ_to_UCS(XYZ)) elif model == 'CIE UVW': values = XYZ_to_UVW(XYZ, illuminant) elif model == 'DIN 99': values = Lab_to_DIN99(XYZ_to_Lab(XYZ, illuminant)) elif model == 'Hunter Lab': values = XYZ_to_Hunter_Lab(XYZ, xy_to_XYZ(illuminant)) elif model == 'Hunter Rdab': values = XYZ_to_Hunter_Rdab(XYZ, xy_to_XYZ(illuminant)) elif model == 'IPT': values = XYZ_to_IPT(XYZ) elif model == 'JzAzBz': values = XYZ_to_JzAzBz(XYZ) elif model == 'OSA UCS': values = XYZ_to_OSA_UCS(XYZ) elif model == 'hdr-CIELAB': values = XYZ_to_hdr_CIELab(XYZ, illuminant, **kwargs) elif model == 'hdr-IPT': values = XYZ_to_hdr_IPT(XYZ, **kwargs) if values is None: raise ValueError( '"{0}" not found in colourspace models: "{1}".'.format( model, ', '.join(COLOURSPACE_MODELS))) return values
def XYZ_to_reference_colourspace(XYZ, illuminant, reference_colourspace): """ Converts from *CIE XYZ* tristimulus values to given reference colourspace. Parameters ---------- XYZ : array_like *CIE XYZ* tristimulus values. illuminant : array_like *CIE XYZ* tristimulus values *illuminant* *xy* chromaticity coordinates. reference_colourspace : unicode **{'CIE XYZ', 'CIE xyY', 'CIE xy', 'CIE Lab', 'CIE Luv', 'CIE Luv uv', 'CIE UCS', 'CIE UCS uv', 'CIE UVW', 'IPT'}**, Reference colourspace to convert the *CIE XYZ* tristimulus values to. Returns ------- ndarray Reference colourspace values. Examples -------- >>> import numpy as np >>> XYZ = np.array([0.07049534, 0.10080000, 0.09558313]) >>> W = np.array([0.34567, 0.35850]) >>> XYZ_to_reference_colourspace( # doctest: +ELLIPSIS ... XYZ, W, 'CIE XYZ') array([ 0.0704953..., 0.1008 , 0.0955831...]) >>> XYZ_to_reference_colourspace( # doctest: +ELLIPSIS ... XYZ, W, 'CIE xyY') array([ 0.2641477..., 0.3777000..., 0.1008 ]) >>> XYZ_to_reference_colourspace( # doctest: +ELLIPSIS ... XYZ, W, 'CIE xy') array([ 0.2641477..., 0.3777000...]) >>> XYZ_to_reference_colourspace( # doctest: +ELLIPSIS ... XYZ, W, 'CIE Lab') array([-23.6230288..., -4.4141703..., 37.9856291...]) >>> XYZ_to_reference_colourspace( # doctest: +ELLIPSIS ... XYZ, W, 'CIE LCHab') array([ 24.0319036..., 190.5841597..., 37.9856291...]) >>> XYZ_to_reference_colourspace( # doctest: +ELLIPSIS ... XYZ, W, 'CIE Luv') array([-28.7922944..., -1.3558195..., 37.9856291...]) >>> XYZ_to_reference_colourspace( # doctest: +ELLIPSIS ... XYZ, W, 'CIE Luv uv') array([ 0.1508531..., 0.4853297...]) >>> XYZ_to_reference_colourspace( # doctest: +ELLIPSIS ... XYZ, W, 'CIE LCHuv') array([ 28.82419932, 182.69604747, 37.9856291 ]) >>> XYZ_to_reference_colourspace( # doctest: +ELLIPSIS ... XYZ, W, 'CIE UCS uv') array([ 0.1508531..., 0.32355314...]) >>> XYZ_to_reference_colourspace( # doctest: +ELLIPSIS ... XYZ, W, 'CIE UVW') array([-28.0483277..., -0.8805242..., 37.0041149...]) >>> XYZ_to_reference_colourspace( # doctest: +ELLIPSIS ... XYZ, W, 'IPT') array([-0.1111479..., 0.0159474..., 0.3657112...]) """ value = None if reference_colourspace == 'CIE XYZ': value = XYZ if reference_colourspace == 'CIE xyY': value = XYZ_to_xyY(XYZ, illuminant) if reference_colourspace == 'CIE xy': # Used for Chromaticity Diagram. value = XYZ_to_xy(XYZ, illuminant) if reference_colourspace == 'CIE Lab': L, a, b = tsplit(XYZ_to_Lab(XYZ, illuminant)) value = tstack((a, b, L)) if reference_colourspace == 'CIE LCHab': L, CH, ab = tsplit(Lab_to_LCHab(XYZ_to_Lab(XYZ, illuminant))) value = tstack((CH, ab, L)) if reference_colourspace == 'CIE Luv': L, u, v = tsplit(XYZ_to_Luv(XYZ, illuminant)) value = tstack((u, v, L)) if reference_colourspace == 'CIE Luv uv': # Used for Chromaticity Diagram. u, v = tsplit(Luv_to_uv(XYZ_to_Luv(XYZ, illuminant), illuminant)) value = tstack((u, v)) if reference_colourspace == 'CIE LCHuv': L, CH, uv = tsplit(Luv_to_LCHuv(XYZ_to_Luv(XYZ, illuminant))) value = tstack((CH, uv, L)) if reference_colourspace == 'CIE UCS': value = XYZ_to_UCS(XYZ) if reference_colourspace == 'CIE UCS uv': # Used for Chromaticity Diagram. u, v = tsplit(UCS_to_uv(XYZ_to_UCS(XYZ))) value = tstack((u, v)) if reference_colourspace == 'CIE UVW': value = XYZ_to_UVW(XYZ * 100, illuminant) if reference_colourspace == 'IPT': I, P, T = tsplit(XYZ_to_IPT(XYZ)) value = tstack((P, T, I)) if value is None: raise ValueError(('"{0}" not found in reference colourspace models: ' '"{1}".').format(reference_colourspace, ', '.join(REFERENCE_COLOURSPACES))) return value
def XYZ_to_colourspace_model(XYZ, illuminant, model): """ Converts from *CIE XYZ* tristimulus values to given colourspace model. Parameters ---------- XYZ : array_like *CIE XYZ* tristimulus values. illuminant : array_like *CIE XYZ* tristimulus values *illuminant* *xy* chromaticity coordinates. model : unicode **{'CIE XYZ', 'CIE xyY', 'CIE xy', 'CIE Lab', 'CIE LCHab', 'CIE Luv', 'CIE Luv uv', 'CIE LCHuv', 'CIE UCS', 'CIE UCS uv', 'CIE UVW', 'IPT', 'Hunter Lab', 'Hunter Rdab'}**, Colourspace model to convert the *CIE XYZ* tristimulus values to. Returns ------- ndarray Colourspace model values. Examples -------- >>> import numpy as np >>> XYZ = np.array([0.07049534, 0.10080000, 0.09558313]) >>> W = np.array([0.34570, 0.35850]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE XYZ') array([ 0.0704953..., 0.1008 , 0.0955831...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE xyY') array([ 0.2641477..., 0.3777000..., 0.1008 ]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE xy') array([ 0.2641477..., 0.3777000...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE Lab') array([ 37.9856291..., -23.6290768..., -4.4174661...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE LCHab') array([ 37.9856291..., 24.0384542..., 190.5892337...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE Luv') array([ 37.9856291..., -28.8021959..., -1.3580070...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE Luv uv') array([ 0.1508531..., 0.4853297...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE LCHuv') array([ 37.9856291..., 28.8341927..., 182.6994640...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE UCS uv') array([ 0.1508531..., 0.32355314...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'CIE UVW') array([-28.0579733..., -0.8819449..., 37.0041149...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'IPT') array([ 0.3657112..., -0.1111479..., 0.0159474...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'Hunter Lab') array([ 31.7490157..., -15.1351736..., -2.7709606...]) >>> XYZ_to_colourspace_model( # doctest: +ELLIPSIS ... XYZ, W, 'Hunter Rdab') array([ 10.08..., -18.7019271..., -3.4239649...]) """ values = None if model == 'CIE XYZ': values = XYZ elif model == 'CIE xyY': values = XYZ_to_xyY(XYZ, illuminant) elif model == 'CIE xy': values = XYZ_to_xy(XYZ, illuminant) elif model == 'CIE Lab': values = XYZ_to_Lab(XYZ, illuminant) elif model == 'CIE LCHab': values = Lab_to_LCHab(XYZ_to_Lab(XYZ, illuminant)) elif model == 'CIE Luv': values = XYZ_to_Luv(XYZ, illuminant) elif model == 'CIE Luv uv': values = Luv_to_uv(XYZ_to_Luv(XYZ, illuminant), illuminant) elif model == 'CIE LCHuv': values = Luv_to_LCHuv(XYZ_to_Luv(XYZ, illuminant)) elif model == 'CIE UCS': values = XYZ_to_UCS(XYZ) elif model == 'CIE UCS uv': values = UCS_to_uv(XYZ_to_UCS(XYZ)) elif model == 'CIE UVW': values = XYZ_to_UVW(XYZ * 100, illuminant) elif model == 'IPT': values = XYZ_to_IPT(XYZ) elif model == 'Hunter Lab': values = XYZ_to_Hunter_Lab(XYZ * 100, xy_to_XYZ(illuminant) * 100) elif model == 'Hunter Rdab': values = XYZ_to_Hunter_Rdab(XYZ * 100, xy_to_XYZ(illuminant) * 100) if values is None: raise ValueError( '"{0}" not found in colourspace models: "{1}".'.format( model, ', '.join(COLOURSPACE_MODELS))) return values