Correlated Color Temperature
New 2.4
Correlated color temperature (CCT) is a measurement of the average hue of light as it appears to the eye. It is expressed as the temperature (in Kelvins) something would need to be heated to glow at approximately the same color.
This response can be modeled with a Planckian or black body locus/curve and is often shown in chromaticity diagrams.
In order to calculate the Planckian locus, color matching functions (CMFs) are needed. The CMFs are obtained from a series of experiments in which subjects set the intensities of three colors required to match a series of monochromatic (single wavelength) lights of equal energy that traverse the visible spectrum. CMFs contain the required data from such experiments and can be used to calculate a number of things, including the Planckian locus.
CMFs
It should be noted that there isn't one set of CMFs. Over the years there have been multiple attempts to come up with the best CMFs and often done at both 2˚ and 10˚ viewing angles. ColorAide only provides CMFS provided by the CIE via coloraide.cmfs
, the CIE 1931 2 Degree Standard Observer being the default as it is still the common approach even though better CMFs have been provided.
CMFS |
---|
coloraide.cmfs.CIE_1931_2DEG |
coloraide.cmfs.CIE_1964_10DEG |
coloraide.cmfs.CIE_2015_2DEG |
coloraide.cmfs.CIE_2015_10DEG |
External CMFs could be used as long as they are in the appropriate format and not at increments less than 1nm.
CCT
When anything gets warm enough it will start to give off light, and the hotter it gets, the more energetic the light is. As an object increases in temperature, it will shift from the red end of the spectrum to the blue end.
ColorAide provides the blackbody()
method to generate colors along the black body curve. Simply give it a color space in which the color should be generated and a temperature in Kelvin and ColorAide will return an approximate color along the black body locus.
>>> Steps([Color.blackbody('srgb', t) for t in range(1000, 15000, 50)])
[color(srgb 1 0.18142 0 / 1), color(srgb 1 0.22157 0 / 1), color(srgb 1 0.25489 0 / 1), color(srgb 1 0.28375 0 / 1), color(srgb 1 0.3093 0 / 1), color(srgb 1 0.33241 0 / 1), color(srgb 1 0.35347 0 / 1), color(srgb 1 0.3729 0 / 1), color(srgb 1 0.39084 0 / 1), color(srgb 1 0.40753 0 / 1), color(srgb 1 0.42314 0 / 1), color(srgb 1 0.43781 0 / 1), color(srgb 1 0.45159 0 / 1), color(srgb 1 0.46445 0 / 1), color(srgb 1 0.47663 0 / 1), color(srgb 1 0.48821 0 / 1), color(srgb 1 0.49913 0 / 1), color(srgb 1 0.50946 0 / 1), color(srgb 1 0.5194 0.00025 / 1), color(srgb 1 0.53171 0.05099 / 1), color(srgb 1 0.54362 0.08665 / 1), color(srgb 1 0.55508 0.11675 / 1), color(srgb 1 0.56621 0.14078 / 1), color(srgb 1 0.57692 0.16381 / 1), color(srgb 1 0.58734 0.18409 / 1), color(srgb 1 0.59742 0.20351 / 1), color(srgb 1 0.60722 0.22203 / 1), color(srgb 1 0.6168 0.23892 / 1), color(srgb 1 0.62597 0.25645 / 1), color(srgb 1 0.63495 0.27277 / 1), color(srgb 1 0.64376 0.28801 / 1), color(srgb 1 0.65219 0.30409 / 1), color(srgb 1 0.66048 0.3192 / 1), color(srgb 1 0.66862 0.33348 / 1), color(srgb 1 0.67644 0.34807 / 1), color(srgb 1 0.68406 0.36243 / 1), color(srgb 1 0.69155 0.37611 / 1), color(srgb 1 0.69892 0.38918 / 1), color(srgb 1 0.70597 0.40288 / 1), color(srgb 1 0.71288 0.41619 / 1), color(srgb 1 0.71969 0.42897 / 1), color(srgb 1 0.7264 0.44127 / 1), color(srgb 1 0.73289 0.45367 / 1), color(srgb 1 0.73912 0.46623 / 1), color(srgb 1 0.74528 0.47835 / 1), color(srgb 1 0.75136 0.49007 / 1), color(srgb 1 0.75737 0.50143 / 1), color(srgb 1 0.7632 0.51278 / 1), color(srgb 1 0.76876 0.52444 / 1), color(srgb 1 0.77426 0.53576 / 1), color(srgb 1 0.7797 0.54675 / 1), color(srgb 1 0.78508 0.55745 / 1), color(srgb 1 0.79039 0.56787 / 1), color(srgb 1 0.79556 0.57824 / 1), color(srgb 1 0.80043 0.58891 / 1), color(srgb 1 0.80525 0.59931 / 1), color(srgb 1 0.81002 0.60946 / 1), color(srgb 1 0.81474 0.61937 / 1), color(srgb 1 0.81941 0.62905 / 1), color(srgb 1 0.82404 0.63852 / 1), color(srgb 1 0.82862 0.64778 / 1), color(srgb 1 0.83282 0.65746 / 1), color(srgb 1 0.83698 0.66693 / 1), color(srgb 1 0.8411 0.6762 / 1), color(srgb 1 0.84518 0.68528 / 1), color(srgb 1 0.84923 0.69418 / 1), color(srgb 1 0.85323 0.7029 / 1), color(srgb 1 0.8572 0.71145 / 1), color(srgb 1 0.86113 0.71985 / 1), color(srgb 1 0.86499 0.72814 / 1), color(srgb 1 0.86851 0.73667 / 1), color(srgb 1 0.87201 0.74505 / 1), color(srgb 1 0.87547 0.75327 / 1), color(srgb 1 0.8789 0.76134 / 1), color(srgb 1 0.88231 0.76927 / 1), color(srgb 1 0.88568 0.77707 / 1), color(srgb 1 0.88902 0.78474 / 1), color(srgb 1 0.89233 0.79228 / 1), color(srgb 1 0.89561 0.7997 / 1), color(srgb 1 0.89887 0.80701 / 1), color(srgb 1 0.9021 0.8142 / 1), color(srgb 1 0.90496 0.82155 / 1), color(srgb 1 0.9078 0.82879 / 1), color(srgb 1 0.91062 0.83591 / 1), color(srgb 1 0.91341 0.84293 / 1), color(srgb 1 0.91618 0.84983 / 1), color(srgb 1 0.91892 0.85664 / 1), color(srgb 1 0.92165 0.86334 / 1), color(srgb 1 0.92435 0.86995 / 1), color(srgb 1 0.92702 0.87646 / 1), color(srgb 1 0.92968 0.88288 / 1), color(srgb 1 0.93231 0.88921 / 1), color(srgb 1 0.93492 0.89545 / 1), color(srgb 1 0.93751 0.90161 / 1), color(srgb 1 0.94008 0.90769 / 1), color(srgb 1 0.94242 0.91377 / 1), color(srgb 1 0.94464 0.9198 / 1), color(srgb 1 0.94685 0.92575 / 1), color(srgb 1 0.94904 0.93162 / 1), color(srgb 1 0.95121 0.9374 / 1), color(srgb 1 0.95337 0.94312 / 1), color(srgb 1 0.9555 0.94876 / 1), color(srgb 1 0.95762 0.95432 / 1), color(srgb 1 0.95973 0.95982 / 1), color(srgb 1 0.96181 0.96525 / 1), color(srgb 1 0.96388 0.97061 / 1), color(srgb 1 0.96594 0.97591 / 1), color(srgb 1 0.96798 0.98114 / 1), color(srgb 1 0.97 0.98631 / 1), color(srgb 1 0.972 0.99142 / 1), color(srgb 1 0.974 0.99646 / 1), color(srgb 0.99855 0.97455 1 / 1), color(srgb 0.99365 0.97172 1 / 1), color(srgb 0.98885 0.96895 1 / 1), color(srgb 0.98416 0.96606 1 / 1), color(srgb 0.97956 0.96315 1 / 1), color(srgb 0.97506 0.96031 1 / 1), color(srgb 0.97065 0.95752 1 / 1), color(srgb 0.96632 0.9548 1 / 1), color(srgb 0.96208 0.95214 1 / 1), color(srgb 0.95793 0.94954 1 / 1), color(srgb 0.95385 0.94699 1 / 1), color(srgb 0.94985 0.94449 1 / 1), color(srgb 0.94593 0.94205 1 / 1), color(srgb 0.94207 0.93966 1 / 1), color(srgb 0.93829 0.93731 1 / 1), color(srgb 0.93458 0.93502 1 / 1), color(srgb 0.93094 0.93277 1 / 1), color(srgb 0.92735 0.93056 1 / 1), color(srgb 0.92384 0.9284 1 / 1), color(srgb 0.92038 0.92627 1 / 1), color(srgb 0.91698 0.92419 1 / 1), color(srgb 0.91364 0.92215 1 / 1), color(srgb 0.91036 0.92015 1 / 1), color(srgb 0.90713 0.91818 1 / 1), color(srgb 0.90395 0.91625 1 / 1), color(srgb 0.90083 0.91435 1 / 1), color(srgb 0.89776 0.91249 1 / 1), color(srgb 0.89474 0.91066 1 / 1), color(srgb 0.89176 0.90887 1 / 1), color(srgb 0.88883 0.9071 1 / 1), color(srgb 0.88604 0.90525 1 / 1), color(srgb 0.88329 0.90342 1 / 1), color(srgb 0.88058 0.90163 1 / 1), color(srgb 0.87791 0.89987 1 / 1), color(srgb 0.87529 0.89814 1 / 1), color(srgb 0.8727 0.89644 1 / 1), color(srgb 0.87016 0.89476 1 / 1), color(srgb 0.86765 0.89312 1 / 1), color(srgb 0.86518 0.8915 1 / 1), color(srgb 0.86274 0.8899 1 / 1), color(srgb 0.86035 0.88833 1 / 1), color(srgb 0.85798 0.88679 1 / 1), color(srgb 0.85565 0.88527 1 / 1), color(srgb 0.85336 0.88377 1 / 1), color(srgb 0.8511 0.8823 1 / 1), color(srgb 0.84886 0.88085 1 / 1), color(srgb 0.84666 0.87942 1 / 1), color(srgb 0.84449 0.87802 1 / 1), color(srgb 0.84235 0.87663 1 / 1), color(srgb 0.84024 0.87527 1 / 1), color(srgb 0.83816 0.87392 1 / 1), color(srgb 0.83611 0.8726 1 / 1), color(srgb 0.83408 0.87129 1 / 1), color(srgb 0.83208 0.87 1 / 1), color(srgb 0.8301 0.86873 1 / 1), color(srgb 0.82816 0.86748 1 / 1), color(srgb 0.82623 0.86625 1 / 1), color(srgb 0.82433 0.86504 1 / 1), color(srgb 0.82246 0.86384 1 / 1), color(srgb 0.82061 0.86265 1 / 1), color(srgb 0.81878 0.86149 1 / 1), color(srgb 0.81698 0.86034 1 / 1), color(srgb 0.8152 0.8592 1 / 1), color(srgb 0.81343 0.85808 1 / 1), color(srgb 0.8117 0.85698 1 / 1), color(srgb 0.80998 0.85589 1 / 1), color(srgb 0.80828 0.85481 1 / 1), color(srgb 0.8066 0.85375 1 / 1), color(srgb 0.80495 0.8527 1 / 1), color(srgb 0.80331 0.85167 1 / 1), color(srgb 0.80176 0.85062 1 / 1), color(srgb 0.80022 0.84959 1 / 1), color(srgb 0.79871 0.84857 1 / 1), color(srgb 0.79721 0.84756 1 / 1), color(srgb 0.79573 0.84656 1 / 1), color(srgb 0.79426 0.84558 1 / 1), color(srgb 0.79282 0.84461 1 / 1), color(srgb 0.79139 0.84365 1 / 1), color(srgb 0.78997 0.8427 1 / 1), color(srgb 0.78857 0.84177 1 / 1), color(srgb 0.78719 0.84084 1 / 1), color(srgb 0.78582 0.83993 1 / 1), color(srgb 0.78447 0.83902 1 / 1), color(srgb 0.78313 0.83813 1 / 1), color(srgb 0.7818 0.83725 1 / 1), color(srgb 0.78049 0.83638 1 / 1), color(srgb 0.7792 0.83552 1 / 1), color(srgb 0.77792 0.83466 1 / 1), color(srgb 0.77665 0.83382 1 / 1), color(srgb 0.77539 0.83299 1 / 1), color(srgb 0.77415 0.83217 1 / 1), color(srgb 0.77292 0.83135 1 / 1), color(srgb 0.77174 0.83054 1 / 1), color(srgb 0.77057 0.82974 1 / 1), color(srgb 0.76941 0.82894 1 / 1), color(srgb 0.76827 0.82816 1 / 1), color(srgb 0.76714 0.82738 1 / 1), color(srgb 0.76602 0.82661 1 / 1), color(srgb 0.76491 0.82585 1 / 1), color(srgb 0.76381 0.8251 1 / 1), color(srgb 0.76272 0.82435 1 / 1), color(srgb 0.76165 0.82362 1 / 1), color(srgb 0.76058 0.82289 1 / 1), color(srgb 0.75953 0.82217 1 / 1), color(srgb 0.75848 0.82145 1 / 1), color(srgb 0.75745 0.82075 1 / 1), color(srgb 0.75642 0.82005 1 / 1), color(srgb 0.75541 0.81935 1 / 1), color(srgb 0.7544 0.81867 1 / 1), color(srgb 0.75341 0.81799 1 / 1), color(srgb 0.75242 0.81732 1 / 1), color(srgb 0.75144 0.81666 1 / 1), color(srgb 0.75048 0.816 1 / 1), color(srgb 0.74952 0.81535 1 / 1), color(srgb 0.74857 0.8147 1 / 1), color(srgb 0.74763 0.81406 1 / 1), color(srgb 0.74669 0.81343 1 / 1), color(srgb 0.74577 0.81281 1 / 1), color(srgb 0.74485 0.81219 1 / 1), color(srgb 0.74395 0.81157 1 / 1), color(srgb 0.74308 0.81096 1 / 1), color(srgb 0.74222 0.81036 1 / 1), color(srgb 0.74137 0.80977 1 / 1), color(srgb 0.74052 0.80918 1 / 1), color(srgb 0.73968 0.80859 1 / 1), color(srgb 0.73886 0.80801 1 / 1), color(srgb 0.73803 0.80744 1 / 1), color(srgb 0.73722 0.80687 1 / 1), color(srgb 0.73641 0.80631 1 / 1), color(srgb 0.73561 0.80575 1 / 1), color(srgb 0.73481 0.80519 1 / 1), color(srgb 0.73403 0.80465 1 / 1), color(srgb 0.73325 0.8041 1 / 1), color(srgb 0.73247 0.80357 1 / 1), color(srgb 0.7317 0.80303 1 / 1), color(srgb 0.73094 0.8025 1 / 1), color(srgb 0.73019 0.80198 1 / 1), color(srgb 0.72944 0.80146 1 / 1), color(srgb 0.7287 0.80094 1 / 1), color(srgb 0.72796 0.80043 1 / 1), color(srgb 0.72723 0.79993 1 / 1), color(srgb 0.72651 0.79943 1 / 1), color(srgb 0.72579 0.79893 1 / 1), color(srgb 0.72508 0.79844 1 / 1), color(srgb 0.72437 0.79795 1 / 1), color(srgb 0.72367 0.79746 1 / 1), color(srgb 0.72297 0.79698 1 / 1), color(srgb 0.72228 0.79651 1 / 1), color(srgb 0.7216 0.79603 1 / 1), color(srgb 0.72092 0.79557 1 / 1), color(srgb 0.72025 0.7951 1 / 1), color(srgb 0.71958 0.79464 1 / 1), color(srgb 0.71892 0.79418 1 / 1), color(srgb 0.71826 0.79373 1 / 1), color(srgb 0.71761 0.79328 1 / 1), color(srgb 0.71697 0.79284 1 / 1), color(srgb 0.71635 0.7924 1 / 1), color(srgb 0.71574 0.79196 1 / 1), color(srgb 0.71514 0.79153 1 / 1), color(srgb 0.71454 0.7911 1 / 1), color(srgb 0.71394 0.79068 1 / 1), color(srgb 0.71335 0.79025 1 / 1), color(srgb 0.71276 0.78984 1 / 1), color(srgb 0.71218 0.78942 1 / 1), color(srgb 0.7116 0.78901 1 / 1), color(srgb 0.71103 0.7886 1 / 1), color(srgb 0.71046 0.78819 1 / 1), color(srgb 0.7099 0.78779 1 / 1), color(srgb 0.70933 0.78739 1 / 1)]
ColorAide also provides a method cct()
which allows you to get an associated temperature and ∆uv from a given color. ∆uv will be discussed later.
>>> color = Color.blackbody('srgb', 2000)
>>> color
color(srgb 1 0.54362 0.08665 / 1)
>>> color.cct()
[1999.9999999999993, -5.5295962522242654e-17]
Duv
In addition to CCT, there is also the concept of Duv or ∆uv. In the following image, we've now drawn perpendicular lines that intersect the black body curve. These lines are called isotherms. An isotherm is simply a line connecting points having the same temperature at a given time or on average over a given period. In the case of colors, they connect a number of colors that are close to the locus with the same temperature. ∆uv describes the distance a given uv point is away from the associated uv point on the black body curve, positive being above the curve and negative being below the curve
We can calculate a color's associated temperature and its ∆uv along the associated isotherm.
>>> 'CCT: {}K Duv: {}'.format(*Color('yellow').cct())
'CCT: 3934.7189746569234K Duv: 0.04024818555895665'
CCT and ∆uv can also be used together to get a specific color that satisfies those requirements.
>>> Color.blackbody('srgb-linear', *Color('yellow').cct())
color(srgb-linear 1 1 0 / 1)
Limitations
All algorithms to calculate to and from CCT have some limitations and are only approximations, some being more accurate than others. Many algorithms are only accurate up to a certain temperature range. Additionally, it is recommend that colors that exhibit a ∆uv larger than |5e-2| should be considered inaccurate, and some algorithm's may not do as well out to even this limit.
Out of Gamut Temperatures
It should be noted that blackbody()
normalizes/scales the returned colors by default as the colors are often much too bright initially, all having a max luminance. This scaling is usually done under a linear RGB color space, Linear Rec2020 being the default as it encompasses the entire curve.
Keep in mind that if the color is not in the display gamut it will need to be gamut mapped, and the gamut mapped value will not exhibit the same temperature. How far off it is will be depends on the disparity of the gamut sizes and how the color was gamut mapped.
Colors that are outside the traditional RGB gamut (0 - 1) will be scaled to be within that range. If the color is beyond the gamut of the scaling color space, it will not convert back to the same temperature.
>>> c = Color.blackbody('srgb', 1200)
>>> c
color(srgb 1 0.3093 0 / 1)
>>> c.cct()
[1305.4626114185926, -0.0053568532479511925]
Using a larger gamut, such as Linear Rec. 2020 that encompasses the entire black body curve, can allow for more accurate results throughout the entire range, but this may be impractical if you need to work in a smaller gamut.
The desired RGB color space to scale within can be specified via scale_space
. And if no scaling is desired, it can be turned off by setting scale
to False
.
>>> c1 = Color.blackbody('display-p3', 1200, scale_space='display-p3-linear')
>>> c1
color(display-p3 1 0.36021 0.0172 / 1)
>>> c1.cct()
[1200.0000066930043, -1.093052476567441e-12]
>>> c2 = Color.blackbody('display-p3', 1200, scale=False)
>>> c2
color(display-p3 1.6804 0.62798 0.05495 / 1)
>>> c2.cct()
[1200.000006693005, -1.0930524765675185e-12]
Algorithms
There are quite a few approaches to calculating to and from CCT, each with their strengths and weaknesses. ColorAide currently only supports a few approaches, specifically those that support the concept of CCT and ∆uv. Each approach is implemented as a CCT plugin.
Algorithm | Key | Description |
---|---|---|
Robertson 1968 | robertson-1968 | Uses the CIE 2˚ Standard Observer and can handle a range of 1000K - ∞. |
Ohno 2013 | ohno-2013 | Utilizes a combined approach of a triangular and parabolic solver. Current implementation allows for a range of 1000K - 100000K. |
Robertson 1968 is the current default CCT approach, but any approach can be selected via the method
parameter in blackbody()
or cct()
.
>>> Color.blackbody('srgb-linear', 2500, method='ohno-2013').cct(method='ohno-2013')
[2500.011703361377, 2.3130833455749082e-07]
>>> Color.blackbody('srgb-linear', 2500, method='robertson-1968').cct(method='robertson-1968')
[2499.999999999999, 0.0]
Robertson 1968
The Robertson 1968 CCT algorithm is registered in Color
by default
The "Robertson 1968" approach was created by A. R. Robertson and is based on the CIE 2˚ Standard Observer with a range of 1667K - ∞. This approach uses a look up table containing 31 precalculated points along the black body curve and is used to approximate temperatures in between.
Robertson's approach is a reasonably fast approximation, but can exhibit moderate errors at times. The margin of error gets increasingly larger at very high temperatures approaching infinity.
ColorAide implements the Robertson 1968 approach by faithfully calculating the original 31 points (with later corrections), but it also uses the same approach to extend the lower range from 1667K to 1000K by calculating 16 additional points. There is no change in behavior from 1667K to ∞, but it will now properly resolve values as low as 1000K as well.
Practical Range
While Robertson's technically supports a range out to infinity, it becomes increasingly less practical after 100000K due to increasingly less accurate results. Even some results below 100000K may already have fairly sizeable errors.
>>> color = Color.blackbody('srgb-linear', 5000, duv=0.02)
>>> color
color(srgb-linear 0.94158 1 0.49098 / 1)
>>> color.cct()
[5000.000000000003, 0.020000000000000025]
Because the calculation logic is built into the plugin, you can actually use the plugin to generate a higher resolution table or even generate one using a different set of CMFs. When registering the plugin, you can configure the CMFs and a few other options to customize the look up table.
Parameters | Description |
---|---|
cmfs | Valid CMFs at a resolution greater than or equal to 1nm. |
white | A white point as xy chromaticity coordinates. |
mired | The mired value points to generate in the table (1e6 / Tkelvin = mired). Values should not be at a resolution lower than 1 mired as it can give the algorithm issues. 0 is acceptable though. |
sigfig | Significant figures to round to. This is required to faithfully generate the values as documented in the papers and is set to 5 by default. If set to 0 , no rounding will be done. |
planck_step | This controls the resolution at which the wavelengths in the CMFs are used to calculate the points along the Planckian locus. The original values are calculated with a 1nm resolution, so the default is set to 1 . If a given table has a lower resolution, such as 5nm, this value can be adjusted to properly work with that table. |
To use a different set of CMFS, such as the CIE 1964 10˚ Standard Observer, we could override the default plugin.
>>> from coloraide.temperature import robertson_1968
>>> from coloraide import cmfs
>>> from coloraide import cat
>>> mired_points = tuple(range(0, 100, 10)) + tuple(range(100, 601, 25)) + tuple(range(625, 1001, 25))
>>> class Custom(Color):
... ...
...
>>> C
...
...
... )
>>> Steps([Color.blackbody('srgb', t) for t in range(1000, 15000, 50)])
[color(srgb 1 0.18142 0 / 1), color(srgb 1 0.22157 0 / 1), color(srgb 1 0.25489 0 / 1), color(srgb 1 0.28375 0 / 1), color(srgb 1 0.3093 0 / 1), color(srgb 1 0.33241 0 / 1), color(srgb 1 0.35347 0 / 1), color(srgb 1 0.3729 0 / 1), color(srgb 1 0.39084 0 / 1), color(srgb 1 0.40753 0 / 1), color(srgb 1 0.42314 0 / 1), color(srgb 1 0.43781 0 / 1), color(srgb 1 0.45159 0 / 1), color(srgb 1 0.46445 0 / 1), color(srgb 1 0.47663 0 / 1), color(srgb 1 0.48821 0 / 1), color(srgb 1 0.49913 0 / 1), color(srgb 1 0.50946 0 / 1), color(srgb 1 0.5194 0.00025 / 1), color(srgb 1 0.53171 0.05099 / 1), color(srgb 1 0.54362 0.08665 / 1), color(srgb 1 0.55508 0.11675 / 1), color(srgb 1 0.56621 0.14078 / 1), color(srgb 1 0.57692 0.16381 / 1), color(srgb 1 0.58734 0.18409 / 1), color(srgb 1 0.59742 0.20351 / 1), color(srgb 1 0.60722 0.22203 / 1), color(srgb 1 0.6168 0.23892 / 1), color(srgb 1 0.62597 0.25645 / 1), color(srgb 1 0.63495 0.27277 / 1), color(srgb 1 0.64376 0.28801 / 1), color(srgb 1 0.65219 0.30409 / 1), color(srgb 1 0.66048 0.3192 / 1), color(srgb 1 0.66862 0.33348 / 1), color(srgb 1 0.67644 0.34807 / 1), color(srgb 1 0.68406 0.36243 / 1), color(srgb 1 0.69155 0.37611 / 1), color(srgb 1 0.69892 0.38918 / 1), color(srgb 1 0.70597 0.40288 / 1), color(srgb 1 0.71288 0.41619 / 1), color(srgb 1 0.71969 0.42897 / 1), color(srgb 1 0.7264 0.44127 / 1), color(srgb 1 0.73289 0.45367 / 1), color(srgb 1 0.73912 0.46623 / 1), color(srgb 1 0.74528 0.47835 / 1), color(srgb 1 0.75136 0.49007 / 1), color(srgb 1 0.75737 0.50143 / 1), color(srgb 1 0.7632 0.51278 / 1), color(srgb 1 0.76876 0.52444 / 1), color(srgb 1 0.77426 0.53576 / 1), color(srgb 1 0.7797 0.54675 / 1), color(srgb 1 0.78508 0.55745 / 1), color(srgb 1 0.79039 0.56787 / 1), color(srgb 1 0.79556 0.57824 / 1), color(srgb 1 0.80043 0.58891 / 1), color(srgb 1 0.80525 0.59931 / 1), color(srgb 1 0.81002 0.60946 / 1), color(srgb 1 0.81474 0.61937 / 1), color(srgb 1 0.81941 0.62905 / 1), color(srgb 1 0.82404 0.63852 / 1), color(srgb 1 0.82862 0.64778 / 1), color(srgb 1 0.83282 0.65746 / 1), color(srgb 1 0.83698 0.66693 / 1), color(srgb 1 0.8411 0.6762 / 1), color(srgb 1 0.84518 0.68528 / 1), color(srgb 1 0.84923 0.69418 / 1), color(srgb 1 0.85323 0.7029 / 1), color(srgb 1 0.8572 0.71145 / 1), color(srgb 1 0.86113 0.71985 / 1), color(srgb 1 0.86499 0.72814 / 1), color(srgb 1 0.86851 0.73667 / 1), color(srgb 1 0.87201 0.74505 / 1), color(srgb 1 0.87547 0.75327 / 1), color(srgb 1 0.8789 0.76134 / 1), color(srgb 1 0.88231 0.76927 / 1), color(srgb 1 0.88568 0.77707 / 1), color(srgb 1 0.88902 0.78474 / 1), color(srgb 1 0.89233 0.79228 / 1), color(srgb 1 0.89561 0.7997 / 1), color(srgb 1 0.89887 0.80701 / 1), color(srgb 1 0.9021 0.8142 / 1), color(srgb 1 0.90496 0.82155 / 1), color(srgb 1 0.9078 0.82879 / 1), color(srgb 1 0.91062 0.83591 / 1), color(srgb 1 0.91341 0.84293 / 1), color(srgb 1 0.91618 0.84983 / 1), color(srgb 1 0.91892 0.85664 / 1), color(srgb 1 0.92165 0.86334 / 1), color(srgb 1 0.92435 0.86995 / 1), color(srgb 1 0.92702 0.87646 / 1), color(srgb 1 0.92968 0.88288 / 1), color(srgb 1 0.93231 0.88921 / 1), color(srgb 1 0.93492 0.89545 / 1), color(srgb 1 0.93751 0.90161 / 1), color(srgb 1 0.94008 0.90769 / 1), color(srgb 1 0.94242 0.91377 / 1), color(srgb 1 0.94464 0.9198 / 1), color(srgb 1 0.94685 0.92575 / 1), color(srgb 1 0.94904 0.93162 / 1), color(srgb 1 0.95121 0.9374 / 1), color(srgb 1 0.95337 0.94312 / 1), color(srgb 1 0.9555 0.94876 / 1), color(srgb 1 0.95762 0.95432 / 1), color(srgb 1 0.95973 0.95982 / 1), color(srgb 1 0.96181 0.96525 / 1), color(srgb 1 0.96388 0.97061 / 1), color(srgb 1 0.96594 0.97591 / 1), color(srgb 1 0.96798 0.98114 / 1), color(srgb 1 0.97 0.98631 / 1), color(srgb 1 0.972 0.99142 / 1), color(srgb 1 0.974 0.99646 / 1), color(srgb 0.99855 0.97455 1 / 1), color(srgb 0.99365 0.97172 1 / 1), color(srgb 0.98885 0.96895 1 / 1), color(srgb 0.98416 0.96606 1 / 1), color(srgb 0.97956 0.96315 1 / 1), color(srgb 0.97506 0.96031 1 / 1), color(srgb 0.97065 0.95752 1 / 1), color(srgb 0.96632 0.9548 1 / 1), color(srgb 0.96208 0.95214 1 / 1), color(srgb 0.95793 0.94954 1 / 1), color(srgb 0.95385 0.94699 1 / 1), color(srgb 0.94985 0.94449 1 / 1), color(srgb 0.94593 0.94205 1 / 1), color(srgb 0.94207 0.93966 1 / 1), color(srgb 0.93829 0.93731 1 / 1), color(srgb 0.93458 0.93502 1 / 1), color(srgb 0.93094 0.93277 1 / 1), color(srgb 0.92735 0.93056 1 / 1), color(srgb 0.92384 0.9284 1 / 1), color(srgb 0.92038 0.92627 1 / 1), color(srgb 0.91698 0.92419 1 / 1), color(srgb 0.91364 0.92215 1 / 1), color(srgb 0.91036 0.92015 1 / 1), color(srgb 0.90713 0.91818 1 / 1), color(srgb 0.90395 0.91625 1 / 1), color(srgb 0.90083 0.91435 1 / 1), color(srgb 0.89776 0.91249 1 / 1), color(srgb 0.89474 0.91066 1 / 1), color(srgb 0.89176 0.90887 1 / 1), color(srgb 0.88883 0.9071 1 / 1), color(srgb 0.88604 0.90525 1 / 1), color(srgb 0.88329 0.90342 1 / 1), color(srgb 0.88058 0.90163 1 / 1), color(srgb 0.87791 0.89987 1 / 1), color(srgb 0.87529 0.89814 1 / 1), color(srgb 0.8727 0.89644 1 / 1), color(srgb 0.87016 0.89476 1 / 1), color(srgb 0.86765 0.89312 1 / 1), color(srgb 0.86518 0.8915 1 / 1), color(srgb 0.86274 0.8899 1 / 1), color(srgb 0.86035 0.88833 1 / 1), color(srgb 0.85798 0.88679 1 / 1), color(srgb 0.85565 0.88527 1 / 1), color(srgb 0.85336 0.88377 1 / 1), color(srgb 0.8511 0.8823 1 / 1), color(srgb 0.84886 0.88085 1 / 1), color(srgb 0.84666 0.87942 1 / 1), color(srgb 0.84449 0.87802 1 / 1), color(srgb 0.84235 0.87663 1 / 1), color(srgb 0.84024 0.87527 1 / 1), color(srgb 0.83816 0.87392 1 / 1), color(srgb 0.83611 0.8726 1 / 1), color(srgb 0.83408 0.87129 1 / 1), color(srgb 0.83208 0.87 1 / 1), color(srgb 0.8301 0.86873 1 / 1), color(srgb 0.82816 0.86748 1 / 1), color(srgb 0.82623 0.86625 1 / 1), color(srgb 0.82433 0.86504 1 / 1), color(srgb 0.82246 0.86384 1 / 1), color(srgb 0.82061 0.86265 1 / 1), color(srgb 0.81878 0.86149 1 / 1), color(srgb 0.81698 0.86034 1 / 1), color(srgb 0.8152 0.8592 1 / 1), color(srgb 0.81343 0.85808 1 / 1), color(srgb 0.8117 0.85698 1 / 1), color(srgb 0.80998 0.85589 1 / 1), color(srgb 0.80828 0.85481 1 / 1), color(srgb 0.8066 0.85375 1 / 1), color(srgb 0.80495 0.8527 1 / 1), color(srgb 0.80331 0.85167 1 / 1), color(srgb 0.80176 0.85062 1 / 1), color(srgb 0.80022 0.84959 1 / 1), color(srgb 0.79871 0.84857 1 / 1), color(srgb 0.79721 0.84756 1 / 1), color(srgb 0.79573 0.84656 1 / 1), color(srgb 0.79426 0.84558 1 / 1), color(srgb 0.79282 0.84461 1 / 1), color(srgb 0.79139 0.84365 1 / 1), color(srgb 0.78997 0.8427 1 / 1), color(srgb 0.78857 0.84177 1 / 1), color(srgb 0.78719 0.84084 1 / 1), color(srgb 0.78582 0.83993 1 / 1), color(srgb 0.78447 0.83902 1 / 1), color(srgb 0.78313 0.83813 1 / 1), color(srgb 0.7818 0.83725 1 / 1), color(srgb 0.78049 0.83638 1 / 1), color(srgb 0.7792 0.83552 1 / 1), color(srgb 0.77792 0.83466 1 / 1), color(srgb 0.77665 0.83382 1 / 1), color(srgb 0.77539 0.83299 1 / 1), color(srgb 0.77415 0.83217 1 / 1), color(srgb 0.77292 0.83135 1 / 1), color(srgb 0.77174 0.83054 1 / 1), color(srgb 0.77057 0.82974 1 / 1), color(srgb 0.76941 0.82894 1 / 1), color(srgb 0.76827 0.82816 1 / 1), color(srgb 0.76714 0.82738 1 / 1), color(srgb 0.76602 0.82661 1 / 1), color(srgb 0.76491 0.82585 1 / 1), color(srgb 0.76381 0.8251 1 / 1), color(srgb 0.76272 0.82435 1 / 1), color(srgb 0.76165 0.82362 1 / 1), color(srgb 0.76058 0.82289 1 / 1), color(srgb 0.75953 0.82217 1 / 1), color(srgb 0.75848 0.82145 1 / 1), color(srgb 0.75745 0.82075 1 / 1), color(srgb 0.75642 0.82005 1 / 1), color(srgb 0.75541 0.81935 1 / 1), color(srgb 0.7544 0.81867 1 / 1), color(srgb 0.75341 0.81799 1 / 1), color(srgb 0.75242 0.81732 1 / 1), color(srgb 0.75144 0.81666 1 / 1), color(srgb 0.75048 0.816 1 / 1), color(srgb 0.74952 0.81535 1 / 1), color(srgb 0.74857 0.8147 1 / 1), color(srgb 0.74763 0.81406 1 / 1), color(srgb 0.74669 0.81343 1 / 1), color(srgb 0.74577 0.81281 1 / 1), color(srgb 0.74485 0.81219 1 / 1), color(srgb 0.74395 0.81157 1 / 1), color(srgb 0.74308 0.81096 1 / 1), color(srgb 0.74222 0.81036 1 / 1), color(srgb 0.74137 0.80977 1 / 1), color(srgb 0.74052 0.80918 1 / 1), color(srgb 0.73968 0.80859 1 / 1), color(srgb 0.73886 0.80801 1 / 1), color(srgb 0.73803 0.80744 1 / 1), color(srgb 0.73722 0.80687 1 / 1), color(srgb 0.73641 0.80631 1 / 1), color(srgb 0.73561 0.80575 1 / 1), color(srgb 0.73481 0.80519 1 / 1), color(srgb 0.73403 0.80465 1 / 1), color(srgb 0.73325 0.8041 1 / 1), color(srgb 0.73247 0.80357 1 / 1), color(srgb 0.7317 0.80303 1 / 1), color(srgb 0.73094 0.8025 1 / 1), color(srgb 0.73019 0.80198 1 / 1), color(srgb 0.72944 0.80146 1 / 1), color(srgb 0.7287 0.80094 1 / 1), color(srgb 0.72796 0.80043 1 / 1), color(srgb 0.72723 0.79993 1 / 1), color(srgb 0.72651 0.79943 1 / 1), color(srgb 0.72579 0.79893 1 / 1), color(srgb 0.72508 0.79844 1 / 1), color(srgb 0.72437 0.79795 1 / 1), color(srgb 0.72367 0.79746 1 / 1), color(srgb 0.72297 0.79698 1 / 1), color(srgb 0.72228 0.79651 1 / 1), color(srgb 0.7216 0.79603 1 / 1), color(srgb 0.72092 0.79557 1 / 1), color(srgb 0.72025 0.7951 1 / 1), color(srgb 0.71958 0.79464 1 / 1), color(srgb 0.71892 0.79418 1 / 1), color(srgb 0.71826 0.79373 1 / 1), color(srgb 0.71761 0.79328 1 / 1), color(srgb 0.71697 0.79284 1 / 1), color(srgb 0.71635 0.7924 1 / 1), color(srgb 0.71574 0.79196 1 / 1), color(srgb 0.71514 0.79153 1 / 1), color(srgb 0.71454 0.7911 1 / 1), color(srgb 0.71394 0.79068 1 / 1), color(srgb 0.71335 0.79025 1 / 1), color(srgb 0.71276 0.78984 1 / 1), color(srgb 0.71218 0.78942 1 / 1), color(srgb 0.7116 0.78901 1 / 1), color(srgb 0.71103 0.7886 1 / 1), color(srgb 0.71046 0.78819 1 / 1), color(srgb 0.7099 0.78779 1 / 1), color(srgb 0.70933 0.78739 1 / 1)]
Ohno 2013
The Ohno 2013 CCT algorithm is registered in Color
by default
This is an approach researched by Yoshi Ohno and aims to provide better accuracy. It uses a look up table similar to the Robertson method and employs a combined approach of a triangular solver and a parabolic solver. This can lead to high accuracy if the table is large enough.
Additionally, an "automatic expansion" technique can be used that starts with a small table and expands the table on smaller intervals based on the first solution. This can allow for a high accuracy without having to keep a large table in memory.
For good accuracy throughout the range of 1000K - 100000K, as ColorAide supports, a very large table would be needed. If the "automatic expansion" technique was used, without caching the data which would cause the table to balloon in memory, the process is much slower.
To mitigate the downside of storing a massive table in memory and to reduce the performance issues when using "automatic expansion", ColorAide uses a moderately sized table and creates a spline to interpolate points in between. The expansion technique is then used to get close to the target using the spline as the data table. Once points sufficiently close are found via the automatic expansion, more accurate values are calculated at those locations and are used in the triangular and parabolic solver. This allows us to use a smaller table while mitigating the performance issues associated with the expansion technique, all while maintaining good accuracy. The technique is still slower than the Robertson approach, but it is a more accurate approach.
>>> color = Color.blackbody('srgb-linear', 5000, duv=0.02, method='ohno-2013')
>>> color
color(srgb-linear 0.94166 1 0.49106 / 1)
>>> color.cct()
[5000.015474747112, 0.019993847505661237]
ColorAide exposes some of the knobs to control the automatic expansion.
Parameter | Description |
---|---|
start | Used to control the starting range for the search. Default is 1000 . For accuracy, the start should not be set lower than 1000 . |
end | Used to control the ending range for the search. Default is 100000 . For accuracy, the end should not be set higher than 100000 . |
samples | Number of sample points to use on each iteration of "automatic expansion". The default is 10 . |
iterations | Number of iterations to perform when converging close to the temperature. The default is 6 as experimentation seemed indicate it yields the best results with a sample size of 10 and a range of 1000K - 100000K. |
exact | Controls whether the spline approximation is used. When set to True , all values are directly calculated, bypassing the spline. Calculations will be slower when enabled. The default is False and will utilize the spline providing a performance boost. |
By default, the entire range of 1000K to 100000K is explored when resolving CCT, but a smaller range can be used. This can be useful if you have an idea of the range, but not the specific value. Using a smaller range may allow for less iterations to achieve the same or better accuracy.
>>> Color('orange').cct(method='ohno-2013')
[2424.1146637385255, 0.008069417642630583]
>>> Color('orange').cct(start=2000, end=3000, iterations=3, method='ohno-2013')
[2424.117026379762, 0.008069404687598869]
If a more pure approach is desired, exact
can be used to directly use the "automatic expansion" without using the spline. The values for the table will be explicitly calculated on the fly. Performance will be affected with minimal to no increase in accuracy.
>>> Color.blackbody('srgb-linear', 5000, duv=0.02).cct(method='ohno-2013')
[4999.987927661827, 0.020006162744118677]
>>> Color.blackbody('srgb-linear', 5000, duv=0.02).cct(method='ohno-2013', exact=True)
[4999.987927661827, 0.020006162744118677]
Lastly, the Ohno 2013 method can be used with other CMFs if desired. To do this, the plugin must be instantiated with different CMFs. The plugin supports a few initialization parameters to controls this.
Parameters | Description |
---|---|
cmfs | Valid CMFs at a resolution greater than or equal to 1nm. |
white | A white point as xy chromaticity coordinates. |
planck_step | This controls the resolution at which the wavelengths in the CMFs are used to calculate the points along the Planckian locus. 5 (5nm) is used as the default as it provides decent performance vs accuracy. |
To use an different CMFs, such as the CIE 10˚ Standard Observer, we can add the plugin with our desired configuration, overwriting the defaults.
>>> from coloraide import cmfs
>>> from coloraide import cat
>>> from coloraide.temperature.ohno_2013 import Ohno2013
>>> class Custom(Color):
... ...
...
>>> C
...
...
... )
>>> Steps([Custom.blackbody('srgb-linear', t, method='ohno-2013') for t in range(1000, 15000, 50)])
[color(srgb-linear 1 0.04002 0 / 1), color(srgb-linear 1 0.05154 0 / 1), color(srgb-linear 1 0.06305 0 / 1), color(srgb-linear 1 0.07453 0 / 1), color(srgb-linear 1 0.08593 0 / 1), color(srgb-linear 1 0.09724 0 / 1), color(srgb-linear 1 0.10842 0 / 1), color(srgb-linear 1 0.11944 0 / 1), color(srgb-linear 1 0.1303 0 / 1), color(srgb-linear 1 0.14097 0 / 1), color(srgb-linear 1 0.15144 0 / 1), color(srgb-linear 1 0.16171 0 / 1), color(srgb-linear 1 0.17175 0 / 1), color(srgb-linear 1 0.18157 0 / 1), color(srgb-linear 1 0.19116 0 / 1), color(srgb-linear 1 0.20052 0 / 1), color(srgb-linear 1 0.20965 0 / 1), color(srgb-linear 1 0.21854 0 / 1), color(srgb-linear 1 0.22719 0 / 1), color(srgb-linear 1 0.2371 0.00195 / 1), color(srgb-linear 1 0.2484 0.00608 / 1), color(srgb-linear 1 0.25963 0.01052 / 1), color(srgb-linear 1 0.27081 0.01528 / 1), color(srgb-linear 1 0.28192 0.02035 / 1), color(srgb-linear 1 0.29296 0.02572 / 1), color(srgb-linear 1 0.30393 0.03139 / 1), color(srgb-linear 1 0.31483 0.03735 / 1), color(srgb-linear 1 0.32565 0.04361 / 1), color(srgb-linear 1 0.33639 0.05015 / 1), color(srgb-linear 1 0.34706 0.05696 / 1), color(srgb-linear 1 0.35764 0.06405 / 1), color(srgb-linear 1 0.36814 0.07141 / 1), color(srgb-linear 1 0.37856 0.07902 / 1), color(srgb-linear 1 0.3889 0.08688 / 1), color(srgb-linear 1 0.39915 0.09499 / 1), color(srgb-linear 1 0.40932 0.10333 / 1), color(srgb-linear 1 0.4194 0.1119 / 1), color(srgb-linear 1 0.4294 0.1207 / 1), color(srgb-linear 1 0.43931 0.12971 / 1), color(srgb-linear 1 0.44913 0.13893 / 1), color(srgb-linear 1 0.45886 0.14835 / 1), color(srgb-linear 1 0.46851 0.15796 / 1), color(srgb-linear 1 0.47807 0.16776 / 1), color(srgb-linear 1 0.48754 0.17774 / 1), color(srgb-linear 1 0.49693 0.1879 / 1), color(srgb-linear 1 0.50622 0.19821 / 1), color(srgb-linear 1 0.51543 0.20869 / 1), color(srgb-linear 1 0.52455 0.21932 / 1), color(srgb-linear 1 0.53358 0.23009 / 1), color(srgb-linear 1 0.54253 0.241 / 1), color(srgb-linear 1 0.55139 0.25204 / 1), color(srgb-linear 1 0.56016 0.26321 / 1), color(srgb-linear 1 0.56885 0.2745 / 1), color(srgb-linear 1 0.57745 0.2859 / 1), color(srgb-linear 1 0.58597 0.29741 / 1), color(srgb-linear 1 0.5944 0.30903 / 1), color(srgb-linear 1 0.60274 0.32073 / 1), color(srgb-linear 1 0.611 0.33253 / 1), color(srgb-linear 1 0.61918 0.34442 / 1), color(srgb-linear 1 0.62728 0.35638 / 1), color(srgb-linear 1 0.63529 0.36842 / 1), color(srgb-linear 1 0.64322 0.38053 / 1), color(srgb-linear 1 0.65107 0.3927 / 1), color(srgb-linear 1 0.65884 0.40493 / 1), color(srgb-linear 1 0.66652 0.41722 / 1), color(srgb-linear 1 0.67413 0.42956 / 1), color(srgb-linear 1 0.68166 0.44195 / 1), color(srgb-linear 1 0.68911 0.45438 / 1), color(srgb-linear 1 0.69648 0.46684 / 1), color(srgb-linear 1 0.70377 0.47934 / 1), color(srgb-linear 1 0.71099 0.49187 / 1), color(srgb-linear 1 0.71813 0.50443 / 1), color(srgb-linear 1 0.72519 0.51701 / 1), color(srgb-linear 1 0.73218 0.52961 / 1), color(srgb-linear 1 0.7391 0.54222 / 1), color(srgb-linear 1 0.74594 0.55485 / 1), color(srgb-linear 1 0.75271 0.56748 / 1), color(srgb-linear 1 0.75941 0.58012 / 1), color(srgb-linear 1 0.76604 0.59277 / 1), color(srgb-linear 1 0.77259 0.60541 / 1), color(srgb-linear 1 0.77908 0.61805 / 1), color(srgb-linear 1 0.78549 0.63068 / 1), color(srgb-linear 1 0.79184 0.64331 / 1), color(srgb-linear 1 0.79812 0.65592 / 1), color(srgb-linear 1 0.80433 0.66853 / 1), color(srgb-linear 1 0.81047 0.68111 / 1), color(srgb-linear 1 0.81655 0.69368 / 1), color(srgb-linear 1 0.82256 0.70623 / 1), color(srgb-linear 1 0.82851 0.71875 / 1), color(srgb-linear 1 0.8344 0.73125 / 1), color(srgb-linear 1 0.84022 0.74373 / 1), color(srgb-linear 1 0.84598 0.75617 / 1), color(srgb-linear 1 0.85167 0.76859 / 1), color(srgb-linear 1 0.85731 0.78097 / 1), color(srgb-linear 1 0.86288 0.79332 / 1), color(srgb-linear 1 0.8684 0.80564 / 1), color(srgb-linear 1 0.87385 0.81792 / 1), color(srgb-linear 1 0.87925 0.83016 / 1), color(srgb-linear 1 0.88459 0.84236 / 1), color(srgb-linear 1 0.88987 0.85452 / 1), color(srgb-linear 1 0.89509 0.86664 / 1), color(srgb-linear 1 0.90026 0.87872 / 1), color(srgb-linear 1 0.90538 0.89075 / 1), color(srgb-linear 1 0.91044 0.90273 / 1), color(srgb-linear 1 0.91544 0.91467 / 1), color(srgb-linear 1 0.92039 0.92656 / 1), color(srgb-linear 1 0.92529 0.93841 / 1), color(srgb-linear 1 0.93014 0.9502 / 1), color(srgb-linear 1 0.93493 0.96195 / 1), color(srgb-linear 1 0.93967 0.97364 / 1), color(srgb-linear 1 0.94437 0.98528 / 1), color(srgb-linear 1 0.94901 0.99687 / 1), color(srgb-linear 0.99167 0.94566 1 / 1), color(srgb-linear 0.9805 0.93947 1 / 1), color(srgb-linear 0.96964 0.93342 1 / 1), color(srgb-linear 0.95906 0.92751 1 / 1), color(srgb-linear 0.94877 0.92173 1 / 1), color(srgb-linear 0.93874 0.91607 1 / 1), color(srgb-linear 0.92897 0.91054 1 / 1), color(srgb-linear 0.91944 0.90513 1 / 1), color(srgb-linear 0.91016 0.89984 1 / 1), color(srgb-linear 0.90111 0.89465 1 / 1), color(srgb-linear 0.89229 0.88958 1 / 1), color(srgb-linear 0.88368 0.88461 1 / 1), color(srgb-linear 0.87528 0.87975 1 / 1), color(srgb-linear 0.86709 0.87499 1 / 1), color(srgb-linear 0.85909 0.87032 1 / 1), color(srgb-linear 0.85127 0.86574 1 / 1), color(srgb-linear 0.84364 0.86126 1 / 1), color(srgb-linear 0.83619 0.85687 1 / 1), color(srgb-linear 0.82891 0.85256 1 / 1), color(srgb-linear 0.8218 0.84833 1 / 1), color(srgb-linear 0.81484 0.84419 1 / 1), color(srgb-linear 0.80804 0.84013 1 / 1), color(srgb-linear 0.8014 0.83614 1 / 1), color(srgb-linear 0.7949 0.83223 1 / 1), color(srgb-linear 0.78854 0.82839 1 / 1), color(srgb-linear 0.78231 0.82463 1 / 1), color(srgb-linear 0.77622 0.82093 1 / 1), color(srgb-linear 0.77027 0.8173 1 / 1), color(srgb-linear 0.76443 0.81374 1 / 1), color(srgb-linear 0.75872 0.81024 1 / 1), color(srgb-linear 0.75313 0.8068 1 / 1), color(srgb-linear 0.74765 0.80342 1 / 1), color(srgb-linear 0.74228 0.80011 1 / 1), color(srgb-linear 0.73702 0.79685 1 / 1), color(srgb-linear 0.73187 0.79364 1 / 1), color(srgb-linear 0.72682 0.79049 1 / 1), color(srgb-linear 0.72187 0.7874 1 / 1), color(srgb-linear 0.71702 0.78436 1 / 1), color(srgb-linear 0.71226 0.78137 1 / 1), color(srgb-linear 0.70759 0.77843 1 / 1), color(srgb-linear 0.70301 0.77553 1 / 1), color(srgb-linear 0.69852 0.77269 1 / 1), color(srgb-linear 0.69412 0.76989 1 / 1), color(srgb-linear 0.68979 0.76714 1 / 1), color(srgb-linear 0.68555 0.76443 1 / 1), color(srgb-linear 0.68138 0.76176 1 / 1), color(srgb-linear 0.67729 0.75914 1 / 1), color(srgb-linear 0.67328 0.75656 1 / 1), color(srgb-linear 0.66934 0.75402 1 / 1), color(srgb-linear 0.66547 0.75152 1 / 1), color(srgb-linear 0.66166 0.74906 1 / 1), color(srgb-linear 0.65793 0.74663 1 / 1), color(srgb-linear 0.65426 0.74424 1 / 1), color(srgb-linear 0.65065 0.74189 1 / 1), color(srgb-linear 0.64711 0.73958 1 / 1), color(srgb-linear 0.64362 0.73729 1 / 1), color(srgb-linear 0.6402 0.73505 1 / 1), color(srgb-linear 0.63683 0.73283 1 / 1), color(srgb-linear 0.63352 0.73065 1 / 1), color(srgb-linear 0.63027 0.7285 1 / 1), color(srgb-linear 0.62707 0.72638 1 / 1), color(srgb-linear 0.62392 0.7243 1 / 1), color(srgb-linear 0.62082 0.72224 1 / 1), color(srgb-linear 0.61778 0.72021 1 / 1), color(srgb-linear 0.61478 0.71821 1 / 1), color(srgb-linear 0.61183 0.71624 1 / 1), color(srgb-linear 0.60893 0.71429 1 / 1), color(srgb-linear 0.60607 0.71238 1 / 1), color(srgb-linear 0.60326 0.71048 1 / 1), color(srgb-linear 0.60049 0.70862 1 / 1), color(srgb-linear 0.59777 0.70678 1 / 1), color(srgb-linear 0.59509 0.70497 1 / 1), color(srgb-linear 0.59245 0.70318 1 / 1), color(srgb-linear 0.58984 0.70141 1 / 1), color(srgb-linear 0.58728 0.69967 1 / 1), color(srgb-linear 0.58476 0.69795 1 / 1), color(srgb-linear 0.58227 0.69625 1 / 1), color(srgb-linear 0.57982 0.69458 1 / 1), color(srgb-linear 0.57741 0.69293 1 / 1), color(srgb-linear 0.57503 0.6913 1 / 1), color(srgb-linear 0.57269 0.68969 1 / 1), color(srgb-linear 0.57038 0.6881 1 / 1), color(srgb-linear 0.56811 0.68653 1 / 1), color(srgb-linear 0.56586 0.68498 1 / 1), color(srgb-linear 0.56365 0.68345 1 / 1), color(srgb-linear 0.56147 0.68194 1 / 1), color(srgb-linear 0.55933 0.68045 1 / 1), color(srgb-linear 0.55721 0.67898 1 / 1), color(srgb-linear 0.55512 0.67752 1 / 1), color(srgb-linear 0.55306 0.67609 1 / 1), color(srgb-linear 0.55102 0.67467 1 / 1), color(srgb-linear 0.54902 0.67327 1 / 1), color(srgb-linear 0.54704 0.67188 1 / 1), color(srgb-linear 0.54509 0.67051 1 / 1), color(srgb-linear 0.54317 0.66916 1 / 1), color(srgb-linear 0.54127 0.66782 1 / 1), color(srgb-linear 0.53939 0.6665 1 / 1), color(srgb-linear 0.53754 0.6652 1 / 1), color(srgb-linear 0.53572 0.66391 1 / 1), color(srgb-linear 0.53392 0.66264 1 / 1), color(srgb-linear 0.53214 0.66138 1 / 1), color(srgb-linear 0.53039 0.66013 1 / 1), color(srgb-linear 0.52866 0.6589 1 / 1), color(srgb-linear 0.52695 0.65769 1 / 1), color(srgb-linear 0.52526 0.65648 1 / 1), color(srgb-linear 0.52359 0.6553 1 / 1), color(srgb-linear 0.52195 0.65412 1 / 1), color(srgb-linear 0.52032 0.65296 1 / 1), color(srgb-linear 0.51871 0.65181 1 / 1), color(srgb-linear 0.51713 0.65067 1 / 1), color(srgb-linear 0.51556 0.64955 1 / 1), color(srgb-linear 0.51402 0.64844 1 / 1), color(srgb-linear 0.51249 0.64734 1 / 1), color(srgb-linear 0.51098 0.64625 1 / 1), color(srgb-linear 0.50949 0.64517 1 / 1), color(srgb-linear 0.50802 0.64411 1 / 1), color(srgb-linear 0.50656 0.64306 1 / 1), color(srgb-linear 0.50512 0.64202 1 / 1), color(srgb-linear 0.5037 0.64099 1 / 1), color(srgb-linear 0.5023 0.63997 1 / 1), color(srgb-linear 0.50091 0.63896 1 / 1), color(srgb-linear 0.49954 0.63796 1 / 1), color(srgb-linear 0.49818 0.63697 1 / 1), color(srgb-linear 0.49684 0.63599 1 / 1), color(srgb-linear 0.49552 0.63503 1 / 1), color(srgb-linear 0.4942 0.63407 1 / 1), color(srgb-linear 0.49291 0.63312 1 / 1), color(srgb-linear 0.49163 0.63219 1 / 1), color(srgb-linear 0.49036 0.63126 1 / 1), color(srgb-linear 0.48911 0.63034 1 / 1), color(srgb-linear 0.48787 0.62943 1 / 1), color(srgb-linear 0.48665 0.62853 1 / 1), color(srgb-linear 0.48544 0.62764 1 / 1), color(srgb-linear 0.48424 0.62675 1 / 1), color(srgb-linear 0.48306 0.62588 1 / 1), color(srgb-linear 0.48188 0.62502 1 / 1), color(srgb-linear 0.48072 0.62416 1 / 1), color(srgb-linear 0.47958 0.62331 1 / 1), color(srgb-linear 0.47844 0.62247 1 / 1), color(srgb-linear 0.47732 0.62164 1 / 1), color(srgb-linear 0.47621 0.62081 1 / 1), color(srgb-linear 0.47511 0.62 1 / 1), color(srgb-linear 0.47403 0.61919 1 / 1), color(srgb-linear 0.47295 0.61839 1 / 1), color(srgb-linear 0.47189 0.6176 1 / 1), color(srgb-linear 0.47083 0.61681 1 / 1), color(srgb-linear 0.46979 0.61603 1 / 1), color(srgb-linear 0.46876 0.61526 1 / 1), color(srgb-linear 0.46774 0.6145 1 / 1), color(srgb-linear 0.46673 0.61374 1 / 1), color(srgb-linear 0.46573 0.61299 1 / 1), color(srgb-linear 0.46474 0.61225 1 / 1), color(srgb-linear 0.46376 0.61151 1 / 1), color(srgb-linear 0.46279 0.61079 1 / 1), color(srgb-linear 0.46182 0.61006 1 / 1), color(srgb-linear 0.46087 0.60935 1 / 1), color(srgb-linear 0.45993 0.60864 1 / 1), color(srgb-linear 0.459 0.60793 1 / 1), color(srgb-linear 0.45808 0.60724 1 / 1), color(srgb-linear 0.45716 0.60655 1 / 1), color(srgb-linear 0.45626 0.60586 1 / 1), color(srgb-linear 0.45536 0.60519 1 / 1), color(srgb-linear 0.45447 0.60451 1 / 1), color(srgb-linear 0.45359 0.60385 1 / 1), color(srgb-linear 0.45272 0.60319 1 / 1), color(srgb-linear 0.45186 0.60253 1 / 1), color(srgb-linear 0.451 0.60188 1 / 1), color(srgb-linear 0.45015 0.60124 1 / 1)]