色、色域、カラープロファイルのはなし

せっかく Adobe RGB 98% カバーなんて言う、高い液晶を買ったにも関わらず、印刷しても他の液晶で見ても、まるで変な色が出て悩む日々です。この背後には、カラープロファイルとか、色空間とかいう概念が関わっているようなので、ここ1週間ほどがしがし調べました。初心者にわかりにくく、理系にわかりやすく(?)書いてみましょうw 私、専門でも何でもないので、ちげぇよぼけぇ!という内容があったら指摘してくださいませ。というか、誰か教えてください。助けてください。

色とは

ご存じの通り光は様々な波長の電磁波の重ね合わせである。各波長の成分プリズムなどでスペクトル分解できる。光と色の関係はどうだろうか? 同じ光を目に照射すれば同じ色刺激を受けることは理解できる。では、別の光で同じ刺激を与えることは可能だろうか? 

色 - Wikipedia

Wikipediaによれば、実は人間の目には光で刺激を受ける、実にわずか3種類の錐体細胞によって知覚している。各細胞は、各光の波長に対して吸収率をもっていて、ある光に対して各錐体細胞は1次元の情報しか得ることができない。合計で、たったの3次元の情報しかないのだ! これはちょっと目から鱗である。ある一つの錐体細胞に限れば、違う波長の光を当てて、同じ刺激を与えることが可能なわけだ。ただし、別の波長であれば、他の錐体細胞はもっと別の刺激を受けるので、そういうわけで色を認識できる。余談だが、音はこれとは対照的。和音を認識できると言うことは、音の重ね合わせも別物として認識できる。一方、音は空間的な広がりを認識することが難しい。なかなか、うまいこと棲み分けができているものだ。

さて、では人工的に色を合成するにはどうするのが簡単か。ある光を受けたときに得る刺激と同じ刺激が得られるような光を照射すればよい。この刺激はたったの3次元なので、自由な波長の重ね合わせができればいくらでも自由度がある。たとえば、S,M,Lがそれぞれ20,40,50(単位はよくわからん)の刺激を受けていたとする。ここに、S,M,Lに対して、(1,0,0), (0,1,0), (0,0,1)の刺激を与えられる光線があったとしたら、これを20:40:50の割合で照射してやれば先ほど受けていた刺激を再現できる。元の光のスペクトルとは無関係に! もちろん別の光線でもよくて、(1,1,0), (0,1,1), (0,0,1)を20:20:30でも同じ刺激になる。これは単に3次元空間中で基底を変換しているだけなので、線形独立な任意の3種類の光線の重ね合わせで、任意の刺激を再現できる。これに従ってR(700nm)G(546.1nm)B(435.8nm)の3波長を基底にしたのがRGB表色系だ。

色空間 - Wikipedia

ただし、もちろん気をつけなければいけないのは、「任意」の基底を本当に選ぶと、当たり前だが成分が負になることがある。もともとこの3波長の光ですべての色を再現しようとしたところで、再現できない色があることを発見したそうな。負の光を放つことはできませんからね。以下のサイトがわかりやすい。

DIC Color Design, Inc.

これを嫌って、負数がでないように基底を張り直したのがXYZ表色系である。これが、よくカラープロファイルなどのツールで目にする、あの扇形の図である。やっていることは基底の張り直し。ここで、一番大事なのは、語弊を恐れずに書くと、色は三次元空間上に存在するという点である。

※会社でちょっとはなしたことですが、XYZ表色系の図で扇形が描かれるのは自然界に存在する光による色刺激の空間を表しているものと思われます。各波長の光線を目に当てたときの色刺激は、各錐体の吸収率が線形ではないため、波長をかえてプロットするとこの色空間上で曲線になります。これが扇形上の図中の曲線部分。途中で切れているのは、赤外光と紫外光は人間の目に知覚できないため(これは吸収率が0になるということ)、描かれていないということと思われます。光はこの各波長の光線の線形和ですから、積分して1になるような重みをつけた色刺激はこの曲線の内側に存在することになります。負の光はないわけですね。

PCにおけるRGBとカラープロファイル

