• [0]
  • 人の色覚の数理

  • 投稿者:管理人
  • 投稿日:2012年 2月28日(火)11時33分13秒
 
英国University College London(UCL)附属のInstitute of Ophthalmologyは,
Colour & Vision Research laboratory and database(CVRL database)
http://cvrl.ioo.ucl.ac.uk/index.htm
において人の目の知覚に関する詳細なデータを公開しています。
人の目の色覚細胞は,L,M,Sの3種類の錐体(cone)から構成されています。L,M,Sは,それぞれ,長波長,中波長,短波長を意味し,L,M,S各錐体は,それぞれ,およそ,570nm,540nm,440nm付近にピークを持つ単峰形の感度特性を持っています。
CVRL databaseには,LMS錐体の波長に対する感度特性のデータが複数登録されています。大きく分けて視野角2度のものと10度のものがあり,同種のデータでも出典の異なるいくつかのデータがあります。さらに,それらは,データ形式等でさらに細分され,いく通りものデータが存在します。

  • [1]
  • データファイルの取得

  • 投稿者:白石和夫
  • 投稿日:2012年 2月28日(火)11時34分16秒
  • 返信
 
CVRL Database
から,
CVRL Functions
を選んで(クリックして)
Stockman & Sharpe cone fundamentals
2-deg fundamentals based on the Stiles and Burch 10-deg CMFs adjusted to 2-deg
において,
Units energy (linear),Step size 0.1nm,Format csv
を選び,submitボタンをクリックすると,次のようなデータを持つファイルlinss2_10e_fine.csvが得られます。
390.0,  4.15003E-04,  3.68349E-04,  9.54729E-03
390.1,  4.23072E-04,  3.75656E-04,  9.72489E-03
………(途中 省略)………
830.0,  9.74306E-07,  9.53411E-08,
コンマで区切られた数値のうち,第1のものは波長(単位 nm)で,続く3つの数値は,それぞれ,L,M,S各錐体の感度特性を意味し,それらは,それぞれ,最大値が1となるように正規化されています。ただし,0に対応するデータはブランクで記録されています。


  • [2]
  • グラフにしてみる

  • 投稿者:白石和夫
  • 投稿日:2012年 2月28日(火)11時50分47秒
  • 編集済
  • 返信
 
つぎのようなプログラムを書けば,データをグラフ化してみることができます。
プログラムを,一旦,linss2_10e_fine.csv を保存したのと同じフォルダに保存してから実行するか,140行の""の中をフルパス名に書き換えるかしてから実行してください。


100 SET WINDOW 390,830,-0.05,1.05
110 DRAW grid(100,0.1)
120 SET POINT STYLE 1
130 DIM x(3)
140 OPEN #1:NAME "linss2_10e_fine.csv", RECTYPE INTERNAL, ACCESS INPUT
150 DO
160    READ #1,IF MISSING THEN EXIT DO:lambda, x(1),x(2),x(3)
170    SET POINT COLOR "BLUE"
180    PLOT POINTS:lambda, x(3)
190    SET POINT COLOR "GREEN"
200    PLOT POINTS:lambda, x(2)
210    SET POINT COLOR "RED"
220    PLOT POINTS:lambda, x(1)
230 LOOP
240 END


  • [3]
  • 3原色

  • 投稿者:白石和夫
  • 投稿日:2012年 2月28日(火)12時08分44秒
  • 編集済
  • 返信
 

 3原色をR(赤,700nm),G(緑,546.1nm),B(青,435.8nm)とする表色系が用いられている(CIE(国際照明委員会)のRGB表色系)。

 R,G,B各3原色に対するL,M,S各錐体の感度特性は,
700.0,  5.89749E-03,  3.65317E-04,
546.1,  9.24341E-01,  9.93742E-01,  2.85277E-03
435.8,  3.51131E-02,  5.39344E-02,  9.19756E-01
であるので,人間の色覚細胞(錐体)が複数波長の光の刺激に対して重ね合わせの原理(加法性)が成立するものとすると仮定すれば,
l =0.00589749 r + 0.924341 g + 0.0351131 b
m =0.000365317 r+ 0.993742 g + 0.0539344 b
s =               0.00285277 g + 0.919756 b
となるようにR,G,B各3原色の強度r,g,bを定めれば,L,M,S各錐体の刺激値がl,m,sである色が再現できることになる。
 各波長の光に対するl,m,sの値からr,g,b値を求めるためには,上の3元連立一次方程式を解けばよい。逆行列と行列の積を利用することで,次のようなプログラムで計算できる。

