このページではMathJaxによる数式表示を行っています。対応しているブラウザーであれば少し待てば数式が表示されます。
(画面左下にMathJaxのタイプセットステータスが表示されます。)
環境によっては表示が崩れているかもしれません。その際はブラウザーを変更してみてください。

スペクトラムとRGBの関係

人間が知覚可能な色のほぼ全てはRGB三原色の組み合わせで表現することが可能です。しかし現実の光はスペクトラムと呼ばれる、様々な波長の光の合成となっており、3種類の光があるわけではありません。このページでは、スペクトラムとは何かといった簡単な説明、人間の知覚、スペクトラムとRGBの関係やそれらの変換方法などについて解説します。
解説とはいったものの色の世界は奥が深く誤情報を書いている可能性が他のページより高いかもしれません...

スペクトラム(spectrum)

昼光のスペクトラム
図1. 昼光のスペクトラム

光は電磁波の一種で、波長の違いが人間にとって「色」として知覚されることは教科書にも載ってたりして割と有名なことだと思います。人間が知覚できる波長の電磁波は可視光、もしくは単に光と呼ばれます。可視光の範囲は文献によって差がありますが、広いものでは $ 360 \sim 830\mathrm{[nm]} $ となっています。身の回りにあふれている光は、ある単一の波長を持った光ではなく様々な波長の光の混ざり合ったものとなっており、その強さの分布をスペクトラム(spectrum)、あるいはスペクトルと呼びます。例えば日中の屋外のスペクトラムは図1のような分布を持ちます。波長に関して連続的な分布を持っていることがわかると思います。
一方、単一の波長しか持たない光を単色光(monochromatic light)と呼び、レーザー光などはこれにあたります。

RGB三原色

LMS錐体の相対的な感度
図2. LMS錐体の相対的な感度(角膜と水晶体によるフィルタリング込み?)

人間の目には色を知覚する3種類の視細胞(photoreceptor cell)(と暗所用のもう一種の細胞)が備わっていて、それぞれは異なる波長応答特性を持っており、最大の感度を示す波長を1としたときの相対的な感度曲線は図2のようになります。長波長に高い応答を見せる細胞から順に、L錐体、M錐体、S錐体と呼ばれ、それぞれは黄色周辺、黄緑周辺、青周辺に応答のピークを持ちます。
人間はこれらの3種の錐体細胞の反応の比によって「色」を感じ取ります。例えば赤色はL錐体の反応が他2つよりも大幅に大きいときに感じられる色であり、黄色はL錐体、M錐体の2つがよく反応した場合に感じられる色となります。人間はスペクトラムを直接色として認識する訳では無いため、とある2つの光が異なる分布を持つ場合でも、それらが3つの錐体へ与える刺激量の比が等しくなるのであれば人間には同じ色の光に感じられます。したがって、それぞれの錐体を単独で反応させられる光が3種あれば、人間が知覚可能な色全てを再現できることになります。ただ応答曲線がオーバーラップしているため、実際には3種のうち1種の反応が可能な限り他よりも大きくなるように波長を選ぶことによって、より幅広い色を表現することが可能になります。このようにして選ばれる3種の波長(の色)がRGB三原色となります。

紫(violet)

単色光の紫は青よりも短い波長を持ちます。しかし光の三原色では紫は赤と青を混ぜることによって作られることは有名だと思います。青よりも短い波長であればS錐体のみがよく反応し、青色と区別がつかない気がします。これは何故なんでしょう。
実は長波長にピークを持つL錐体は、青よりも短波長側でもわずかに反応するため(図2はあくまで相対的な感度)、紫色に見える短波長の光はL錐体とS錐体両方を反応させます。そのため赤と青の混合によっても表現が可能になります。

等色関数(color matching functions)

任意のスペクトラムが3つの錐体に与える刺激の比がわかれば、人間にとって同じ色に知覚される光をRGB三原色の混合によって作ることができます。スペクトラムは単一波長の集合と考えることができるので、単一波長ごとのRGB対応関係がわかれば全てを足し合わせる(積分)ことで、スペクトラム全体とRGBの対応関係を計算することができます。

