SPEC2CIE
Name
spec2cie
Purpose (one Line Only)
Convert from reflectance spectrum to CIE Chromaticity coordinates
Description
Conversion from reflectance spectrum to CIE Chromaticity (D65).
The color conversion is based on a Fortran subroutine
from A. T. Young, ; SDSU
See: http://mintaka.sdsu.edu/GF/explain/optics/color/color.html
This routine is designed to let you feed it spectral information that
may or may not be encoded against other dimensions (most commonly
position) and convert the spectral dimension to its CIE equivalent.
Category
Image display
Calling Sequence
spec2cie,wave,spec,x,y,bigy
Inputs
wave - scalar or vector, wavelengths, in nanometers for spectrum
The spectral range of interest is 380-770 nm (visual range)
This does not need to be regularly spaced but should be monotonical
increasing.
spec - Spectrum or spectral image data, this information is expected
to be in the range of 0-1 where 1 is perfectly reflecting and
0 is perfectly absorbing.
rank(spec) cannot be < rank(wave). Last array index
for spec matches the index for wave.
Optional Input Parameters
Keyword Input Parameters
SUBSAMPLE - Allows for finer resolution input spectra to be accurately
transformed. The default value is 1 and should work on anything
with spectral structure coarser than 10 nm. To properly capture
the nuances of your input spectra, divide 10 by the sampling
interval of your spectra. Round this number up to the next
integer and this is the value you'd give as EXPAND.
SHOWSUMMARY - Flag, if set will print and plot information for the
scalar case. Ignored for vector or array data.
Outputs
x,y - CIE chromaticity, rank is one less than spec.
bigy - intensity
Note: white is x=0.3127, y=0.3290, bigy=Y=1.0
(z=0.3583 because x+y+z=1)
Keyword Output Parameters
Common Blocks
Side Effects
Restrictions
Sorry, this is not an elegant or general coding solution. This could
be more general but I dont' have the time to figure out the IDL syntax
to maximize vectorability. This won't be too fast if wave is short and
spec is really big.
Procedure
The tricky part in using this routine effectively is to understand how
the wavelength information is imbedded in the input variables.
Consider the simplest possible case, two wavelenths of information
and just one points to calculate this for:
wave=[450,600] ; two wavelengths, don't have to match end points
spec=[0.5,0.6] ; slight red slope
will return scalar values for x,y,bigy
Another case, same wavelength vector, but now two "scans"
spec -> 100x2 array
second dimension matches wave vector
result x,y,bigy are each 100 elements long
Last case, saveme wavelength vector, but now two images
spec -> 100x100x2 array
third dimension matches wave vector
result x,y,bigy are each 100x100 arrays
Modification History
Written by Marc W. Buie, Southwest Research Institute, 2009/01/05