100 DATA  0.00589749,   0.000365317,  0            ! 700  nm (Red)
110 DATA  9.24341E-01,  9.93742E-01,  2.85277E-03  ! 546.1nm (Green)
120 DATA  0.0351131 ,   0.0539344,    0.919756     ! 435.8nm (Blue)
130 DIM a(3,3),aa(3,3)
140 MAT READ aa
150 MAT a=INV(aa)
160 SET WINDOW 390,830,-25,95
170 DRAW grid(100,10)
180 SET POINT STYLE 1
190 DIM x(3),y(3)
200 OPEN #1:NAME "linss2_10e_fine.csv", RECTYPE INTERNAL, ACCESS INPUT
210 DO
220    READ #1,IF MISSING THEN EXIT DO:lambda, x(1),x(2),x(3)
230    MAT y=x*a
240    PRINT USING "###.# ###.##### ###.##### ###.#####":lambda, y(1),y(2),y(3)
250    SET POINT COLOR "BLUE"
260    PLOT POINTS:lambda, y(3)
270    SET POINT COLOR "GREEN"
280    PLOT POINTS:lambda, y(2)
290    SET POINT COLOR "RED"
300    PLOT POINTS:lambda, y(1)
310 LOOP
320 !
330 SET POINT STYLE 3
340 SET POINT COLOR "Blue"
350 PLOT POINTS : 435.8, 1
360 SET POINT COLOR "GREEN"
370 PLOT POINTS : 543.6, 1
380 SET POINT COLOR "RED"
390 PLOT POINTS : 700, 1
400 !
410 END

330行以降で,各3原色の位置に*をプロットしている。

R(700nm)は人の色覚細胞にとって感度の悪い波長域にある。だたら,600nm付近の色を再現しようとすると,Rの強度を相当に高めないといけないことがグラフから読み取れる。
また,500nm付近の色をRGBで表現したければRを負にしなければならないこともわかる(つまり現実には再現不能)。



  • [4]
  • RGBで白色光を再現する

  • 投稿者:白石和夫
  • 投稿日:2012年 2月28日(火)14時13分22秒
  • 編集済
  • 返信
 

白色光は,波長に対して一様な分布を持つ光だと仮定する。
(この仮定が正しいかどうかのデータは手元にない)
白色光のL,M,S各錐体の刺激値l,m,sは,次のプログラムで求まる。
(l:m:s の比が問題)

100 LET l=0
110 LET m=0
120 LET s=0
130 OPEN #1:NAME "linss2_10e_fine.csv", RECTYPE INTERNAL, ACCESS INPUT
140 DO
150    READ #1,IF MISSING THEN EXIT DO:lambda, l0,m0,s0
160    LET l=l+l0
170    LET m=m+m0
180    LET s=s+s0
190 LOOP
200 PRINT l,m,s
210 END

実行結果は,
l=1159.78432129424  m=948.212023570428  s=584.20073673123
である。

これと等価な刺激値の得られるR,G,Bの強度r,g,bは,

100 DATA  0.00589749,   0.000365317,  0            ! 700  nm (Red)
110 DATA  9.24341E-01,  9.93742E-01,  2.85277E-03  ! 546.1nm (Green)
120 DATA  0.0351131 ,   0.0539344,    0.919756     ! 435.8nm (Blue)
130 DIM a(3,3),aa(3,3)
140 MAT READ aa
150 MAT a=INV(aa)
160 DIM x(3),y(3)
170 DATA 1159.78432129424, 948.212023570428,  584.20073673123
180 MAT READ x
190 MAT y=x*a
200 MAT PRINT y;
210 END

