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')

None

複数プロットする場合

等色関数の名前をリストにしてplot_multi_cmfsに渡すだけでよい。

cmfs = ['Stiles & Burch 1959 10 Degree RGB CMFs', 'CIE 1964 10 Degree Standard Observer']
cplt.plot_multi_cmfs(cmfs)

None

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()

None

numpy_print_options

試行錯誤してたらnumpy_print_optionsというものがあるらしく

from colour.utilities import numpy_print_options
with numpy_print_options():
    print(cmf)

で,表示だけできるのは分かったが特に便利な何かという訳ではない。

Category: Memo Tagged: Python