kdenologue

たまに何か作ります。

カラーマネージメントとか色域とかの話

この記事はUEC Advent Calendar 2017の6日目の記事です。
adventar.org

昨日は id:zico1222 さんのAgora は古代ギリシャ語で「広場」の意 - zico's blogでした。

Agora、あんま使わないんですがどう活躍しているのでしょう。

さて、技術系の話をしようと思ったのですがいい感じに役に立つネタがないのでしばらく前に色々調べた色域とかカラーマネージメントの話をざっくり書いておこうと思います。

f:id:kden:20171206225453p:plain
ところで、この2つの絵の色、どう見えていますか?

多分右のほうが色あせて見えると思います。表示しているソフトと設定が少し違うだけで、両方とも同じデータなんですよね。今回の話は、上のような色の違いの話になります。

世の中、デジタルで色を扱うときはたいていRGB各色0~255で表します。一方で、人間が見ることのできる現実の色というのもあります。ここで、データと見た目をどう対応付けるのか、という決め事が必要になります。#FF0000は人間の目で見える色だとこの色、#00FF00だと~というふうに。

この対応付けに、表現力(見える色の数が多い少ないのこととする)に差があるとします。仮に、現実世界での赤具合を、人間の知覚の限界を1.0としたときに0~1.0をそのまま0~255に当てはめるものと、何らかの理由で0~0.8までを0~255までに当てはめる二種類の対応付けがあるとします。当然、前者のほうが表現力は高いですね。

さて、ここで問題となるのは、データ上での値、例えば127は現実世界ではどんな色なのでしょう。先程の例で言うと、前者では多分0.5付近ですね。一方で、後者だと、0.4付近になるのではないでしょうか。
つまり、データを読んで表示する際には「もともとこのデータはどの程度の表現力で表すことが想定されているのか」という情報が必要になります。


さてさて、さらに問題があります。先程、「この255は1.0のことだからね!」と正しく解釈できたとしましょう。次は、モニタが正しく表示しているか?という問題にぶち当たります。例えば理想的なモニタは255という数字を受け取ったときに1.0の色を出すとします。一方で、もしモニタが1.1までの色が表示できるのにも関わらず、0~255をそのまま0~1.0に当てはめて表示できてしまう場合、どうなるでしょうか。

全体的に鮮やかになってしまいますね。0~1.0の色は0~231あたりのデータで埋まって、残りは鮮やかすぎて見えなくなってしまいます。となると、やはり「このデータを受け取ったらこんな色で表示されますよ」という情報も欲しくなってきます。このデータを逆算して、送るべきデジタルの数値をモニタに送ってやれば、もともと表示したかった正しい色で表示されるはずです。先の例で言えば1.1で割った値を送ってあげればよさそうですね。

話は最初の画面に戻ります。なぜ同じデータなのに表示が違うのか、というとこの「データと色の対応付け」の設定に差があったからです。

今、同じデジタルの値に対して、表す色域が広い(表現できる色の数が多いと思ってもらってまあいいです)設定であるAdobeRGB、そうでもないsRGBという二種類を考えます。この二種類で記録されたデータがそれぞれあるとします。

まず、モニタ側がsRGBで表示されている場合、sRGBで記録されているデータはそのまま送ってあげればただしく表示されますね。一方で、AdobeRGBの場合は記録している範囲が広いので、「ちょっと強めに表示してくれ~」と変換をかけなければいけません。思い出してください、0~0.8の範囲しかないところに0~1.0をフィッティングさせると、全体的に値が小さくなってしまうので、もとの色で表示したいときは全体的に持ち上げる必要があります。

次に、モニター側はAdobeRGBで表示するように設定されているとします。このとき、sRGBで記録されているデータは、モニタ側にデータを送るときに「ひかえめでたのむ~」と変換が必要になります。先と逆です。

最初の画像がどういう状況かというと、AdobeRGBのモニタ設定でsRGBの画像を開いたとき、左のビュワーは特に色域を考えていないので強く見えてしまっています。右は、元のソースがsRGBで表示がAdobeRGBということが考慮されているのですこしくすんで表示されています(が色域の広いAdobeRGBのモニタでみるともともとsRGBで想定していた色と一致するというわけです)。

ややこしいですね。ほんと。加えて、白色点(白がどんな色か)とか、ガンマ値(今までの例で言うと0~255を0~1.0にどんなふうにフィッティングさせるのか)細かい話がたくさんあります。

しかも、ここまで話したのは色の「正しさ」で、「綺麗さ」ではないんですよね。例えばテレビとかで「美しい朱」とか表現ありますが、あれはつまりもともとの入力信号を高色域にいい感じに引き伸ばして表示しているということになります(違ってたらごめんなさい)。スマフォの画面で「めっちゃきれい」とか言ってるのもだいたい同じです。正しいかどうかとは別です。

MACは昔からいい感じに設定をしてくれていて、iPhoneはなんか別の色域を使うぜ!とか言い出すし、Androidスマフォはやっとこういう色域の設定ができるようになりつつある(Nougatからだったかな?)なか、先の例で示した画像で左側の「特に色域を考えていない雑なビュワー」はWindows10標準のフォトアプリ*1だったりします。もっとがんばってくださいよWindows10。


明日は id:8gu15 さんの 「くこ (http://8gu15.hatenablog.jp/) は危険」 らしいです。

*1:10からのやつで、昔使われていた「Windowsフォトビューアー」はがんばって正しく表示してくれるそうです