で求まる。計算結果は,
r=51696.6491189815 g=900.85715090927  b=632.375106524806
である。


  • [5]
  • 白色光を与えるR,G,Bの強度を基準に考える

  • 投稿者:白石和夫
  • 投稿日:2012年 2月28日(火)14時35分48秒
  • 編集済
  • 返信
 

白色光と等価になるR,G,Bの強度を基準に,R,G,Bの強度を考えることにする。
つまり,白色光において,r:g:b=1:1:1であるとする。
そうすると,一つ上の結果は,以下のように書き換えることができる。

100 LET r0=51.6966491189815
110 LET g0=.90085715090927
120 LET b0=.632375106524806
130 DATA  0.00589749,   0.000365317,  0            ! 700  nm (Red)
140 DATA  9.24341E-01,  9.93742E-01,  2.85277E-03  ! 546.1nm (Green)
150 DATA  0.0351131 ,   0.0539344,    0.919756     ! 435.8nm (Blue)
160 DIM a(3,3),aa(3,3)
170 MAT READ aa
180 MAT a=INV(aa)
190 SET WINDOW 390,830,-0.5, 2
200 DRAW grid(100,1)
210 SET POINT STYLE 1
220 DIM x(3),y(3)
230 OPEN #1:NAME "linss2_10e_fine.csv", RECTYPE INTERNAL, ACCESS INPUT
240 DO
250    READ #1,IF MISSING THEN EXIT DO:lambda, x(1),x(2),x(3)
260    MAT y=x*a
270    LET r=y(1)/r0
280    LET g=y(2)/g0
290    LET b=y(3)/b0
300    PRINT USING "###.# ##.###### ##.###### ##.######":lambda, r,g,b
310    SET POINT COLOR "BLUE"
320    PLOT POINTS:lambda, b
330    SET POINT COLOR "GREEN"
340    PLOT POINTS:lambda, g
350    SET POINT COLOR "RED"
360    PLOT POINTS:lambda, r
370 LOOP
380 END


  • [6]
  • RGB色空間

  • 投稿者:白石和夫
  • 投稿日:2012年 2月28日(火)14時47分2秒
  • 編集済
  • 返信
 
Full BASICでは,R=1,G=1,B=1が白を表すから,上のグラフで求まる比率でSET COLOR MIX文のR,B,G値を指定すれば,各単波長の光の色が再現できることになる。
ただし,R,G,Bに負数を指定することはできないから,500nm付近の単波長光の色は再現できない。
また,普通のディスプレーのRGBはCIEのRGBと異なる(sRGBという規格で作られている)ので,上述の議論はあくまで机上論。



  • [7]
  • LMS色空間

  • 投稿者:白石和夫
  • 投稿日:2012年 2月28日(火)15時00分37秒
  • 編集済
  • 返信
 

色を3原色で表現するのに最も合理的な方法は,L,M,S各錐体の刺激値の比l:m:sを用いることである。
この方法は,視神経を直接刺激する技法が開発されない限り技術的には実現不可能な方法でもある。
l:m:sの比が等しい場合は明度の違いを除いて同じ色を表すと仮定して,
l, m, sをl+m+sで割った値をあらためてl, m, sで表すことにする。
横軸にl,,縦軸にmをとり,平面上の点で色相を表すことにする。
各単波長光に対する(l, m)をプロットしてみる。

100 SET WINDOW 0,1,0,1
110 DRAW grid(1,1)
120 SET POINT STYLE 1
130 OPEN #1:NAME "linss2_10e_fine.csv", RECTYPE INTERNAL, ACCESS INPUT
140 DO
150    READ #1,IF MISSING THEN EXIT DO:lambda, L,M,S
160    LET t=L+M+S
170    LET l=L/t
180    LET m=M/t
190    PLOT POINTS:l,m
200    IF FP(lambda/10)=0 THEN PLOT TEXT ,AT l,m :STR$(lambda)
210 LOOP
220 END



  • [8]
  • 色知覚のメカニズム

  • 投稿者:白石和夫
  • 投稿日:2012年 2月28日(火)15時38分11秒
  • 編集済
  • 返信
 

 上の図を見ると,人が色相をどうやって知覚しているのかわかるような気がしないだろうか。

 なお,上の曲線上に3点を取って3原色とするとき,それら3点を頂点とする三角形の内部にある色が再現可能な色である。
 CIEの3原色を用いて表現可能な色を同一座標平面上に描いてみると,次図のようになる。
 この図をみると,RGBのうちのGの定義を520nm付近に変えたくなる。Gを546.1nmと決めた根拠は何だったのだろうか。

