Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
255 views
1
'''
2
ciexyz.py - Spectral response curves for 1931 CIE XYZ 2 degree field of view matching functions.
3
4
Description:
5
6
This module provides the CIE standard XYZ color matching functions.
7
The 1931 tabulation, for a 2 degree field of view, is used in preference to the 10 degree 1964 set,
8
as is conventional in computer graphics.
9
10
The matching functions are stored internally at 1 nm increments, and linear interpolation is
11
used for any wavelength in between.
12
13
ColorPy attempts to scale the matching functions so that:
14
A spectrum, constant with wavelength, over the range 360 nm to 830 nm, with a total intensity
15
equal to the (assumed) physical intensity of the monitor, will sample with Y = 1.0.
16
17
This scaling corresponds with that in colormodels.py, which assumes Y = 1.0 at full white.
18
19
NOTE - I suspect that the scaling is not quite correct. I think it is at least close.
20
21
Ideally, we would like the spectrum of the actual monitor display, at full white, which is not
22
independent of wavelength, to sample to Y = 1.0.
23
24
Constants and Functions:
25
26
start_wl_nm, end_wl_nm - Default starting and ending range of wavelengths, in nm, as integers.
27
delta_wl_nm - Default wavelength spacing, in nm, as a float.
28
29
DEFAULT_DISPLAY_INTENSITY - Default assumed intensity of monitor display, in W/m^2
30
31
def init (monitor_intensity = DEFAULT_DISPLAY_INTENSITY) -
32
Initialization of color matching curves. Called at module startup with default arguments.
33
This can be called again to change the assumed display intensity.
34
35
def empty_spectrum () -
36
Get a black (no intensity) ColorPy spectrum.
37
38
This is a 2D numpy array, with one row for each wavelength in the visible range,
39
360 nm to 830 nm, with a spacing of delta_wl_nm (1.0 nm), and two columns.
40
The first column is filled with the wavelength [nm].
41
The second column is filled with 0.0. It should later be filled with the intensity.
42
43
The result can be passed to xyz_from_spectrum() to convert to an xyz color.
44
45
def xyz_from_wavelength (wl_nm) -
46
Given a wavelength (nm), return the corresponding xyz color, for unit intensity.
47
48
def xyz_from_spectrum (spectrum) -
49
Determine the xyz color of the spectrum.
50
51
The spectrum is assumed to be a 2D numpy array, with a row for each wavelength,
52
and two columns. The first column should hold the wavelength (nm), and the
53
second should hold the light intensity. The set of wavelengths can be arbitrary,
54
it does not have to be the set that empty_spectrum() returns.
55
56
def get_normalized_spectral_line_colors (
57
brightness = 1.0,
58
num_purples = 0,
59
dwl_angstroms = 10):
60
Get an array of xyz colors covering the visible spectrum.
61
Optionally add a number of 'purples', which are colors interpolated between the color
62
of the lowest wavelength (violet) and the highest (red).
63
64
brightness - Desired maximum rgb component of each color. Default 1.0. (Maxiumum displayable brightness)
65
num_purples - Number of colors to interpolate in the 'purple' range. Default 0. (No purples)
66
dwl_angstroms - Wavelength separation, in angstroms (0.1 nm). Default 10 A. (1 nm spacing)
67
68
References:
69
70
Wyszecki and Stiles, Color Science: Concepts and Methods, Quantitative Data and Formulae,
71
2nd edition, John Wiley, 1982. Wiley Classics Library Edition 2000. ISBN 0-471-39918-3.
72
73
CVRL Color and Vision Database - http://cvrl.ioo.ucl.ac.uk/index.htm - (accessed 17 Sep 2008)
74
Color and Vision Research Laboratories.
75
Provides a set of data sets related to color vision.
76
ColorPy uses the tables from this site for the 1931 CIE XYZ matching functions,
77
and for Illuminant D65, both at 1 nm wavelength increments.
78
79
CIE Standards - http://cvrl.ioo.ucl.ac.uk/cie.htm - (accessed 17 Sep 2008)
80
CIE standards as maintained by CVRL.
81
The 1931 CIE XYZ and D65 tables that ColorPy uses were obtained from the following files, linked here:
82
http://cvrl.ioo.ucl.ac.uk/database/data/cmfs/ciexyz31_1.txt
83
http://cvrl.ioo.ucl.ac.uk/database/data/cie/Illuminantd65.txt
84
85
CIE International Commission on Illumination - http://www.cie.co.at/ - (accessed 17 Sep 2008)
86
Official website of the CIE.
87
There are tables of the standard functions (matching functions, illuminants) here:
88
http://www.cie.co.at/main/freepubs.html
89
http://www.cie.co.at/publ/abst/datatables15_2004/x2.txt
90
http://www.cie.co.at/publ/abst/datatables15_2004/y2.txt
91
http://www.cie.co.at/publ/abst/datatables15_2004/z2.txt
92
http://www.cie.co.at/publ/abst/datatables15_2004/sid65.txt
93
ColorPy does not use these specific files.
94
95
Charles Poynton - Frequently asked questions about Gamma and Color,
96
posted to comp.graphics.algorithms, 25 Jan 1995.
97
98
License:
99
100
Copyright (C) 2008 Mark Kness
101
102
Author - Mark Kness - [email protected]
103
104
This file is part of ColorPy.
105
106
ColorPy is free software: you can redistribute it and/or modify
107
it under the terms of the GNU Lesser General Public License as
108
published by the Free Software Foundation, either version 3 of
109
the License, or (at your option) any later version.
110
111
ColorPy is distributed in the hope that it will be useful,
112
but WITHOUT ANY WARRANTY; without even the implied warranty of
113
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
114
GNU Lesser General Public License for more details.
115
116
You should have received a copy of the GNU Lesser General Public License
117
along with ColorPy. If not, see <http://www.gnu.org/licenses/>.
118
'''
119
import math, numpy
120
121
import colormodels
122
123
# Assumed physical brightness of the monitor [W/m^2]
124
# 80 cd/m^2 * 20.3 mW/cd (assuming light at 556 nm)
125
DEFAULT_DISPLAY_INTENSITY = 1.624
126
127
# For reference, the physical luminance of several interesting objects ...
128
# All values in cd/m^2, where 1 cd = 1 candle = 20.3 milliwatts of light at 5560 A
129
# Typical monitor at full blast = 80 cd/m^2 [Poynton, Color FAQ, p.4]
130
# Candle = 5000
131
# 40W Frosted Light Bulb = 25000
132
# Clear sky = 4000
133
# Moon = 2500
134
# Sun = 1.6 x 10^9
135
#
136
# an advertised LCD display (2008) = 300 cd/m^2
137
138
# table of 1931 CIE XYZ matching functions.
139
# data from: http://cvrl.ioo.ucl.ac.uk/database/data/cmfs/ciexyz31_1.txt
140
# massaged into this format.
141
_CIEXYZ_1931_table = [
142
[ 360, 0.000129900000, 0.000003917000, 0.000606100000 ],
143
[ 361, 0.000145847000, 0.000004393581, 0.000680879200 ],
144
[ 362, 0.000163802100, 0.000004929604, 0.000765145600 ],
145
[ 363, 0.000184003700, 0.000005532136, 0.000860012400 ],
146
[ 364, 0.000206690200, 0.000006208245, 0.000966592800 ],
147
[ 365, 0.000232100000, 0.000006965000, 0.001086000000 ],
148
[ 366, 0.000260728000, 0.000007813219, 0.001220586000 ],
149
[ 367, 0.000293075000, 0.000008767336, 0.001372729000 ],
150
[ 368, 0.000329388000, 0.000009839844, 0.001543579000 ],
151
[ 369, 0.000369914000, 0.000011043230, 0.001734286000 ],
152
[ 370, 0.000414900000, 0.000012390000, 0.001946000000 ],
153
[ 371, 0.000464158700, 0.000013886410, 0.002177777000 ],
154
[ 372, 0.000518986000, 0.000015557280, 0.002435809000 ],
155
[ 373, 0.000581854000, 0.000017442960, 0.002731953000 ],
156
[ 374, 0.000655234700, 0.000019583750, 0.003078064000 ],
157
[ 375, 0.000741600000, 0.000022020000, 0.003486000000 ],
158
[ 376, 0.000845029600, 0.000024839650, 0.003975227000 ],
159
[ 377, 0.000964526800, 0.000028041260, 0.004540880000 ],
160
[ 378, 0.001094949000, 0.000031531040, 0.005158320000 ],
161
[ 379, 0.001231154000, 0.000035215210, 0.005802907000 ],
162
[ 380, 0.001368000000, 0.000039000000, 0.006450001000 ],
163
[ 381, 0.001502050000, 0.000042826400, 0.007083216000 ],
164
[ 382, 0.001642328000, 0.000046914600, 0.007745488000 ],
165
[ 383, 0.001802382000, 0.000051589600, 0.008501152000 ],
166
[ 384, 0.001995757000, 0.000057176400, 0.009414544000 ],
167
[ 385, 0.002236000000, 0.000064000000, 0.010549990000 ],
168
[ 386, 0.002535385000, 0.000072344210, 0.011965800000 ],
169
[ 387, 0.002892603000, 0.000082212240, 0.013655870000 ],
170
[ 388, 0.003300829000, 0.000093508160, 0.015588050000 ],
171
[ 389, 0.003753236000, 0.000106136100, 0.017730150000 ],
172
[ 390, 0.004243000000, 0.000120000000, 0.020050010000 ],
173
[ 391, 0.004762389000, 0.000134984000, 0.022511360000 ],
174
[ 392, 0.005330048000, 0.000151492000, 0.025202880000 ],
175
[ 393, 0.005978712000, 0.000170208000, 0.028279720000 ],
176
[ 394, 0.006741117000, 0.000191816000, 0.031897040000 ],
177
[ 395, 0.007650000000, 0.000217000000, 0.036210000000 ],
178
[ 396, 0.008751373000, 0.000246906700, 0.041437710000 ],
179
[ 397, 0.010028880000, 0.000281240000, 0.047503720000 ],
180
[ 398, 0.011421700000, 0.000318520000, 0.054119880000 ],
181
[ 399, 0.012869010000, 0.000357266700, 0.060998030000 ],
182
[ 400, 0.014310000000, 0.000396000000, 0.067850010000 ],
183
[ 401, 0.015704430000, 0.000433714700, 0.074486320000 ],
184
[ 402, 0.017147440000, 0.000473024000, 0.081361560000 ],
185
[ 403, 0.018781220000, 0.000517876000, 0.089153640000 ],
186
[ 404, 0.020748010000, 0.000572218700, 0.098540480000 ],
187
[ 405, 0.023190000000, 0.000640000000, 0.110200000000 ],
188
[ 406, 0.026207360000, 0.000724560000, 0.124613300000 ],
189
[ 407, 0.029782480000, 0.000825500000, 0.141701700000 ],
190
[ 408, 0.033880920000, 0.000941160000, 0.161303500000 ],
191
[ 409, 0.038468240000, 0.001069880000, 0.183256800000 ],
192
[ 410, 0.043510000000, 0.001210000000, 0.207400000000 ],
193
[ 411, 0.048995600000, 0.001362091000, 0.233692100000 ],
194
[ 412, 0.055022600000, 0.001530752000, 0.262611400000 ],
195
[ 413, 0.061718800000, 0.001720368000, 0.294774600000 ],
196
[ 414, 0.069212000000, 0.001935323000, 0.330798500000 ],
197
[ 415, 0.077630000000, 0.002180000000, 0.371300000000 ],
198
[ 416, 0.086958110000, 0.002454800000, 0.416209100000 ],
199
[ 417, 0.097176720000, 0.002764000000, 0.465464200000 ],
200
[ 418, 0.108406300000, 0.003117800000, 0.519694800000 ],
201
[ 419, 0.120767200000, 0.003526400000, 0.579530300000 ],
202
[ 420, 0.134380000000, 0.004000000000, 0.645600000000 ],
203
[ 421, 0.149358200000, 0.004546240000, 0.718483800000 ],
204
[ 422, 0.165395700000, 0.005159320000, 0.796713300000 ],
205
[ 423, 0.181983100000, 0.005829280000, 0.877845900000 ],
206
[ 424, 0.198611000000, 0.006546160000, 0.959439000000 ],
207
[ 425, 0.214770000000, 0.007300000000, 1.039050100000 ],
208
[ 426, 0.230186800000, 0.008086507000, 1.115367300000 ],
209
[ 427, 0.244879700000, 0.008908720000, 1.188497100000 ],
210
[ 428, 0.258777300000, 0.009767680000, 1.258123300000 ],
211
[ 429, 0.271807900000, 0.010664430000, 1.323929600000 ],
212
[ 430, 0.283900000000, 0.011600000000, 1.385600000000 ],
213
[ 431, 0.294943800000, 0.012573170000, 1.442635200000 ],
214
[ 432, 0.304896500000, 0.013582720000, 1.494803500000 ],
215
[ 433, 0.313787300000, 0.014629680000, 1.542190300000 ],
216
[ 434, 0.321645400000, 0.015715090000, 1.584880700000 ],
217
[ 435, 0.328500000000, 0.016840000000, 1.622960000000 ],
218
[ 436, 0.334351300000, 0.018007360000, 1.656404800000 ],
219
[ 437, 0.339210100000, 0.019214480000, 1.685295900000 ],
220
[ 438, 0.343121300000, 0.020453920000, 1.709874500000 ],
221
[ 439, 0.346129600000, 0.021718240000, 1.730382100000 ],
222
[ 440, 0.348280000000, 0.023000000000, 1.747060000000 ],
223
[ 441, 0.349599900000, 0.024294610000, 1.760044600000 ],
224
[ 442, 0.350147400000, 0.025610240000, 1.769623300000 ],
225
[ 443, 0.350013000000, 0.026958570000, 1.776263700000 ],
226
[ 444, 0.349287000000, 0.028351250000, 1.780433400000 ],
227
[ 445, 0.348060000000, 0.029800000000, 1.782600000000 ],
228
[ 446, 0.346373300000, 0.031310830000, 1.782968200000 ],
229
[ 447, 0.344262400000, 0.032883680000, 1.781699800000 ],
230
[ 448, 0.341808800000, 0.034521120000, 1.779198200000 ],
231
[ 449, 0.339094100000, 0.036225710000, 1.775867100000 ],
232
[ 450, 0.336200000000, 0.038000000000, 1.772110000000 ],
233
[ 451, 0.333197700000, 0.039846670000, 1.768258900000 ],
234
[ 452, 0.330041100000, 0.041768000000, 1.764039000000 ],
235
[ 453, 0.326635700000, 0.043766000000, 1.758943800000 ],
236
[ 454, 0.322886800000, 0.045842670000, 1.752466300000 ],
237
[ 455, 0.318700000000, 0.048000000000, 1.744100000000 ],
238
[ 456, 0.314025100000, 0.050243680000, 1.733559500000 ],
239
[ 457, 0.308884000000, 0.052573040000, 1.720858100000 ],
240
[ 458, 0.303290400000, 0.054980560000, 1.705936900000 ],
241
[ 459, 0.297257900000, 0.057458720000, 1.688737200000 ],
242
[ 460, 0.290800000000, 0.060000000000, 1.669200000000 ],
243
[ 461, 0.283970100000, 0.062601970000, 1.647528700000 ],
244
[ 462, 0.276721400000, 0.065277520000, 1.623412700000 ],
245
[ 463, 0.268917800000, 0.068042080000, 1.596022300000 ],
246
[ 464, 0.260422700000, 0.070911090000, 1.564528000000 ],
247
[ 465, 0.251100000000, 0.073900000000, 1.528100000000 ],
248
[ 466, 0.240847500000, 0.077016000000, 1.486111400000 ],
249
[ 467, 0.229851200000, 0.080266400000, 1.439521500000 ],
250
[ 468, 0.218407200000, 0.083666800000, 1.389879900000 ],
251
[ 469, 0.206811500000, 0.087232800000, 1.338736200000 ],
252
[ 470, 0.195360000000, 0.090980000000, 1.287640000000 ],
253
[ 471, 0.184213600000, 0.094917550000, 1.237422300000 ],
254
[ 472, 0.173327300000, 0.099045840000, 1.187824300000 ],
255
[ 473, 0.162688100000, 0.103367400000, 1.138761100000 ],
256
[ 474, 0.152283300000, 0.107884600000, 1.090148000000 ],
257
[ 475, 0.142100000000, 0.112600000000, 1.041900000000 ],
258
[ 476, 0.132178600000, 0.117532000000, 0.994197600000 ],
259
[ 477, 0.122569600000, 0.122674400000, 0.947347300000 ],
260
[ 478, 0.113275200000, 0.127992800000, 0.901453100000 ],
261
[ 479, 0.104297900000, 0.133452800000, 0.856619300000 ],
262
[ 480, 0.095640000000, 0.139020000000, 0.812950100000 ],
263
[ 481, 0.087299550000, 0.144676400000, 0.770517300000 ],
264
[ 482, 0.079308040000, 0.150469300000, 0.729444800000 ],
265
[ 483, 0.071717760000, 0.156461900000, 0.689913600000 ],
266
[ 484, 0.064580990000, 0.162717700000, 0.652104900000 ],
267
[ 485, 0.057950010000, 0.169300000000, 0.616200000000 ],
268
[ 486, 0.051862110000, 0.176243100000, 0.582328600000 ],
269
[ 487, 0.046281520000, 0.183558100000, 0.550416200000 ],
270
[ 488, 0.041150880000, 0.191273500000, 0.520337600000 ],
271
[ 489, 0.036412830000, 0.199418000000, 0.491967300000 ],
272
[ 490, 0.032010000000, 0.208020000000, 0.465180000000 ],
273
[ 491, 0.027917200000, 0.217119900000, 0.439924600000 ],
274
[ 492, 0.024144400000, 0.226734500000, 0.416183600000 ],
275
[ 493, 0.020687000000, 0.236857100000, 0.393882200000 ],
276
[ 494, 0.017540400000, 0.247481200000, 0.372945900000 ],
277
[ 495, 0.014700000000, 0.258600000000, 0.353300000000 ],
278
[ 496, 0.012161790000, 0.270184900000, 0.334857800000 ],
279
[ 497, 0.009919960000, 0.282293900000, 0.317552100000 ],
280
[ 498, 0.007967240000, 0.295050500000, 0.301337500000 ],
281
[ 499, 0.006296346000, 0.308578000000, 0.286168600000 ],
282
[ 500, 0.004900000000, 0.323000000000, 0.272000000000 ],
283
[ 501, 0.003777173000, 0.338402100000, 0.258817100000 ],
284
[ 502, 0.002945320000, 0.354685800000, 0.246483800000 ],
285
[ 503, 0.002424880000, 0.371698600000, 0.234771800000 ],
286
[ 504, 0.002236293000, 0.389287500000, 0.223453300000 ],
287
[ 505, 0.002400000000, 0.407300000000, 0.212300000000 ],
288
[ 506, 0.002925520000, 0.425629900000, 0.201169200000 ],
289
[ 507, 0.003836560000, 0.444309600000, 0.190119600000 ],
290
[ 508, 0.005174840000, 0.463394400000, 0.179225400000 ],
291
[ 509, 0.006982080000, 0.482939500000, 0.168560800000 ],
292
[ 510, 0.009300000000, 0.503000000000, 0.158200000000 ],
293
[ 511, 0.012149490000, 0.523569300000, 0.148138300000 ],
294
[ 512, 0.015535880000, 0.544512000000, 0.138375800000 ],
295
[ 513, 0.019477520000, 0.565690000000, 0.128994200000 ],
296
[ 514, 0.023992770000, 0.586965300000, 0.120075100000 ],
297
[ 515, 0.029100000000, 0.608200000000, 0.111700000000 ],
298
[ 516, 0.034814850000, 0.629345600000, 0.103904800000 ],
299
[ 517, 0.041120160000, 0.650306800000, 0.096667480000 ],
300
[ 518, 0.047985040000, 0.670875200000, 0.089982720000 ],
301
[ 519, 0.055378610000, 0.690842400000, 0.083845310000 ],
302
[ 520, 0.063270000000, 0.710000000000, 0.078249990000 ],
303
[ 521, 0.071635010000, 0.728185200000, 0.073208990000 ],
304
[ 522, 0.080462240000, 0.745463600000, 0.068678160000 ],
305
[ 523, 0.089739960000, 0.761969400000, 0.064567840000 ],
306
[ 524, 0.099456450000, 0.777836800000, 0.060788350000 ],
307
[ 525, 0.109600000000, 0.793200000000, 0.057250010000 ],
308
[ 526, 0.120167400000, 0.808110400000, 0.053904350000 ],
309
[ 527, 0.131114500000, 0.822496200000, 0.050746640000 ],
310
[ 528, 0.142367900000, 0.836306800000, 0.047752760000 ],
311
[ 529, 0.153854200000, 0.849491600000, 0.044898590000 ],
312
[ 530, 0.165500000000, 0.862000000000, 0.042160000000 ],
313
[ 531, 0.177257100000, 0.873810800000, 0.039507280000 ],
314
[ 532, 0.189140000000, 0.884962400000, 0.036935640000 ],
315
[ 533, 0.201169400000, 0.895493600000, 0.034458360000 ],
316
[ 534, 0.213365800000, 0.905443200000, 0.032088720000 ],
317
[ 535, 0.225749900000, 0.914850100000, 0.029840000000 ],
318
[ 536, 0.238320900000, 0.923734800000, 0.027711810000 ],
319
[ 537, 0.251066800000, 0.932092400000, 0.025694440000 ],
320
[ 538, 0.263992200000, 0.939922600000, 0.023787160000 ],
321
[ 539, 0.277101700000, 0.947225200000, 0.021989250000 ],
322
[ 540, 0.290400000000, 0.954000000000, 0.020300000000 ],
323
[ 541, 0.303891200000, 0.960256100000, 0.018718050000 ],
324
[ 542, 0.317572600000, 0.966007400000, 0.017240360000 ],
325
[ 543, 0.331438400000, 0.971260600000, 0.015863640000 ],
326
[ 544, 0.345482800000, 0.976022500000, 0.014584610000 ],
327
[ 545, 0.359700000000, 0.980300000000, 0.013400000000 ],
328
[ 546, 0.374083900000, 0.984092400000, 0.012307230000 ],
329
[ 547, 0.388639600000, 0.987418200000, 0.011301880000 ],
330
[ 548, 0.403378400000, 0.990312800000, 0.010377920000 ],
331
[ 549, 0.418311500000, 0.992811600000, 0.009529306000 ],
332
[ 550, 0.433449900000, 0.994950100000, 0.008749999000 ],
333
[ 551, 0.448795300000, 0.996710800000, 0.008035200000 ],
334
[ 552, 0.464336000000, 0.998098300000, 0.007381600000 ],
335
[ 553, 0.480064000000, 0.999112000000, 0.006785400000 ],
336
[ 554, 0.495971300000, 0.999748200000, 0.006242800000 ],
337
[ 555, 0.512050100000, 1.000000000000, 0.005749999000 ],
338
[ 556, 0.528295900000, 0.999856700000, 0.005303600000 ],
339
[ 557, 0.544691600000, 0.999304600000, 0.004899800000 ],
340
[ 558, 0.561209400000, 0.998325500000, 0.004534200000 ],
341
[ 559, 0.577821500000, 0.996898700000, 0.004202400000 ],
342
[ 560, 0.594500000000, 0.995000000000, 0.003900000000 ],
343
[ 561, 0.611220900000, 0.992600500000, 0.003623200000 ],
344
[ 562, 0.627975800000, 0.989742600000, 0.003370600000 ],
345
[ 563, 0.644760200000, 0.986444400000, 0.003141400000 ],
346
[ 564, 0.661569700000, 0.982724100000, 0.002934800000 ],
347
[ 565, 0.678400000000, 0.978600000000, 0.002749999000 ],
348
[ 566, 0.695239200000, 0.974083700000, 0.002585200000 ],
349
[ 567, 0.712058600000, 0.969171200000, 0.002438600000 ],
350
[ 568, 0.728828400000, 0.963856800000, 0.002309400000 ],
351
[ 569, 0.745518800000, 0.958134900000, 0.002196800000 ],
352
[ 570, 0.762100000000, 0.952000000000, 0.002100000000 ],
353
[ 571, 0.778543200000, 0.945450400000, 0.002017733000 ],
354
[ 572, 0.794825600000, 0.938499200000, 0.001948200000 ],
355
[ 573, 0.810926400000, 0.931162800000, 0.001889800000 ],
356
[ 574, 0.826824800000, 0.923457600000, 0.001840933000 ],
357
[ 575, 0.842500000000, 0.915400000000, 0.001800000000 ],
358
[ 576, 0.857932500000, 0.907006400000, 0.001766267000 ],
359
[ 577, 0.873081600000, 0.898277200000, 0.001737800000 ],
360
[ 578, 0.887894400000, 0.889204800000, 0.001711200000 ],
361
[ 579, 0.902318100000, 0.879781600000, 0.001683067000 ],
362
[ 580, 0.916300000000, 0.870000000000, 0.001650001000 ],
363
[ 581, 0.929799500000, 0.859861300000, 0.001610133000 ],
364
[ 582, 0.942798400000, 0.849392000000, 0.001564400000 ],
365
[ 583, 0.955277600000, 0.838622000000, 0.001513600000 ],
366
[ 584, 0.967217900000, 0.827581300000, 0.001458533000 ],
367
[ 585, 0.978600000000, 0.816300000000, 0.001400000000 ],
368
[ 586, 0.989385600000, 0.804794700000, 0.001336667000 ],
369
[ 587, 0.999548800000, 0.793082000000, 0.001270000000 ],
370
[ 588, 1.009089200000, 0.781192000000, 0.001205000000 ],
371
[ 589, 1.018006400000, 0.769154700000, 0.001146667000 ],
372
[ 590, 1.026300000000, 0.757000000000, 0.001100000000 ],
373
[ 591, 1.033982700000, 0.744754100000, 0.001068800000 ],
374
[ 592, 1.040986000000, 0.732422400000, 0.001049400000 ],
375
[ 593, 1.047188000000, 0.720003600000, 0.001035600000 ],
376
[ 594, 1.052466700000, 0.707496500000, 0.001021200000 ],
377
[ 595, 1.056700000000, 0.694900000000, 0.001000000000 ],
378
[ 596, 1.059794400000, 0.682219200000, 0.000968640000 ],
379
[ 597, 1.061799200000, 0.669471600000, 0.000929920000 ],
380
[ 598, 1.062806800000, 0.656674400000, 0.000886880000 ],
381
[ 599, 1.062909600000, 0.643844800000, 0.000842560000 ],
382
[ 600, 1.062200000000, 0.631000000000, 0.000800000000 ],
383
[ 601, 1.060735200000, 0.618155500000, 0.000760960000 ],
384
[ 602, 1.058443600000, 0.605314400000, 0.000723680000 ],
385
[ 603, 1.055224400000, 0.592475600000, 0.000685920000 ],
386
[ 604, 1.050976800000, 0.579637900000, 0.000645440000 ],
387
[ 605, 1.045600000000, 0.566800000000, 0.000600000000 ],
388
[ 606, 1.039036900000, 0.553961100000, 0.000547866700 ],
389
[ 607, 1.031360800000, 0.541137200000, 0.000491600000 ],
390
[ 608, 1.022666200000, 0.528352800000, 0.000435400000 ],
391
[ 609, 1.013047700000, 0.515632300000, 0.000383466700 ],
392
[ 610, 1.002600000000, 0.503000000000, 0.000340000000 ],
393
[ 611, 0.991367500000, 0.490468800000, 0.000307253300 ],
394
[ 612, 0.979331400000, 0.478030400000, 0.000283160000 ],
395
[ 613, 0.966491600000, 0.465677600000, 0.000265440000 ],
396
[ 614, 0.952847900000, 0.453403200000, 0.000251813300 ],
397
[ 615, 0.938400000000, 0.441200000000, 0.000240000000 ],
398
[ 616, 0.923194000000, 0.429080000000, 0.000229546700 ],
399
[ 617, 0.907244000000, 0.417036000000, 0.000220640000 ],
400
[ 618, 0.890502000000, 0.405032000000, 0.000211960000 ],
401
[ 619, 0.872920000000, 0.393032000000, 0.000202186700 ],
402
[ 620, 0.854449900000, 0.381000000000, 0.000190000000 ],
403
[ 621, 0.835084000000, 0.368918400000, 0.000174213300 ],
404
[ 622, 0.814946000000, 0.356827200000, 0.000155640000 ],
405
[ 623, 0.794186000000, 0.344776800000, 0.000135960000 ],
406
[ 624, 0.772954000000, 0.332817600000, 0.000116853300 ],
407
[ 625, 0.751400000000, 0.321000000000, 0.000100000000 ],
408
[ 626, 0.729583600000, 0.309338100000, 0.000086133330 ],
409
[ 627, 0.707588800000, 0.297850400000, 0.000074600000 ],
410
[ 628, 0.685602200000, 0.286593600000, 0.000065000000 ],
411
[ 629, 0.663810400000, 0.275624500000, 0.000056933330 ],
412
[ 630, 0.642400000000, 0.265000000000, 0.000049999990 ],
413
[ 631, 0.621514900000, 0.254763200000, 0.000044160000 ],
414
[ 632, 0.601113800000, 0.244889600000, 0.000039480000 ],
415
[ 633, 0.581105200000, 0.235334400000, 0.000035720000 ],
416
[ 634, 0.561397700000, 0.226052800000, 0.000032640000 ],
417
[ 635, 0.541900000000, 0.217000000000, 0.000030000000 ],
418
[ 636, 0.522599500000, 0.208161600000, 0.000027653330 ],
419
[ 637, 0.503546400000, 0.199548800000, 0.000025560000 ],
420
[ 638, 0.484743600000, 0.191155200000, 0.000023640000 ],
421
[ 639, 0.466193900000, 0.182974400000, 0.000021813330 ],
422
[ 640, 0.447900000000, 0.175000000000, 0.000020000000 ],
423
[ 641, 0.429861300000, 0.167223500000, 0.000018133330 ],
424
[ 642, 0.412098000000, 0.159646400000, 0.000016200000 ],
425
[ 643, 0.394644000000, 0.152277600000, 0.000014200000 ],
426
[ 644, 0.377533300000, 0.145125900000, 0.000012133330 ],
427
[ 645, 0.360800000000, 0.138200000000, 0.000010000000 ],
428
[ 646, 0.344456300000, 0.131500300000, 0.000007733333 ],
429
[ 647, 0.328516800000, 0.125024800000, 0.000005400000 ],
430
[ 648, 0.313019200000, 0.118779200000, 0.000003200000 ],
431
[ 649, 0.298001100000, 0.112769100000, 0.000001333333 ],
432
[ 650, 0.283500000000, 0.107000000000, 0.000000000000 ],
433
[ 651, 0.269544800000, 0.101476200000, 0.000000000000 ],
434
[ 652, 0.256118400000, 0.096188640000, 0.000000000000 ],
435
[ 653, 0.243189600000, 0.091122960000, 0.000000000000 ],
436
[ 654, 0.230727200000, 0.086264850000, 0.000000000000 ],
437
[ 655, 0.218700000000, 0.081600000000, 0.000000000000 ],
438
[ 656, 0.207097100000, 0.077120640000, 0.000000000000 ],
439
[ 657, 0.195923200000, 0.072825520000, 0.000000000000 ],
440
[ 658, 0.185170800000, 0.068710080000, 0.000000000000 ],
441
[ 659, 0.174832300000, 0.064769760000, 0.000000000000 ],
442
[ 660, 0.164900000000, 0.061000000000, 0.000000000000 ],
443
[ 661, 0.155366700000, 0.057396210000, 0.000000000000 ],
444
[ 662, 0.146230000000, 0.053955040000, 0.000000000000 ],
445
[ 663, 0.137490000000, 0.050673760000, 0.000000000000 ],
446
[ 664, 0.129146700000, 0.047549650000, 0.000000000000 ],
447
[ 665, 0.121200000000, 0.044580000000, 0.000000000000 ],
448
[ 666, 0.113639700000, 0.041758720000, 0.000000000000 ],
449
[ 667, 0.106465000000, 0.039084960000, 0.000000000000 ],
450
[ 668, 0.099690440000, 0.036563840000, 0.000000000000 ],
451
[ 669, 0.093330610000, 0.034200480000, 0.000000000000 ],
452
[ 670, 0.087400000000, 0.032000000000, 0.000000000000 ],
453
[ 671, 0.081900960000, 0.029962610000, 0.000000000000 ],
454
[ 672, 0.076804280000, 0.028076640000, 0.000000000000 ],
455
[ 673, 0.072077120000, 0.026329360000, 0.000000000000 ],
456
[ 674, 0.067686640000, 0.024708050000, 0.000000000000 ],
457
[ 675, 0.063600000000, 0.023200000000, 0.000000000000 ],
458
[ 676, 0.059806850000, 0.021800770000, 0.000000000000 ],
459
[ 677, 0.056282160000, 0.020501120000, 0.000000000000 ],
460
[ 678, 0.052971040000, 0.019281080000, 0.000000000000 ],
461
[ 679, 0.049818610000, 0.018120690000, 0.000000000000 ],
462
[ 680, 0.046770000000, 0.017000000000, 0.000000000000 ],
463
[ 681, 0.043784050000, 0.015903790000, 0.000000000000 ],
464
[ 682, 0.040875360000, 0.014837180000, 0.000000000000 ],
465
[ 683, 0.038072640000, 0.013810680000, 0.000000000000 ],
466
[ 684, 0.035404610000, 0.012834780000, 0.000000000000 ],
467
[ 685, 0.032900000000, 0.011920000000, 0.000000000000 ],
468
[ 686, 0.030564190000, 0.011068310000, 0.000000000000 ],
469
[ 687, 0.028380560000, 0.010273390000, 0.000000000000 ],
470
[ 688, 0.026344840000, 0.009533311000, 0.000000000000 ],
471
[ 689, 0.024452750000, 0.008846157000, 0.000000000000 ],
472
[ 690, 0.022700000000, 0.008210000000, 0.000000000000 ],
473
[ 691, 0.021084290000, 0.007623781000, 0.000000000000 ],
474
[ 692, 0.019599880000, 0.007085424000, 0.000000000000 ],
475
[ 693, 0.018237320000, 0.006591476000, 0.000000000000 ],
476
[ 694, 0.016987170000, 0.006138485000, 0.000000000000 ],
477
[ 695, 0.015840000000, 0.005723000000, 0.000000000000 ],
478
[ 696, 0.014790640000, 0.005343059000, 0.000000000000 ],
479
[ 697, 0.013831320000, 0.004995796000, 0.000000000000 ],
480
[ 698, 0.012948680000, 0.004676404000, 0.000000000000 ],
481
[ 699, 0.012129200000, 0.004380075000, 0.000000000000 ],
482
[ 700, 0.011359160000, 0.004102000000, 0.000000000000 ],
483
[ 701, 0.010629350000, 0.003838453000, 0.000000000000 ],
484
[ 702, 0.009938846000, 0.003589099000, 0.000000000000 ],
485
[ 703, 0.009288422000, 0.003354219000, 0.000000000000 ],
486
[ 704, 0.008678854000, 0.003134093000, 0.000000000000 ],
487
[ 705, 0.008110916000, 0.002929000000, 0.000000000000 ],
488
[ 706, 0.007582388000, 0.002738139000, 0.000000000000 ],
489
[ 707, 0.007088746000, 0.002559876000, 0.000000000000 ],
490
[ 708, 0.006627313000, 0.002393244000, 0.000000000000 ],
491
[ 709, 0.006195408000, 0.002237275000, 0.000000000000 ],
492
[ 710, 0.005790346000, 0.002091000000, 0.000000000000 ],
493
[ 711, 0.005409826000, 0.001953587000, 0.000000000000 ],
494
[ 712, 0.005052583000, 0.001824580000, 0.000000000000 ],
495
[ 713, 0.004717512000, 0.001703580000, 0.000000000000 ],
496
[ 714, 0.004403507000, 0.001590187000, 0.000000000000 ],
497
[ 715, 0.004109457000, 0.001484000000, 0.000000000000 ],
498
[ 716, 0.003833913000, 0.001384496000, 0.000000000000 ],
499
[ 717, 0.003575748000, 0.001291268000, 0.000000000000 ],
500
[ 718, 0.003334342000, 0.001204092000, 0.000000000000 ],
501
[ 719, 0.003109075000, 0.001122744000, 0.000000000000 ],
502
[ 720, 0.002899327000, 0.001047000000, 0.000000000000 ],
503
[ 721, 0.002704348000, 0.000976589600, 0.000000000000 ],
504
[ 722, 0.002523020000, 0.000911108800, 0.000000000000 ],
505
[ 723, 0.002354168000, 0.000850133200, 0.000000000000 ],
506
[ 724, 0.002196616000, 0.000793238400, 0.000000000000 ],
507
[ 725, 0.002049190000, 0.000740000000, 0.000000000000 ],
508
[ 726, 0.001910960000, 0.000690082700, 0.000000000000 ],
509
[ 727, 0.001781438000, 0.000643310000, 0.000000000000 ],
510
[ 728, 0.001660110000, 0.000599496000, 0.000000000000 ],
511
[ 729, 0.001546459000, 0.000558454700, 0.000000000000 ],
512
[ 730, 0.001439971000, 0.000520000000, 0.000000000000 ],
513
[ 731, 0.001340042000, 0.000483913600, 0.000000000000 ],
514
[ 732, 0.001246275000, 0.000450052800, 0.000000000000 ],
515
[ 733, 0.001158471000, 0.000418345200, 0.000000000000 ],
516
[ 734, 0.001076430000, 0.000388718400, 0.000000000000 ],
517
[ 735, 0.000999949300, 0.000361100000, 0.000000000000 ],
518
[ 736, 0.000928735800, 0.000335383500, 0.000000000000 ],
519
[ 737, 0.000862433200, 0.000311440400, 0.000000000000 ],
520
[ 738, 0.000800750300, 0.000289165600, 0.000000000000 ],
521
[ 739, 0.000743396000, 0.000268453900, 0.000000000000 ],
522
[ 740, 0.000690078600, 0.000249200000, 0.000000000000 ],
523
[ 741, 0.000640515600, 0.000231301900, 0.000000000000 ],
524
[ 742, 0.000594502100, 0.000214685600, 0.000000000000 ],
525
[ 743, 0.000551864600, 0.000199288400, 0.000000000000 ],
526
[ 744, 0.000512429000, 0.000185047500, 0.000000000000 ],
527
[ 745, 0.000476021300, 0.000171900000, 0.000000000000 ],
528
[ 746, 0.000442453600, 0.000159778100, 0.000000000000 ],
529
[ 747, 0.000411511700, 0.000148604400, 0.000000000000 ],
530
[ 748, 0.000382981400, 0.000138301600, 0.000000000000 ],
531
[ 749, 0.000356649100, 0.000128792500, 0.000000000000 ],
532
[ 750, 0.000332301100, 0.000120000000, 0.000000000000 ],
533
[ 751, 0.000309758600, 0.000111859500, 0.000000000000 ],
534
[ 752, 0.000288887100, 0.000104322400, 0.000000000000 ],
535
[ 753, 0.000269539400, 0.000097335600, 0.000000000000 ],
536
[ 754, 0.000251568200, 0.000090845870, 0.000000000000 ],
537
[ 755, 0.000234826100, 0.000084800000, 0.000000000000 ],
538
[ 756, 0.000219171000, 0.000079146670, 0.000000000000 ],
539
[ 757, 0.000204525800, 0.000073858000, 0.000000000000 ],
540
[ 758, 0.000190840500, 0.000068916000, 0.000000000000 ],
541
[ 759, 0.000178065400, 0.000064302670, 0.000000000000 ],
542
[ 760, 0.000166150500, 0.000060000000, 0.000000000000 ],
543
[ 761, 0.000155023600, 0.000055981870, 0.000000000000 ],
544
[ 762, 0.000144621900, 0.000052225600, 0.000000000000 ],
545
[ 763, 0.000134909800, 0.000048718400, 0.000000000000 ],
546
[ 764, 0.000125852000, 0.000045447470, 0.000000000000 ],
547
[ 765, 0.000117413000, 0.000042400000, 0.000000000000 ],
548
[ 766, 0.000109551500, 0.000039561040, 0.000000000000 ],
549
[ 767, 0.000102224500, 0.000036915120, 0.000000000000 ],
550
[ 768, 0.000095394450, 0.000034448680, 0.000000000000 ],
551
[ 769, 0.000089023900, 0.000032148160, 0.000000000000 ],
552
[ 770, 0.000083075270, 0.000030000000, 0.000000000000 ],
553
[ 771, 0.000077512690, 0.000027991250, 0.000000000000 ],
554
[ 772, 0.000072313040, 0.000026113560, 0.000000000000 ],
555
[ 773, 0.000067457780, 0.000024360240, 0.000000000000 ],
556
[ 774, 0.000062928440, 0.000022724610, 0.000000000000 ],
557
[ 775, 0.000058706520, 0.000021200000, 0.000000000000 ],
558
[ 776, 0.000054770280, 0.000019778550, 0.000000000000 ],
559
[ 777, 0.000051099180, 0.000018452850, 0.000000000000 ],
560
[ 778, 0.000047676540, 0.000017216870, 0.000000000000 ],
561
[ 779, 0.000044485670, 0.000016064590, 0.000000000000 ],
562
[ 780, 0.000041509940, 0.000014990000, 0.000000000000 ],
563
[ 781, 0.000038733240, 0.000013987280, 0.000000000000 ],
564
[ 782, 0.000036142030, 0.000013051550, 0.000000000000 ],
565
[ 783, 0.000033723520, 0.000012178180, 0.000000000000 ],
566
[ 784, 0.000031464870, 0.000011362540, 0.000000000000 ],
567
[ 785, 0.000029353260, 0.000010600000, 0.000000000000 ],
568
[ 786, 0.000027375730, 0.000009885877, 0.000000000000 ],
569
[ 787, 0.000025524330, 0.000009217304, 0.000000000000 ],
570
[ 788, 0.000023793760, 0.000008592362, 0.000000000000 ],
571
[ 789, 0.000022178700, 0.000008009133, 0.000000000000 ],
572
[ 790, 0.000020673830, 0.000007465700, 0.000000000000 ],
573
[ 791, 0.000019272260, 0.000006959567, 0.000000000000 ],
574
[ 792, 0.000017966400, 0.000006487995, 0.000000000000 ],
575
[ 793, 0.000016749910, 0.000006048699, 0.000000000000 ],
576
[ 794, 0.000015616480, 0.000005639396, 0.000000000000 ],
577
[ 795, 0.000014559770, 0.000005257800, 0.000000000000 ],
578
[ 796, 0.000013573870, 0.000004901771, 0.000000000000 ],
579
[ 797, 0.000012654360, 0.000004569720, 0.000000000000 ],
580
[ 798, 0.000011797230, 0.000004260194, 0.000000000000 ],
581
[ 799, 0.000010998440, 0.000003971739, 0.000000000000 ],
582
[ 800, 0.000010253980, 0.000003702900, 0.000000000000 ],
583
[ 801, 0.000009559646, 0.000003452163, 0.000000000000 ],
584
[ 802, 0.000008912044, 0.000003218302, 0.000000000000 ],
585
[ 803, 0.000008308358, 0.000003000300, 0.000000000000 ],
586
[ 804, 0.000007745769, 0.000002797139, 0.000000000000 ],
587
[ 805, 0.000007221456, 0.000002607800, 0.000000000000 ],
588
[ 806, 0.000006732475, 0.000002431220, 0.000000000000 ],
589
[ 807, 0.000006276423, 0.000002266531, 0.000000000000 ],
590
[ 808, 0.000005851304, 0.000002113013, 0.000000000000 ],
591
[ 809, 0.000005455118, 0.000001969943, 0.000000000000 ],
592
[ 810, 0.000005085868, 0.000001836600, 0.000000000000 ],
593
[ 811, 0.000004741466, 0.000001712230, 0.000000000000 ],
594
[ 812, 0.000004420236, 0.000001596228, 0.000000000000 ],
595
[ 813, 0.000004120783, 0.000001488090, 0.000000000000 ],
596
[ 814, 0.000003841716, 0.000001387314, 0.000000000000 ],
597
[ 815, 0.000003581652, 0.000001293400, 0.000000000000 ],
598
[ 816, 0.000003339127, 0.000001205820, 0.000000000000 ],
599
[ 817, 0.000003112949, 0.000001124143, 0.000000000000 ],
600
[ 818, 0.000002902121, 0.000001048009, 0.000000000000 ],
601
[ 819, 0.000002705645, 0.000000977058, 0.000000000000 ],
602
[ 820, 0.000002522525, 0.000000910930, 0.000000000000 ],
603
[ 821, 0.000002351726, 0.000000849251, 0.000000000000 ],
604
[ 822, 0.000002192415, 0.000000791721, 0.000000000000 ],
605
[ 823, 0.000002043902, 0.000000738090, 0.000000000000 ],
606
[ 824, 0.000001905497, 0.000000688110, 0.000000000000 ],
607
[ 825, 0.000001776509, 0.000000641530, 0.000000000000 ],
608
[ 826, 0.000001656215, 0.000000598090, 0.000000000000 ],
609
[ 827, 0.000001544022, 0.000000557575, 0.000000000000 ],
610
[ 828, 0.000001439440, 0.000000519808, 0.000000000000 ],
611
[ 829, 0.000001341977, 0.000000484612, 0.000000000000 ],
612
[ 830, 0.000001251141, 0.000000451810, 0.000000000000 ]
613
]
614
615
# Public - default range of wavelengths in spectra (nm).
616
# start_wl_nm and end_wl_nm are integers, delta_wl_nm is a float.
617
start_wl_nm = None
618
end_wl_nm = None
619
delta_wl_nm = None
620
621
# Private - tables of spectral curves
622
_wavelengths = None
623
_xyz_colors = None
624
_xyz_deltas = None
625
626
def init (display_intensity = DEFAULT_DISPLAY_INTENSITY):
627
'''Initialize the spectral sampling curves.'''
628
# Expect that the table ranges from 360 to 830
629
global start_wl_nm, end_wl_nm, delta_wl_nm
630
table_size = len (_CIEXYZ_1931_table)
631
start_wl_nm = 360
632
end_wl_nm = 830
633
delta_wl_nm = 1.0
634
first = _CIEXYZ_1931_table [0][0]
635
last = _CIEXYZ_1931_table [-1][0]
636
assert (first == start_wl_nm), 'Expecting first wavelength as %d but instead is %d' % (start_wl_nm, first)
637
assert (last == end_wl_nm), 'Expecting last wavelength as %d but instead is %d' % (end_wl_nm, last)
638
assert (table_size == 471), 'Expecting 471 wavelength, each 1 nm from 360 to 830 nm, instead table size is %d' % (table_size)
639
# Assume that the color for the wl just before and after the table (359 and 831) are zero.
640
# Also assume linear interpolation of the values for in-between nanometer wavelengths.
641
# Construct arrays, with elements for each wavelength, as the xyz color,
642
# and the change in color to the next largest nanometer.
643
# We will add an (empty) entry for 359 nm and 831 nm.
644
global _wavelengths, _xyz_colors, _xyz_deltas
645
create_table_size = table_size + 2
646
_wavelengths = numpy.empty ((create_table_size), int)
647
_xyz_colors = numpy.empty ((create_table_size, 3))
648
_xyz_deltas = numpy.empty ((create_table_size, 3))
649
# fill in first row as 359 nm with zero color
650
_wavelengths [0] = start_wl_nm - 1
651
_xyz_colors [0] = colormodels.xyz_color (0.0, 0.0, 0.0)
652
# fill in last row as 831 nm with zero color
653
_wavelengths [create_table_size-1] = end_wl_nm + 1
654
_xyz_colors [create_table_size-1] = colormodels.xyz_color (0.0, 0.0, 0.0)
655
# fill in the middle rows from the source data
656
for i in xrange (0, len (_CIEXYZ_1931_table)):
657
(wl,x,y,z) = _CIEXYZ_1931_table [i]
658
_wavelengths [i+1] = wl
659
_xyz_colors [i+1] = colormodels.xyz_color (x,y,z)
660
# get the integrals of each curve
661
integral = numpy.zeros (3)
662
for i in xrange (0, create_table_size-1):
663
d_integral = 0.5 * (_xyz_colors [i] + _xyz_colors [i+1]) * delta_wl_nm
664
integral += d_integral
665
# scale the sampling curves so that:
666
# A spectrum, constant with wavelength, with total intensity equal to the
667
# physical intensity of the monitor, will sample with Y = 1.0.
668
# This scaling corresponds with that in colormodels, which assumes Y = 1.0 at full white.
669
# Ideally, we would like the spectrum of the actual monitor display, at full white,
670
# to sample to Y = 1.0, not the constant with wavelength spectrum that is assumed here.
671
num_wl = table_size
672
scaling = num_wl / (integral [1] * display_intensity)
673
_xyz_colors *= scaling
674
# now calculate all the deltas
675
for i in xrange (0, create_table_size-1):
676
_xyz_deltas [i] = _xyz_colors [i+1] - _xyz_colors [i]
677
_xyz_deltas [create_table_size-1] = colormodels.xyz_color (0.0, 0.0, 0.0)
678
679
#
680
681
def empty_spectrum ():
682
'''Get a black (no intensity) ColorPy spectrum.
683
684
This is a 2D numpy array, with one row for each wavelength in the visible range,
685
360 nm to 830 nm, with a spacing of delta_wl_nm (1.0 nm), and two columns.
686
The first column is filled with the wavelength [nm].
687
The second column is filled with 0.0. It should later be filled with the intensity.
688
689
The result can be passed to xyz_from_spectrum() to convert to an xyz color.
690
'''
691
wl_nm_range = xrange (start_wl_nm, end_wl_nm + 1)
692
num_wl = len (wl_nm_range)
693
spectrum = numpy.zeros ((num_wl, 2))
694
for i in xrange (0, num_wl):
695
spectrum [i][0] = float (wl_nm_range [i])
696
return spectrum
697
698
def xyz_from_wavelength (wl_nm):
699
'''Given a wavelength (nm), return the corresponding xyz color, for unit intensity.'''
700
# separate wl_nm into integer and fraction
701
int_wl_nm = math.floor (wl_nm)
702
frac_wl_nm = wl_nm - float (int_wl_nm)
703
# skip out of range (invisible) wavelengths
704
if (int_wl_nm < start_wl_nm - 1) or (int_wl_nm > end_wl_nm + 1):
705
return colormodels.xyz_color (0.0, 0.0, 0.0)
706
# get index into main table
707
index = int_wl_nm - start_wl_nm + 1
708
# apply linear interpolation to get the color
709
return _xyz_colors [index] + frac_wl_nm * _xyz_deltas [index]
710
711
def xyz_from_spectrum (spectrum):
712
'''Determine the xyz color of the spectrum.
713
714
The spectrum is assumed to be a 2D numpy array, with a row for each wavelength,
715
and two columns. The first column should hold the wavelength (nm), and the
716
second should hold the light intensity. The set of wavelengths can be arbitrary,
717
it does not have to be the set that empty_spectrum() returns.'''
718
shape = numpy.shape (spectrum)
719
(num_wl, num_col) = shape
720
assert num_col == 2, 'Expecting 2D array with each row: wavelength [nm], specific intensity [W/unit solid angle]'
721
# integrate
722
rtn = colormodels.xyz_color (0.0, 0.0, 0.0)
723
for i in xrange (0, num_wl):
724
wl_nm_i = spectrum [i][0]
725
specific_intensity_i = spectrum [i][1]
726
xyz = xyz_from_wavelength (wl_nm_i)
727
rtn += specific_intensity_i * xyz
728
return rtn
729
730
def get_normalized_spectral_line_colors (
731
brightness = 1.0,
732
num_purples = 0,
733
dwl_angstroms = 10):
734
'''Get an array of xyz colors covering the visible spectrum.
735
Optionally add a number of 'purples', which are colors interpolated between the color
736
of the lowest wavelength (violet) and the highest (red).
737
738
brightness - Desired maximum rgb component of each color. Default 1.0. (Maxiumum displayable brightness)
739
num_purples - Number of colors to interpolate in the 'purple' range. Default 0. (No purples)
740
dwl_angstroms - Wavelength separation, in angstroms (0.1 nm). Default 10 A. (1 nm spacing)
741
'''
742
# get range of wavelengths, in angstroms, so that we can have finer resolution than 1 nm
743
wl_angstrom_range = xrange (10*start_wl_nm, 10*(end_wl_nm + 1), dwl_angstroms)
744
# get total point count
745
num_spectral = len (wl_angstrom_range)
746
num_points = num_spectral + num_purples
747
xyzs = numpy.empty ((num_points, 3))
748
# build list of normalized color x,y values proceeding along each wavelength
749
i = 0
750
for wl_A in wl_angstrom_range:
751
wl_nm = wl_A * 0.1
752
xyz = xyz_from_wavelength (wl_nm)
753
colormodels.xyz_normalize (xyz)
754
xyzs [i] = xyz
755
i += 1
756
# interpolate from end point to start point (filling in the purples)
757
first_xyz = xyzs [0]
758
last_xyz = xyzs [num_spectral - 1]
759
for ipurple in xrange (0, num_purples):
760
t = float (ipurple) / float (num_purples - 1)
761
omt = 1.0 - t
762
xyz = t * first_xyz + omt * last_xyz
763
colormodels.xyz_normalize (xyz)
764
xyzs [i] = xyz
765
i += 1
766
# scale each color to have the max rgb component equal to the desired brightness
767
for i in xrange (0, num_points):
768
rgb = colormodels.rgb_from_xyz (xyzs [i])
769
max_rgb = max (rgb)
770
if max_rgb != 0.0:
771
scale = brightness / max_rgb
772
rgb *= scale
773
xyzs [i] = colormodels.xyz_from_rgb (rgb)
774
# done
775
return xyzs
776
777
# Initialize at module startup
778
init()
779
780