colour.RGB_to_YCbCr#
- colour.RGB_to_YCbCr(RGB: ArrayLike, K: NDArrayFloat = WEIGHTS_YCBCR['ITU-R BT.709'], in_bits: int = 10, in_legal: bool = False, in_int: bool = False, out_bits: int = 8, out_legal: bool = True, out_int: bool = False, clamp_int: bool = True, **kwargs: Any) NDArrayReal [source]#
Convert an array of R’G’B’ values to the corresponding Y’CbCr colour encoding values array.
- Parameters:
RGB (ArrayLike) – Input R’G’B’ array of floats or int values.
K (NDArrayFloat) – Luma weighting coefficients of red and blue. See
colour.WEIGHTS_YCBCR
for presets. Default is (0.2126, 0.0722), the weightings for ITU-R BT.709.in_bits (int) – Bit-depth for int input, or used in the calculation of the denominator for legal range float values, i.e., 8-bit means the float value for legal white is 235 / 255. Default is 10.
in_legal (bool) – Whether to treat the input values as legal range. Default is False.
in_int (bool) – Whether to treat the input values as
in_bits
int code values. Default is False.out_bits (int) – Bit-depth for int output, or used in the calculation of the denominator for legal range float values, i.e., 8-bit means the float value for legal white is 235 / 255. Ignored if
out_legal
andout_int
are both False. Default is 8.out_legal (bool) – Whether to return legal range values. Default is True.
out_int (bool) – Whether to return values as
out_bits
int code values. Default is False.clamp_int (bool) – Whether to clamp int output to allowable range for
out_bits
. Default is True.in_range – Array overriding the computed range such as in_range = (RGB_min, RGB_max). If
in_range
is undefined, RGB_min and RGB_max will be computed usingcolour.CV_range()
definition.out_range – Array overriding the computed range such as out_range = (Y_min, Y_max, C_min, C_max)`. If ``out_range`` is undefined, *Y_min, Y_max, C_min and C_max will be computed using
colour.models.rgb.ycbcr.ranges_YCbCr()
definition.kwargs (Any)
- Returns:
Y’CbCr colour encoding array of int or float values.
- Return type:
Warning
For Recommendation ITU-R BT.2020,
colour.RGB_to_YCbCr()
definition is only applicable to the non-constant luminance implementation.colour.RGB_to_YcCbcCrc()
definition should be used for the constant luminance case as per [InternationalTUnion15a].Notes
Domain *
Scale - Reference
Scale - 1
RGB
[0, 1]
[0, 1]
Range *
Scale - Reference
Scale - 1
YCbCr
[0, 1]
[0, 1]
* This definition has input and output int switches, thus the domain-range scale information is only given for the floating point mode.
The default arguments,
**{'in_bits': 10, 'in_legal': False, 'in_int': False, 'out_bits': 8, 'out_legal': True, 'out_int': False}
transform a float R’G’B’ input array normalised to domain [0, 1] (in_bits
is ignored) to a float Y’CbCr output array where Y’ is normalised to range [16 / 255, 235 / 255] and Cb and Cr are normalised to range [16 / 255, 240./255]. The float values are calculated based on an [0, 255] int range, but no 8-bit quantisation or clamping are performed.
References
[InternationalTUnion11c], [InternationalTUnion15b], [SocietyoMPaTEngineers99], [Wikipedia04e]
Examples
>>> RGB = np.array([1.0, 1.0, 1.0]) >>> RGB_to_YCbCr(RGB) array([ 0.9215686..., 0.5019607..., 0.5019607...])
Matching the float output of The Foundry Nuke’s Colorspace node set to YCbCr:
>>> RGB_to_YCbCr(RGB, out_range=(16 / 255, 235 / 255, 15.5 / 255, 239.5 / 255)) ... array([ 0.9215686..., 0.5 , 0.5 ])
Matching the float output of The Foundry Nuke’s Colorspace node set to YPbPr:
>>> RGB_to_YCbCr(RGB, out_legal=False, out_int=False) ... array([ 1., 0., 0.])
Creating int code values as per standard 10-bit SDI:
>>> RGB_to_YCbCr(RGB, out_legal=True, out_bits=10, out_int=True) ... array([940, 512, 512]...)
For JFIF JPEG conversion as per Recommendation ITU-T T.871
>>> RGB = np.array([102, 0, 51]) >>> RGB_to_YCbCr( ... RGB, ... K=WEIGHTS_YCBCR["ITU-R BT.601"], ... in_range=(0, 255), ... out_range=(0, 255, 0.5, 255.5), ... out_int=True, ... ) ... array([ 36, 136, 175]...)
Note the use of [0.5, 255.5] for the Cb / Cr range, which is required so that the Cb and Cr output is centered about 128. Using 255 centres it about 127.5, meaning that there is no int code value to represent achromatic colours. This does however create the possibility of output int codes with value of 256, which cannot be stored in 8-bit int representation. Recommendation ITU-T T.871 specifies these should be clamped to 255, which is applied with the default
clamp_int=True
.These JFIF JPEG ranges are also obtained as follows:
>>> RGB_to_YCbCr( ... RGB, ... K=WEIGHTS_YCBCR["ITU-R BT.601"], ... in_bits=8, ... in_int=True, ... out_legal=False, ... out_int=True, ... ) ... array([ 36, 136, 175]...)