100 LET r0=51.6966491189815
110 LET g0=.90085715090927
120 LET b0=.632375106524806
130 DATA  0.00589749,   0.000365317,  0            ! 700  nm (Red)
140 DATA  9.24341E-01,  9.93742E-01,  2.85277E-03  ! 546.1nm (Green)
150 DATA  0.0351131 ,   0.0539344,    0.919756     ! 435.8nm (Blue)
160 DIM a(3,3),aa(3,3)
170 MAT READ aa
180 MAT a=INV(aa)
190 DIM x(3),y(3)
200 SET WINDOW 0,1,0,1
210 SET POINT STYLE 1
220 FOR i=0 TO PIXELX(1)
230    FOR j=0 TO PIXELY(1)
240       LET x(1)=WORLDX(i)      ! L
250       LET x(2)=WORLDY(j)      ! M
260       LET x(3)=1-(x(1)+x(2))  ! S
270       MAT y=x*a
280       LET r=y(1)/r0
290       LET g=y(2)/g0
300       LET b=y(3)/b0
310       IF r>=0 AND g>=0 AND b>=0 THEN
320          LET m=MAX(r,MAX(g,b))
330          LET r=r/m
340          LET g=g/m
350          LET b=b/m
360          SET COLOR MIX(1) r,g,b
370          PLOT POINTS:x(1),x(2)
380       END IF
390    NEXT j
400 NEXT i
410 REM 単波長光の軌跡
420 SET COLOR MIX(1) 0,0,0
430 OPEN #1:NAME "linss2_10e_fine.csv", RECTYPE INTERNAL, ACCESS INPUT
440 DO
450    READ #1,IF MISSING THEN EXIT DO:lambda, L,M,S
460    LET t=L+M+S
470    LET l=L/t
480    LET m=M/t
490    PLOT POINTS:l,m
500    IF FP(lambda/10)=0 THEN PLOT TEXT ,AT l,m :STR$(lambda)
510 LOOP
520 END


  • [9]
  • 十進BASIC 7.4.7 以前を使う場合

  • 投稿者:白石和夫
  • 投稿日:2012年 2月28日(火)20時29分57秒
  • 編集済
  • 返信
 
Ver.7.4.7 以前の十進BASICは,内部形式ファイルの数値項目がnullであることを認めないこととしていたので,数値項目にnullがあるCSVファイルは読めない。その場合,次のように一旦文字列変数に読み,数値に変換する。

READ #1,IF MISSING THEN EXIT DO:lambda, x(1),x(2),s$
   IF s$="" THEN LET x(3)=0 ELSE LET x(3)=VAL(s$)



  • [10]
  • XYZ色空間

  • 投稿者:白石和夫
  • 投稿日:2012年 2月29日(水)10時20分39秒
  • 編集済
  • 返信
 

 RGB値で色を表現しようとすると,すべての自然光を表現すためには,負数が必要になる。
 3つの数値がすべて正の数で色を表現することができるようにするために,次式で定義されるX,Y,Zの組で色を表す手法が考案された。
 負数を避けるためなら,上述のLMSを用いればよいのに,なぜそんな座標系を定義するのかは不明だけれど,このXYZ系による表現をよく見かける。
 RGB値で表現するほうは簡単な実験で調べることができるけれども,LMS錐体の感度を調べるのは容易ではないから,LMS錐体の感度特性データが知られていない時代に考え出された手法なのであろう。
 それにしても,Xのグラフが双峰になるように選んだ理由は何だったのだろうか。
 RGB値のグラフを眺めつつ作戦を立て,XYZの定義を変えて実験を繰り返すと楽しいかもしれない。

CIE XYZ 表色系(JIS Z8701)
参照 工学系(CIE表色系)

