def test_XYZ_to_K_ab_HunterLab1966(self): """ Test :func:`colour.models.hunter_lab.XYZ_to_K_ab_HunterLab1966` definition. """ np.testing.assert_almost_equal( XYZ_to_K_ab_HunterLab1966( np.array([0.20654008, 0.12197225, 0.05136952]) * 100), np.array([80.32152090, 14.59816495]), decimal=7, ) np.testing.assert_almost_equal( XYZ_to_K_ab_HunterLab1966( np.array([0.14222010, 0.23042768, 0.10495772]) * 100), np.array([66.65154834, 20.86664881]), decimal=7, ) np.testing.assert_almost_equal( XYZ_to_K_ab_HunterLab1966( np.array([0.07818780, 0.06157201, 0.28099326]) * 100), np.array([49.41960269, 34.14235426]), decimal=7, )
def XYZ_to_Hunter_Rdab( XYZ, XYZ_n=HUNTERLAB_ILLUMINANTS['CIE 1931 2 Degree Standard Observer'] ['D50'].XYZ_n, K_ab=HUNTERLAB_ILLUMINANTS['CIE 1931 2 Degree Standard Observer'] ['D50'].K_ab): """ Converts from *CIE XYZ* tristimulus values to *Hunter Rd,a,b* colour scale. Parameters ---------- XYZ : array_like *CIE XYZ* tristimulus values. XYZ_n : array_like, optional Reference *illuminant* tristimulus values. K_ab : array_like, optional Reference *illuminant* chromaticity coefficients, if ``K_ab`` is set to *None* it will be computed using :func:`colour.XYZ_to_K_ab_HunterLab1966`. Returns ------- ndarray *Hunter Rd,a,b* colour scale array. Notes ----- - Input *CIE XYZ* and reference *illuminant* tristimulus values are in domain [0, 100]. References ---------- - :cite:`HunterLab2012a` Examples -------- >>> import numpy as np >>> XYZ = np.array([0.07049534, 0.10080000, 0.09558313]) * 100 >>> D50 = HUNTERLAB_ILLUMINANTS[ ... 'CIE 1931 2 Degree Standard Observer']['D50'] >>> XYZ_to_Hunter_Rdab(XYZ, D50.XYZ_n, D50.K_ab) ... # doctest: +ELLIPSIS array([ 10.08 , -18.6765376..., -3.4432992...]) """ X, Y, Z = tsplit(XYZ) X_n, Y_n, Z_n = tsplit(XYZ_n) K_a, K_b = (tsplit(XYZ_to_K_ab_HunterLab1966(XYZ_n)) if K_ab is None else tsplit(K_ab)) f = 0.51 * ((21 + 0.2 * Y) / (1 + 0.2 * Y)) Y_Yn = Y / Y_n R_d = Y a_Rd = K_a * f * (X / X_n - Y_Yn) b_Rd = K_b * f * (Y_Yn - Z / Z_n) R_d_ab = tstack((R_d, a_Rd, b_Rd)) return R_d_ab
def test_n_dimensional_XYZ_to_K_ab_HunterLab1966(self): """ Tests :func:`colour.models.hunter_lab.XYZ_to_K_ab_HunterLab1966` definition n-dimensional support. """ XYZ = np.array([0.20654008, 0.12197225, 0.05136952]) * 100 K_ab = XYZ_to_K_ab_HunterLab1966(XYZ) XYZ = np.tile(XYZ, (6, 1)) K_ab = np.tile(K_ab, (6, 1)) np.testing.assert_almost_equal( XYZ_to_K_ab_HunterLab1966(XYZ), K_ab, decimal=7) XYZ = np.reshape(XYZ, (2, 3, 3)) K_ab = np.reshape(K_ab, (2, 3, 2)) np.testing.assert_almost_equal( XYZ_to_K_ab_HunterLab1966(XYZ), K_ab, decimal=7)
def test_XYZ_to_K_ab_HunterLab1966(self): """ Tests :func:`colour.models.hunter_lab.XYZ_to_K_ab_HunterLab1966` definition. """ np.testing.assert_almost_equal(XYZ_to_K_ab_HunterLab1966( np.array([0.07049534, 0.10080000, 0.09558313]) * 100), np.array([46.92561332, 19.91297447]), decimal=7) np.testing.assert_almost_equal(XYZ_to_K_ab_HunterLab1966( np.array([0.47097710, 0.34950000, 0.11301649]) * 100), np.array([121.29129933, 21.65291746]), decimal=7) np.testing.assert_almost_equal(XYZ_to_K_ab_HunterLab1966( np.array([0.25506814, 0.19150000, 0.08849752]) * 100), np.array([89.26020100, 19.16068641]), decimal=7)
def test_n_dimensional_XYZ_to_K_ab_HunterLab1966(self): """ Tests :func:`colour.models.hunter_lab.XYZ_to_K_ab_HunterLab1966` definition n-dimensions support. """ XYZ = np.array([0.07049534, 0.10080000, 0.09558313]) * 100 K_ab = 46.9256133, 19.9129745 np.testing.assert_almost_equal(XYZ_to_K_ab_HunterLab1966(XYZ), K_ab, decimal=7) XYZ = np.tile(XYZ, (6, 1)) K_ab = np.tile(K_ab, (6, 1)) np.testing.assert_almost_equal(XYZ_to_K_ab_HunterLab1966(XYZ), K_ab, decimal=7) XYZ = np.reshape(XYZ, (2, 3, 3)) K_ab = np.reshape(K_ab, (2, 3, 2)) np.testing.assert_almost_equal(XYZ_to_K_ab_HunterLab1966(XYZ), K_ab, decimal=7)
def XYZ_to_Hunter_Rdab( XYZ: ArrayLike, XYZ_n: ArrayLike = TVS_ILLUMINANTS_HUNTERLAB[ "CIE 1931 2 Degree Standard Observer"]["D65"].XYZ_n, K_ab: ArrayLike = TVS_ILLUMINANTS_HUNTERLAB[ "CIE 1931 2 Degree Standard Observer"]["D65"].K_ab, ) -> NDArray: """ Convert from *CIE XYZ* tristimulus values to *Hunter Rd,a,b* colour scale. Parameters ---------- XYZ *CIE XYZ* tristimulus values. XYZ_n Reference *illuminant* tristimulus values. K_ab Reference *illuminant* chromaticity coefficients, if ``K_ab`` is set to *None* it will be computed using :func:`colour.XYZ_to_K_ab_HunterLab1966`. Returns ------- :class:`numpy.ndarray` *Hunter Rd,a,b* colour scale array. Notes ----- +------------+------------------------+--------------------+ | **Domain** | **Scale - Reference** | **Scale - 1** | +============+========================+====================+ | ``XYZ`` | [0, 100] | [0, 1] | +------------+------------------------+--------------------+ | ``XYZ_n`` | [0, 100] | [0, 1] | +------------+------------------------+--------------------+ +------------+------------------------+--------------------+ | **Range** | **Scale - Reference** | **Scale - 1** | +============+========================+====================+ | ``R_d_ab`` | ``R_d`` : [0, 100] | ``R_d`` : [0, 1] | | | | | | | ``a_Rd`` : [-100, 100] | ``a_Rd`` : [-1, 1] | | | | | | | ``b_Rd`` : [-100, 100] | ``b_Rd`` : [-1, 1] | +------------+------------------------+--------------------+ References ---------- :cite:`HunterLab2012a` Examples -------- >>> import numpy as np >>> XYZ = np.array([0.20654008, 0.12197225, 0.05136952]) * 100 >>> D65 = TVS_ILLUMINANTS_HUNTERLAB[ ... 'CIE 1931 2 Degree Standard Observer']['D65'] >>> XYZ_to_Hunter_Rdab(XYZ, D65.XYZ_n, D65.K_ab) ... # doctest: +ELLIPSIS array([ 12.197225 ..., 57.1253787..., 17.4624134...]) """ X, Y, Z = tsplit(to_domain_100(XYZ)) X_n, Y_n, Z_n = tsplit(to_domain_100(XYZ_n)) K_a, K_b = (tsplit(XYZ_to_K_ab_HunterLab1966(XYZ_n)) if K_ab is None else tsplit(K_ab)) f = 0.51 * ((21 + 0.2 * Y) / (1 + 0.2 * Y)) Y_Yn = Y / Y_n R_d = Y a_Rd = K_a * f * (X / X_n - Y_Yn) b_Rd = K_b * f * (Y_Yn - Z / Z_n) R_d_ab = tstack([R_d, a_Rd, b_Rd]) return from_range_100(R_d_ab)
def Hunter_Rdab_to_XYZ( R_d_ab: ArrayLike, XYZ_n: ArrayLike = TVS_ILLUMINANTS_HUNTERLAB[ "CIE 1931 2 Degree Standard Observer"]["D65"].XYZ_n, K_ab: ArrayLike = TVS_ILLUMINANTS_HUNTERLAB[ "CIE 1931 2 Degree Standard Observer"]["D65"].K_ab, ) -> NDArray: """ Convert from *Hunter Rd,a,b* colour scale to *CIE XYZ* tristimulus values. Parameters ---------- R_d_ab *Hunter Rd,a,b* colour scale array. XYZ_n Reference *illuminant* tristimulus values. K_ab Reference *illuminant* chromaticity coefficients, if ``K_ab`` is set to *None* it will be computed using :func:`colour.XYZ_to_K_ab_HunterLab1966`. Returns ------- :class:`numpy.ndarray` *CIE XYZ* tristimulus values. Notes ----- +------------+------------------------+--------------------+ | **Domain** | **Scale - Reference** | **Scale - 1** | +============+========================+====================+ | ``R_d_ab`` | ``R_d`` : [0, 100] | ``R_d`` : [0, 1] | | | | | | | ``a_Rd`` : [-100, 100] | ``a_Rd`` : [-1, 1] | | | | | | | ``b_Rd`` : [-100, 100] | ``b_Rd`` : [-1, 1] | +------------+------------------------+--------------------+ | ``XYZ_n`` | [0, 100] | [0, 1] | +------------+------------------------+--------------------+ +------------+------------------------+--------------------+ | **Range** | **Scale - Reference** | **Scale - 1** | +============+========================+====================+ | ``XYZ`` | [0, 100] | [0, 1] | +------------+------------------------+--------------------+ References ---------- :cite:`HunterLab2012a` Examples -------- >>> import numpy as np >>> R_d_ab = np.array([12.19722500, 57.12537874, 17.46241341]) >>> D65 = TVS_ILLUMINANTS_HUNTERLAB[ ... 'CIE 1931 2 Degree Standard Observer']['D65'] >>> Hunter_Rdab_to_XYZ(R_d_ab, D65.XYZ_n, D65.K_ab) array([ 20.654008, 12.197225, 5.136952]) """ R_d, a_Rd, b_Rd = tsplit(to_domain_100(R_d_ab)) X_n, Y_n, Z_n = tsplit(to_domain_100(XYZ_n)) K_a, K_b = (tsplit(XYZ_to_K_ab_HunterLab1966(XYZ_n)) if K_ab is None else tsplit(K_ab)) f = 0.51 * ((21 + 0.2 * R_d) / (1 + 0.2 * R_d)) Rd_Yn = R_d / Y_n X = (a_Rd / (K_a * f) + Rd_Yn) * X_n Z = -(b_Rd / (K_b * f) - Rd_Yn) * Z_n XYZ = tstack([X, R_d, Z]) return from_range_100(XYZ)