## make XYZ for an 18% gray card, under Illuminant D65
white.D65 = 100 * as.numeric( spacesXYZ::standardXYZ( 'D65' ) )
gray18 = 0.18 * white.D65
XYZtoMunsell( gray18 )
## H V C
## 7.6GY 4.9/0.65 37.6456 4.851927 0.6466169
## This is not neutral gray, as expected. The hue is green-yellow.
## Chroma = 0.6466 is too large; it should be 0, up to numerical truncation.
## The problem is that the white points are not equal.
## Redo and supply the true white point.
XYZtoMunsell( gray18, white=white.D65 )
## H V C
## N 4.9/ 0 4.851927 0 # much better; an exact neutral
## Although the hue H=0 here, it is actually undefined because C=0
## (as in polar coordinates, theta is undefined when r=0).
## When XYZ=(0,0,0) then Value should be exactly 0.
## And when XYZ is equal to the white point, then Value should be exactly 10.
XYZtoMunsell( c( 0,0,0, white.D65 ), white=white.D65 )
## H V C
## N 0/ 0 0 0
## N 10/ 0 10 0
## By convention, Y=100 for the reference white; but this is not strictly required.
gray18
## X Y Z
## [1,] 17.10846 18 19.59894
XYZtoMunsell( gray18, white=gray18 )
## H V C
## N 10/ 0 10 0
## The Value is still exactly 10.
Run the code above in your browser using DataLab