X = 0.4898R + 0.3101G + 0.2001B
Y = 0.1769R + 0.8124G + 0.0107B
Z = 0.0000R + 0.0100G + 0.9903B

 単波長光に対するX,Y,Z値は次のプログラムで計算できる。
ただし,白色光の定義が異なる可能性があるので,一般に知られる数値と異なるかもしれない。

100 LET r0=516.966491189815
110 LET g0=9.0085715090927
120 LET b0=6.32375106524806
130 DATA  0.00589749,   0.000365317,  0            ! 700  nm (Red)
140 DATA  9.24341E-01,  9.93742E-01,  2.85277E-03  ! 546.1nm (Green)
150 DATA  0.0351131 ,   0.0539344,    0.919756     ! 435.8nm (Blue)
160 DIM a(3,3),aa(3,3)
170 MAT READ aa
180 MAT a=INV(aa)
190 SET WINDOW 390,830,-0.05, 1
200 DRAW grid(100, 0.1)
210 SET POINT STYLE 1
220 DIM xx(3),yy(3)
230 OPEN #1:NAME "linss2_10e_fine.csv", RECTYPE INTERNAL, ACCESS INPUT
240 DO
250    READ #1,IF MISSING THEN EXIT DO:lambda, xx(1),xx(2),xx(3)
260    MAT yy=xx*a
270    LET r=yy(1)/r0
280    LET g=yy(2)/g0
290    LET b=yy(3)/b0
300    LET x=2.7689*r+1.7517*g+1.1302*b
310    LET y=r+4.5907*g+0.0601*b
320    LET z=0.0565*g+5.5943*b
340    PRINT USING "###.# #.####### #.####### #.#######":lambda, x,y,z
350    SET POINT COLOR "BLUE"
360    PLOT POINTS:lambda, z
370    SET POINT COLOR "GREEN"
380    PLOT POINTS:lambda, y
390    SET POINT COLOR "RED"
400    PLOT POINTS:lambda, x
410 LOOP
420 CLOSE #1
430 END



  • [11]
  • xy色度

  • 投稿者:白石和夫
  • 投稿日:2012年 2月29日(水)11時01分29秒
  • 返信
 

X:Y:Zが色相を表すので,
x=X/(X+Y+Z)
y=Y/(X+Y+Z)
z=Z/(X+Y+Z)
でx,y,zを定義すると,それらのうちの2つで色相を表現できる。
xとyで色相を表す表現法が,xy色度としてよく使われる。
次のプログラムは単波長光のxy色度をプロットする。

100 LET r0=516.966491189815
110 LET g0=9.0085715090927
120 LET b0=6.32375106524806
130 DATA  0.00589749,   0.000365317,  0            ! 700  nm (Red)
140 DATA  9.24341E-01,  9.93742E-01,  2.85277E-03  ! 546.1nm (Green)
150 DATA  0.0351131 ,   0.0539344,    0.919756     ! 435.8nm (Blue)
160 DIM a(3,3),aa(3,3)
170 MAT READ aa
180 MAT a=INV(aa)
190 SET WINDOW 0,1,0,1
200 DRAW grid
210 SET POINT STYLE 1
220 DIM xx(3),yy(3)
230 OPEN #1:NAME "linss2_10e_fine.csv", RECTYPE INTERNAL, ACCESS INPUT
240 DO
250    READ #1,IF MISSING THEN EXIT DO:lambda, xx(1),xx(2),xx(3)
260    MAT yy=xx*a
270    LET r=yy(1)/r0
280    LET g=yy(2)/g0
290    LET b=yy(3)/b0
300    LET x=2.7689*r+1.7517*g+1.1302*b
310    LET y=r+4.5907*g+0.0601*b
320    LET z=0.0565*g+5.5943*b
330    LET t=x+y+z
340    LET x=x/t
350    LET y=y/t
360    LET z=z/t
370    PLOT POINTS: x,y
380    IF FP(lambda/10)=0 THEN PLOT TEXT ,AT x,y :STR$(lambda)
390 LOOP
400 CLOSE #1
410 END
420


  • [12]
  • CIE3原色で表現可能な色

  • 投稿者:白石和夫
  • 投稿日:2012年 2月29日(水)11時15分42秒
  • 編集済
  • 返信
 