CIE(Commission Internationale de l'Eclairage, 国際照明委員会)は、任意の可視光領域の単色光に対して、RGB三原色として用意した $ 700, 546.1, 435.8 \mathrm{[nm]} $ の単色光源の強さを調整し、同じ色に見えるようになったときの強さの比を記録する実験を1931年に行いました。その結果はRGB等色関数(color matching functions)と呼ばれ図3のような3つの関数になります。

CIE RGB等色関数
図3. CIE RGB等色関数

この等色関数を見てすぐ気がつく点として、Rに関する等色関数が負の値を持っていることがあるでしょう。これはRGB3つの単色光源をどう調整しても等色できなかったため、単色光側にRを足す必要があったことを意味しています。ちなみにG, Bの等色関数にもわずかですが負の区間があります。人間が知覚できる色を表現する際に、負の値が出るのは何かと扱いづらいということで、XYZ表色系が定義されました。詳細は後述しますが、このXYZ表色系の各要素に関する等色関数も決められ、図4のようになります。RGBとは異なり負の値が無いことがわかります。

XYZ等色関数
図4. XYZ等色関数

※錐体細胞の応答などが明らかにされたのは、等色関数の実験よりも歴史的に後のことらしいです。とすると、スペクトラムとRGBの対応付けのために実験が行われたのではなく、結果的に対応付けのためには等色関数という既知の概念が必要だったという話ですね。また、後述のCIE RGB表色系の三原色も、錐体細胞の応答に従って選ばれた訳ではないことが言えます。

表色系(color system)と色空間(color space)

xy色度図
図5. xy色度図
xy軸を結ぶ三角形はXYZ表色系の色域を、内側の三角形はCIE RGB表色系の色域を表している。

物理空間中のある位置を表現する際、xyz座標で表す直交座標系や、角度と距離で表す極座標系などいくつかの表現方法を用いることができます。色の空間、色の世界をそのまま色空間(color space)と呼び、物理空間と同様に様々な体系で表現することが可能で、その体系を表色系(color system)と呼びます。人間は3つの錐体細胞の反応量の比で色を知覚します。そのため、数学的には3変数あれば全ての色を表現可能です。様々な表色系がありますが、代表的なものとしては以下のようなものがあります。

RGB表色系

RGB三原色の比で色を表す体系をRGB表色系と呼び、それぞれに $ 700, 546.1, 435.8 \mathrm{[nm]} $ の単色光を用いるものをCIEのRGB表色系と呼びます。最も身近な表色系で、身の回りにあるほとんどのディスプレイはRGB三原色で色を表現していますね。ただし、大抵の場合はそれぞれの原色は単色光ではありません。

XYZ表色系

RGB表色系は錐体細胞のピークにおおよそ対応しており扱いやすいものの、人間が知覚可能な全ての色を表現するには負の値を用いる必要があります。例えば、レーザー光による鮮やかな緑色の単色光などがこのような色に相当します。XYZ表色系では、現実には存在しない色、虚色(false color)を用いることによって負の値を使わずにあらゆる色を表現できます。負の値を使わなくてよくなった一方、XYZ表色系では数値と色の直感的関係がわかりにくくなります。RGB表色系では光の感覚的な明るさは3つの値いずれからも影響を受けますが、XYZ表色系ではYは輝度と緑みを表しており、Yの量によって感覚的な明るさ・眩しさが変わりますが、一方でXZは赤みや青みにしか影響を及ぼさず、輝度には影響を与えません。

xyY表色系

色はあくまで3つの錐体細胞の反応量の「比」でしかないので、それらの絶対的な大きさは重要ではありません。 したがって、XYZ表色系の三刺激値を次のように正規化することができます。

\begin{eqnarray*} x = \frac{X}{X + Y + Z} \hspace{5mm} y = \frac{Y}{X + Y + Z} \hspace{5mm} z = \frac{Z}{X + Y + Z} \end{eqnarray*}

これら $ x, y, z $ を色度(しきど)座標と呼びます。正規化されているため $ x + y + z = 1 $ であり、2つが決まるともうひとつの値も自動的に求まります。 XYZ表色系のY、つまり輝度を固定するという条件を設ければ、同じ輝度の色は全て2次元平面の中に描くことができます。色度座標のx, yと輝度Yによって色を表す体系をxyY表色系と呼びます。

xy色度図と色域

輝度と独立したxy2次元平面は図5のようになり、これをxy色度図(xy chromaticity chart)と呼びます。色度図上で可視光域の単色光の座標をプロット(図中の数字は波長 $ \mathrm{[nm]} $)すると、図中の左上に山を持つカーブが描かれます。このカーブを単色光軌跡、スペクトル軌跡(spectrum locus)と呼びます。逆にカーブではなく右下の直線部分を純紫軌跡(じゅんむらさききせき, line of purples, purple boundary)と呼び、単一の波長の光では表すことができません。これらの2つによって囲まれる領域が人間にとっての全ての色を表しています。この図を表示しているあなたのディスプレイは(おそらく)RGB三原色を使っており、全ての色を再現できないので、図中の色や明るさはただのイメージです。(そもそも画像がRGBフォーマットですしね...輝度も青が低いので合わせようとすると全体的に凄く暗い図になります。=> sRGBディスプレイで表示できる最高輝度のを作ってみました。)
xy軸を結んでできる三角形はXYZ表色系によってカバーできる色の範囲であり、当然知覚可能な色全てを含んでいます。また、内側の三角形はCIE RGB表色系の三原色の単色光を結ぶことによって作られており、この範囲がCIE RGBによって表現可能の色の範囲です。中央付近にあるプロット点は $ x = y = z = 1 / 3 $ となる同表色系における白色点(white point, RGB表色系なら各要素を同じ値にしたときの実際の色)を表しています。このように色度図上では、あるシステムの表現可能な色の範囲を(三原色なら三角形で)示すことができ、その範囲を色域(しきいき, color gamut)と呼びます。

HSV表色系

RGB表色系は人間の目の物理的特性に沿った利便性の高い表色系ではありますが、一方で普段の生活における色の認識とは恐らく違うでしょう。多くの人はあるものの色を見たとき、どんな系統の色(+鮮やかさ)、どれくらいの明るさといった3要素を意識すると思います。HSV表色系は人間の直感的な色の認識を反映した表色系であり、色相(Hue)、彩度(Saturation)、明度(Value)の3要素が名前の由来となっています。RGB表色系と相互に変換することが可能です。
HSV表色系では、RGB表色系におけるCIE RGBのような具体的に定義された物理量との対応付けは存在しません。

xy色度図中のRGBの三角形などを見ると、知覚可能な色の「ほとんど」はカバーできていないように見えます。しかしxy色度図は、人間が色を見比べた時の感覚的な距離といったものを考慮していないため、図中における色の距離は人間の感覚的距離とは一致しません。この不均一さを改良した表色系にLu*v*表色系やLa*b*表色系と呼ばれるものがあり、それらによって表される色空間を均等色空間(uniform color space)と呼びます。

スペクトラムとRGBの変換

スペクトラムからRGBへの変換

スペクトラムからRGBへの変換は、等色関数とスペクトラムの積を積分することで求められます。例えばあるスペクトラム $ S(\lambda) $ のCIE RGB表色系における $ R $ の値は次のように計算されます。

\begin{equation*} R = \frac{1}{\int_{\Lambda} f_{\bar{r}(\lambda)} d\lambda} \int_{\Lambda} S(\lambda) \hspace{1mm} f_{\bar{r}}(\lambda) d\lambda \end{equation*}

ここで、$ f_{\bar{r}}(\lambda) $ はRの等色関数、$ \Lambda $ は等色関数の波長範囲です。
このようにスペクトラムからRGB表色系に直接変換しても良いのですが、RGB表色系には様々なバリエーションがあり、対象とするディスプレイに従って適切な等色関数を用いなければなりません。一方XYZ表色系は1種類しか無く、なおかつXYZから各RGB表色系への変換も容易なため、一旦XYZ三要素に変換した後、RGB表色系に変換するのが便利です。各要素への変換式は次式となります。

\begin{equation*} X = \frac{1}{k} \int_{\Lambda} S(\lambda) \hspace{1mm} f_{\bar{x}}(\lambda) d\lambda, \hspace{5mm} Y = \frac{1}{k} \int_{\Lambda} S(\lambda) \hspace{1mm} f_{\bar{y}}(\lambda) d\lambda, \hspace{5mm} Z = \frac{1}{k} \int_{\Lambda} S(\lambda) \hspace{1mm} f_{\bar{z}}(\lambda) d\lambda \hspace{5mm} \end{equation*} \begin{equation*} k = \int_{\Lambda} f_{\bar{y}}(\lambda) d\lambda \end{equation*}

XYZからRGBへの変換

XYZ表色系はRGB表色系に単純な一次変換を適用することで得られる表色系であるため、それらの間の変換も同様に一次変換で可能です。例えばD65標準光源のxy座標を白色点とするsRGB表色系へのXYZ=>RGB変換は次式で表されます。

\begin{equation*} \left[ \begin{array}{c} R \\ G \\ B \end{array} \right] = \left[ \begin{array}{rrr} 3.2404542 & -1.5371385 & -0.4985314 \\ -0.9692660 & 1.8760108 & 0.0415560 \\ 0.0556434 & -0.2040259 & 1.0572252 \end{array} \right] \left[ \begin{array}{c} X \\ Y \\ Z \end{array} \right] \end{equation*}

RGBからスペクトラムへの変換

RGBからスペクトラムへの一意な変換は存在しません。何故なら無数の異なるスペクトラムが同じRGB値を取り得るからです。ただし、スペクトラムがいくつかの特定のスペクトラム(例えば三原色のLEDのスペクトラム)の結合によって表されるといった条件を設けられる場合は、変換が可能になるでしょう。適当な制約条件を設定してそれっぽいスペクトラムを生成する手法[Meng2015]もあります。
ちなみに同じ色に見えるが異なるスペクトラムのことをメタマー(metamer)と呼びます。ある物体の色は、基本的には光源のスペクトラムと物体の反射スペクトラムの積を基に知覚されるため、ある光源の下では異なる色に見えた2つの物体が、特定の光源下では同じ色に見えるという現象が発生します。この現象を条件等色(metamerism)と呼びます。

検索ワード「RGB 波長」

このページにたどり着く要因となる検索ワードに「RGB 波長」といったものが頻繁に出現していることがわかりました。ここで言っている波長というのが単波長だと仮定した上で、その検索を行ってきた方に対する回答を簡単に書いておきます。

波長からRGBへの変換

等色関数を使って一応変換することが可能ですが、色域外になって負の値が出るので値のクランプが必要になります(もはやそれが意味のあるRGB値なのか微妙ですが...)。また、一口にRGBと言っても色々あるので適切な等色関数を選ぶ必要があります。

RGBから波長への変換

RGB表色系による色域はxy色度図中に三角形で表されますが、単色光軌跡がその三角形に入っていないことから、これも完璧な変換が存在しないことがわかると思います。

さいごに

このページにおいては、人間の色知覚は3つの錐体細胞の反応によってのみ決まると書きましたが、 人間には桿体細胞と呼ばれる暗所時用の視細胞もありますし、まだまだ解明されていない色知覚のプロセスが存在する可能性があります。
このページで解説した知識を用いて、スペクトラムを考慮したレンダリングを実装することができます。その解説を「スペクトラルレンダリング」で行います。

参考文献

  • [Meng2015] Johannes Meng, Florian Simon - "Physically Meaningful Rendering using Tristimulus Colours", 2015
  • http://www.cie.co.at/index.php/LEFTMENUE/index.php?i_ca_id=298
  • http://www.cis.rit.edu/research/mcsl2/online/cie.php
  • http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
  • http://www.enjoy.ne.jp/~k-ichikawa/CIEXYZ_RGBmat.html

Today : 00000060 Total : 00048121
Copyright © 2017 shocker.