colour-scienceで三刺激値のプロットとか
2022-05-15(日)
色彩工学・光学関係で便利そうなcolour-scienceなのだが,Tutorialに載ってないことをやろうとした途端に破綻する初見殺し。
等色関数のプロット
一つだけプロットする場合
colour.MSDS_CMFSで定義されているdictもどきのLazyCaseInsensitiveMapping
(後で説明)。
ここのStiles & Burch 1955 2 Degree RGB CMFs
とかがkeyという鬼畜で,plot_single_cmfs
で単にプロットしたい場合のkeyでもある。
import colour.plotting as cplt
cplt.plot_single_cmfs('Stiles & Burch 1955 2 Degree RGB CMFs')
複数プロットする場合
等色関数の名前をリストにしてplot_multi_cmfs
に渡すだけでよい。
cmfs = ['Stiles & Burch 1959 10 Degree RGB CMFs', 'CIE 1964 10 Degree Standard Observer']
cplt.plot_multi_cmfs(cmfs)
LazyCaseInsensitiveMapping
dictもどきのclassでdomain(波長)をkeyとしたdataと,labelsとかの情報で構成されている。
cmf = colour.MSDS_CMFS['Stiles & Burch 1955 2 Degree RGB CMFs']
cmf
でドバーっと中身が出てくるが容易に拾えない。
domain
これが中身を拾うためのkeysになる。(内部で処理してるにせよ一致が保証されないfloat型をkeyにして大丈夫なのかと思うが)
cmf.domain
Out:
array([ 390., 395., 400., 405., 410., 415., 420., 425., 430.,
435., 440., 445., 450., 455., 460., 465., 470., 475.,
480., 485., 490., 495., 500., 505., 510., 515., 520.,
525., 530., 535., 540., 545., 550., 555., 560., 565.,
570., 575., 580., 585., 590., 595., 600., 605., 610.,
615., 620., 625., 630., 635., 640., 645., 650., 655.,
660., 665., 670., 675., 680., 685., 690., 695., 700.,
705., 710., 715., 720., 725., 730.])
なので,
cfms = colour.MSDS_CMFS['Stiles & Burch 1955 2 Degree RGB CMFs']
for wl in cfms.domain:
print(f'{wl}: {cfms[wl]}')
で
390.0: [ 0.0018397 -0.00045393 0.012152 ]
395.0: [ 0.0046153 -0.0010464 0.03111 ]
400.0: [ 0.0096264 -0.0021689 0.062371 ]
405.0: [ 0.018979 -0.0044304 0.13161 ]
410.0: [ 0.030803 -0.0072048 0.2275 ]
415.0: [ 0.042459 -0.012579 0.35897 ]
420.0: [ 0.051662 -0.016651 0.52396 ]
425.0: [ 0.052837 -0.02124 0.68586 ]
430.0: [ 0.044287 -0.019936 0.79604 ]
435.0: [ 0.03222 -0.016097 0.89459 ]
440.0: [ 0.014763 -0.0073457 0.96395 ]
445.0: [-0.0023392 0.001369 0.99814 ]
450.0: [-0.02913 0.01961 0.91875]
455.0: [-0.060677 0.043464 0.82487 ]
460.0: [-0.096224 0.070954 0.78554 ]
465.0: [-0.13759 0.11022 0.66723]
470.0: [-0.17486 0.15088 0.61098]
475.0: [-0.2126 0.19794 0.48829]
480.0: [-0.2378 0.24042 0.36195]
485.0: [-0.25674 0.27993 0.26634]
490.0: [-0.27727 0.33353 0.19593]
495.0: [-0.29125 0.40521 0.1473 ]
500.0: [-0.295 0.4906 0.10749]
505.0: [-0.29706 0.59673 0.076714]
510.0: [-0.26759 0.70184 0.050248]
515.0: [-0.21725 0.80852 0.028781]
520.0: [-0.14768 0.91076 0.013309]
525.0: [-0.035184 0.98482 0.002117]
530.0: [ 0.10614 1.0339 -0.0041574]
535.0: [ 0.25981 1.0538 -0.0083032]
540.0: [ 0.41976 1.0512 -0.012191]
545.0: [ 0.59259 1.0498 -0.014039]
550.0: [ 0.79004 1.0368 -0.014681]
555.0: [ 1.0078 0.99826 -0.014947]
560.0: [ 1.2283 0.93783 -0.014613]
565.0: [ 1.4727 0.88039 -0.013782]
570.0: [ 1.7476 0.82835 -0.01265]
575.0: [ 2.0214 0.74686 -0.011356]
580.0: [ 2.2724 0.6493 -0.0099317]
585.0: [ 2.4896 0.56317 -0.0084148]
590.0: [ 2.6725 0.47675 -0.007021]
595.0: [ 2.8093 0.38484 -0.0057437]
600.0: [ 2.8717 0.30069 -0.0042743]
605.0: [ 2.8525 0.22853 -0.0029132]
610.0: [ 2.76010000e+00 1.65750000e-01 -2.26930000e-03]
615.0: [ 2.59890000e+00 1.13730000e-01 -1.99660000e-03]
620.0: [ 2.37430000e+00 7.46820000e-02 -1.50690000e-03]
625.0: [ 2.10540000e+00 4.65040000e-02 -9.38220000e-04]
630.0: [ 1.81450000e+00 2.63330000e-02 -5.53160000e-04]
635.0: [ 1.52470000e+00 1.27240000e-02 -3.16680000e-04]
640.0: [ 1.25430000e+00 4.50330000e-03 -1.43190000e-04]
645.0: [ 1.00760000e+00 9.66110000e-05 -4.08310000e-06]
650.0: [ 7.86420000e-01 -1.96450000e-03 1.10810000e-04]
655.0: [ 5.96590000e-01 -2.63270000e-03 1.91750000e-04]
660.0: [ 4.43200000e-01 -2.62620000e-03 2.26560000e-04]
665.0: [ 3.24100000e-01 -2.30270000e-03 2.15200000e-04]
670.0: [ 2.34550000e-01 -1.87000000e-03 1.63610000e-04]
675.0: [ 1.68840000e-01 -1.44240000e-03 9.71640000e-05]
680.0: [ 1.20860000e-01 -1.07550000e-03 5.10330000e-05]
685.0: [ 8.58110000e-02 -7.90040000e-04 3.52710000e-05]
690.0: [ 6.02600000e-02 -5.67650000e-04 3.12110000e-05]
695.0: [ 4.14800000e-02 -3.92740000e-04 2.45080000e-05]
700.0: [ 2.81140000e-02 -2.62310000e-04 1.65210000e-05]
705.0: [ 1.91170000e-02 -1.75120000e-04 1.11240000e-05]
710.0: [ 1.33050000e-02 -1.21400000e-04 8.69650000e-06]
715.0: [ 9.40920000e-03 -8.57600000e-05 7.43510000e-06]
720.0: [ 6.51770000e-03 -5.76770000e-05 6.10570000e-06]
725.0: [ 4.53770000e-03 -3.90030000e-05 5.02770000e-06]
730.0: [ 3.17420000e-03 -2.65110000e-05 4.12510000e-06]
みたいな出力が得られる。(dataはndarray)
自力でプロット
綺麗ではないが力技で拾ってプロット
import numpy as np
import matplotlib.pyplot as plt
import colour
cmf = colour.MSDS_CMFS['Stiles & Burch 1955 2 Degree RGB CMFs']
data = np.empty((len(cmf.domain),len(cmf.labels)))
for i, wl in enumerate(cmf.domain):
data[i,] = cmf[wl]
plt.plot(cmf.domain, data)
plt.legend(cmf.labels)
plt.show()
numpy_print_options
試行錯誤してたらnumpy_print_options
というものがあるらしく
from colour.utilities import numpy_print_options
with numpy_print_options():
print(cmf)
で,表示だけできるのは分かったが特に便利な何かという訳ではない。