CIEの3原色R(赤,700nm),G(緑,546.1nm),B(青,435.8nm)を用いるとき表現可能な色をxy色度図上に示す。
XYZからRGBが
R = 2.3655X - 0.8971Y - 0.4683Z
G = -0.5151X + 1.4264Y + 0.0887Z
B = 0.0052X - 0.0144Y + 1.0089Z
で求められることを用いている。
参照
音と色と数の散歩道 CIE XYZ表色系(9): XYZ-RGB の変換式 と カラートライアングル


100 SET WINDOW 0,1,0,1
110     SET POINT STYLE 1
120 FOR i=0 TO PIXELX(1)
130    FOR j=0 TO PIXELY(1)
140       LET x=WORLDX(i)
150       LET y=WORLDY(j)
160       LET z=1-(x+y)
170       LET r =  2.3655*x - 0.8971*y - 0.4683*z
180       LET g = -0.5151*x + 1.4264*y + 0.0887*z
190       LET b =  0.0052*x - 0.0144*y + 1.0089*z
200       IF r>=0 AND g>=0 AND b>=0 THEN
210          LET m=MAX(r,MAX(g,b))
220          LET r=r/m
230          LET g=g/m
240          LET b=b/m
250          SET COLOR MIX(1) r,g,b
260          PLOT POINTS:x,y
270       END if
280    NEXT j
290 NEXT i
300 REM 以下,単波長光の軌跡
310     SET COLOR MIX(1) 0,0,0
320 LET r0=516.966491189815
330 LET g0=9.0085715090927
340 LET b0=6.32375106524806
350 DATA  0.00589749,   0.000365317,  0            ! 700  nm (Red)
360 DATA  9.24341E-01,  9.93742E-01,  2.85277E-03  ! 546.1nm (Green)
370 DATA  0.0351131 ,   0.0539344,    0.919756     ! 435.8nm (Blue)
380 DIM a(3,3),aa(3,3)
390 MAT READ aa
400 MAT a=INV(aa)
410 DIM xx(3),yy(3)
420 OPEN #1:NAME "linss2_10e_fine.csv", RECTYPE INTERNAL, ACCESS INPUT
430 DO
440    READ #1,IF MISSING THEN EXIT DO:lambda, xx(1),xx(2),xx(3)
450    MAT yy=xx*a
460    LET r=yy(1)/r0
470    LET g=yy(2)/g0
480    LET b=yy(3)/b0
490    LET x=2.7689*r+1.7517*g+1.1302*b
500    LET y=r+4.5907*g+0.0601*b
510    LET z=0.0565*g+5.5943*b
520    LET t=x+y+z
530    LET x=x/t
540    LET y=y/t
550    LET z=z/t
560    PLOT POINTS: x,y
570    IF FP(lambda/10)=0 THEN PLOT TEXT ,AT x,y :STR$(lambda)
580 LOOP
590 CLOSE #1
600 END


  • [13]
  • 自然光スペクトル

  • 投稿者:白石和夫
  • 投稿日:2012年 4月12日(木)09時18分22秒
  • 返信
 
自然光のスペクトル分布のデータを発見した。
これを用いると,白色光のスペクトル=一様分布 の仮定のもとに行った[4]の計算をやり直すことができる。

データ
Solar Spectra
http://rredc.nrel.gov/solar/spectra/

解説
電光石科 4.太陽光のスペクトル
http://denkou.cdx.jp/Opt/PVC01/PVCF1_4.html


  • [14]
  • 黒体放射で近似

  • 投稿者:白石和夫
  • 投稿日:2012年12月 4日(火)18時28分53秒
  • 返信
 
大気による吸収を無視すれば,自然光スペクトルは,
太陽光が5800Kの黒体放射で近似できる
https://ja.wikipedia.org/wiki/%E5%A4%AA%E9%99%BD
ことと,黒体放射の分布式
https://ja.wikipedia.org/wiki/%E9%BB%92%E4%BD%93
から計算で求めることもできる。

 戻る