-
- [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
戻る