実際のディスプレイを考えてみる。ディスプレイは概ねRGBの成分の重ね合わせで色を再現するわけだが、上記の議論の通りこれでかなり自由に色を再現できる。RGBのそれぞれの光を消灯状態から最大までそれぞれ変化させると、これは3次元空間上で六面体になる(XY平面は各出力の比なので、六面体を斜めに切った三角形になる。拡張点がR,G,Bのみを最大出力した点)。これが表示装置での色域と呼ばれるものである。色域は表示装置固有のものだ。しかし、この取り回しを楽にしようとういことで、ブラウン管の標準的な色域としてWindowsに採用されたのがsRGBという色域である。RGB 24bitの情報を、この六面体内にマッピングされることになる。つまり、PCにおけるRGBとは、この六面体の方向に基底を取り直したときの座標である。当然、装置によってこの基底がことなるわけだから、装置によって同じRGB値を出力すると別の色が表示されてしまうことになる。ここで、仮にディスプレイの色域がわかっているのなら、相互に同じ色を表示させることは簡単であろう。装置Aでの3次元のRGB色ベクトルを、一度(たとえば)XYZ表色系中での座標に変換し(単なる基底の張り直し)、装置Bでの色域中での座標に再度変換すればいい。この変換マップがカラープロファイルである。画像ファイルを読み込むときにXYZ表色系への変換が画像に埋め込まれたカラープロファイルで、表示時に使うのがディスプレイのカラープロファイルである。やっていることは、単なる一次変換である。実際は、中間色の再現のためにガンマ値の変換を行うが、ここではすっ飛ばす。このあたりの詳しい説明は、かの液晶選びの有名サイトを参照するのがよい。

miyahan.com | 液晶ディスプレイとカラーマネージメント

もちろんこの変換によって0-255の範囲を超えてしまうことがある。こうした色はその装置では再現できない。しょうがないので0や255で丸められることになる。この段になって、初めて私は高い液晶を買った恩恵にあずかるのである。たとえば、LightroomAdobe RGBとsRGB出力したJPEGを比べてみよう。firefoxでそれぞれひらいてPrintScreenした画像です。このくらいの色域の写真なら、実はsRGBの範囲に収まっているのでどちらで出力しても同じ色で出力される。firefoxはちゃんとカラープロファイルを適用してくれる。ちなみにIEでは、別の色で表示されるが、これはカラープロファイルを読んでないからであって、色域の違いではない。

彩度をがしっとあげてみるとどうなるか。ごらんの通り。左がAdobe RGB出力、右がsRGB出力である。firefoxでちゃんとプロファイルは当たっているのだが、それ以前にJPEG出力する段でsRGBは緑が飛んでしまった。ところで、Lightroomの色飛び表示はどの色域でやっているのだろう。警告でないということは、sRGBではないんだろうが、sRGB出力を前提として作業している人には辛いかも。

特にAdobe RGBは緑〜青のあたりの色域がsRGBで広いのが特徴なので、このあたりの色をsRGBでは再現できません。しかし、ここまで来て思うのは、こんなケバい色の物質なんて日常生活にないような。私のもともとの現像は上の画像だったのでした。新緑でよく晴れた状態で逆光で撮って、彩度あげまくって現像したら生きてくるかな。あるいは、緑色の天体とかか? ところで、RGBの出力はディスプレイによって違うということからわかるとおり、Webページのデザインとかどうなってるんでしょうね。あれは、sRGB下での色という前提があるんでしょうかね。なかなか謎です。

ちなみに、キャリブレーションというのは、ここまでが全部ちゃんと行われた上で行う作業。想定されている色域と現実にディスプレイが出力できている色域にギャップが生じるわけです。これを埋める作業です。特に中間域で線形に出力されるとは限らないようです。たとえば、RGB=128,128,128の入力に対して、それぞれ最大出力の半分ずつ出力されるとは限らないということのようです。

しかし、こうした色域の狭い広い問題以上に、現状ではこのカラープロファイルの適用を行っているアプリケーションが、少なくともWindowsでは極めて少ない。その点についても上記サイトを参照されたい。ということで、最近mac買おうか悩んでるのでした・・・。