2015年9月5日土曜日

Maya色管理1 カラー管理の概要

概要をメモ

maya 2016ではレンダリング空間も含めたカラー管理ができるとのことなので調査したい。
ただしmayaはほぼ未経験なので間違った内容があるかもしれない

[ウィンドウ] > [設定/プリファレンス] > [プリファレンス]
[設定] 内にある [カラー管理] を押す


デフォルトではカラー管理が有効。
無効にした場合はリニアワークフローではない旧式のレンダリング方法となる。

カラー変換プリファレンス


レンダリングスペース

レンダリングで取り扱われる色空間を指定するところ。
sRGBでは表せないような広い色を取り扱うときに設定を変える。
レンダリング空間はすべてリニア空間。
デフォルトでは[scene-linear Rex 709/sRGB]となっている。

選択できるレンダリングスペース

ビュー変換

表示用の色空間のことで、レンダリング結果を表示用の色空間で表示してくれるもの。
Render ViewとViewport 2.0の表示時に適用する色空間とのこと。
表示表の色空間は基本的にはガンマ空間。
デフォルトの設定ではs[RGB gamma]となっている

ビュー変換のマトリクスがかけられている。この時白色点の変更も同時に行われていると思われる。(15/9/16追記)

選択できるビュー変換

入力カラースペース規則


使用しているテクスチャがどの色空間で作ったものか一括で指定する機能。
個々のテクスチャで設定する場合はこの機能は使わなくていいと思われる。
テクスチャの名前ルールで入力カラースペースが変更される。
このルールは複数持たせることが可能。例えば法線マップはRawにしてそれ以外はsRGBにするときなど。

選択できる入力カラースペース

出力カラー変換プリファレンス

出力変換をレンダラに適用

デフォルトでは無効になっている。


レンダリング画像は通常リニア空間なのでそのままでは表示用のデータにはなっていない。
[出力変換をレンダラに適用] を有効にした場合、ガンマ補正や表示媒体に合わせた色空間への変更がレンダリング結果に反映される。
出力画像のトーンのルックをここで決めたい場合もここで調整するのは有りだと思う。

他のコンポジットツールと連携する場合はリニア空間であるレンダリング空間でやり取りするため出力変換は適用しないと思う。
ただしリニアRGBが8bitでは諧調がとても足りないので通常openEXRを使う。

先ほどの[ビュー変換]の設定はプレビュー用の設定なのでレンダリング結果のデータには影響を与えないもの。

選択できる出力変換

UI設定

カラー管理済みのポットを表示

これにチェックがあるとアトリビュートのカラーに表示されている色が表示用の色空間で表示してくれる。これが無効だとレンダリング空間であるリニアな値がそのまま表示される。と思う。


2015年9月4日金曜日

レンダリング時の色空間

モニタガンマを考慮したワークフローを行ったとしても色空間を特に気にせずにレンダリングを行った場合、大抵はsRGB空間のデータが入力されていて、そのままsRGB空間でレンダリングされているといえる。
AdobeRGBのモニタ環境で見かけが正しく作られたデータの場合はAdobeRGB空間でレンダリングされているともいえる。

これはsRGBやAdobeRGB等のように色空間が違う場合、同じ見た目の色を扱うと違う数値になるということが問題となる。
例えばsRGB(231,121,35)とAdobeRGB(206,121,47)は同じ色。これらの色は何色かというとXYZ(0.4007,0.3085,0.0543)またはL*a*b*(62.38,37.06,61.53)である。

sRGBは規格の中でも特に狭い色空間でマンセル色表の色のうち50パーセントくらいしか表せないといわれているし、カラーチェッカーのNo18のCyanも赤チャンネルがマイナスになってしまう。
また蝋燭や低温の白熱灯は1900ケルビンくらいの光源色となりsRGBでは青チャンネルがマイナスになるため0にされる。そうなるとホワイトバランスの調整をしても色が戻ってこないことになるので色々と不便。

ポスト処理で色調整などを行うことを考えると、広い色空間で作っておいたほうが有利であることは想像がつくが、かといって高色域の色が表示できるモニタをそろえることは厳しい。
したがって通常はレンダリング空間は色域は広い色空間を使うが、そのままでは表示上は低彩度なうえに色の偏りが生じてしまうので表示時にモニタ環境に合わせた補正が行われる。

レンダリング前の入力データに関しても基本はモニタ環境の色空間で作成しレンダリング前処理としてレンダリングの色空間に変換する必要がある。

例えば作業環境がsRGBでレンダリングの色空間をXYZとした場合は下記のような変換が行われる


ただし上の図はざっくりしたもので実際の映像制作ではもっと複雑であると思われる。

入力値はどの空間で定義しても問題ないが、XYZ色空間のように無駄に広いものを使うと8ビットテクスチャでは諧調が失われやすいので注意が必要。

もしかしたら最近はRec.2020(4K、8KのUHDTV規格)のモニタもあるみたいなのでそれで統一できれば、入力とレンダリングと表示の色空間がすべて統一でき、上の図のような変換処理はしなくてもよいかもしれない。

レンダリングの色空間は何が良いのか

個人的にはXYZ色空間でのレンダリングは色が変になることがあるのであまりよくないと思っている。
下記の色空間が良いと思われる。

Sharp RGBレンダリング用に最適化されている色空間とのこと
Aces AP1
(ASECsg)
最初に作られたACESのAP0という色空間ではなく最近定義されたAP1の色空間で、AP0よりも狭い色空間であるがレンダリング用に最適化されたものとのこと。
Rec.2020の色空間とかなり近いものとなっている
Rec.2020UHDTVの規格、色域もASECsgと似ている

ライティング結果の色が正しくならない問題

ライティング結果の色を正しくレンダリングできない大きな原因は波長でレンダリングしていないからだが、この件に関してはスペクトルレンダリングで対応するしかないため普通はあきらめる。

次に問題になるのがどの色空間でレンダリングするかで色が変わってしまうという問題
入力する個々のデータに関してはどのような色空間で作っても互換性はあるのだが
一度レンダリングしてしまうとレンダリング結果をXYZやL*a*b*に色変換しても色空間が違うレンダリング結果とは違う値になるため互換性がないということ。
なのでどの色空間でレンダリングするのかということは案外重要だと思う。

どの色空間でも単一のカラーやテクスチャ単体では互換性があるが、ライトが照射されたりしてRGBの掛け算等の演算がされてしまうと互換性がなくなるということ。

波長でレンダリングと3原色レンダリングの比較

波長でライティング : 色と光を波長でライティングして最後にXYZにしたもの
XYZでライティング : 色と光をそれぞれXYZにしてライティングしたもの

ここではA光源(タングステンライト)でライティングして、XYZの値をガンマ2.2で補正した色を表示した。
分光反射のデータはNoboru Ohta (1997)を使用した。





この2つが違うのは3原色レンダリングでは仕方のないこと

さらに言えば初期のナトリウムランプのような輝線スペクトル(589nm)では素材色がグレーに見えるはず。
また、日中の自然光と比べて蛍光灯の下では色がくすんで見えることが現実には起こる。
3原色のレンダリングではこのような現象は再現できない。


輝線スペクトルの例
 
 ここでは590nmの単色とした場合の比較でsRGBで表示


 単色の輝線スペクトルの場合は濃淡だけとなるのが正しいが3原色のレンダリングでは色がついてしまっている


蛍光灯の例(gif)

 黒体輻射の連続的なスペクトルは光源として演色性が良いが、蛍光灯は演色性が悪い。
 ここではF2蛍光灯(工業用の広帯域蛍光灯とのこと)を例に挙げる。色温度は4150K。
 比較するために黒体放射の色温度も4150Kとし、ホワイトバランスは共に4150Kとした。
 表示色はsRGB


 波長でライティングされた方は黒体輻射の光源と比べF2蛍光灯は色がくすんでいることがわかる。
 一方、XYZでライティングしたものはほとんど変わらない。これは黒体輻射の4150kとF2蛍光灯ではXYZにしてしまうとほぼ同じ値になってしまうから。

 左が黒体輻射4500K、右がF2蛍光灯。
スペクトルは全然違うのにXYZの値はほぼ一緒。この2つの光の色だけを見たとき人間には同じ色に見えるということでもある。

このことからも3原色のレンダリングでは限界があり、かといって原色を増やしてスペクトルレンダリングに対応するにはレンダリングコストが大きいのかもしれない。
今回調査したいことはこのことではなくて、3原色レンダリングの最適な色空間を見つけること。

レンダリング空間の3原色の色比較

レンダリングするためにはいったいどの原色を使ったほうがいいのかを調べたい。

今回テストした色空間
sRGBXYZ
ACES ap0 ACES ap1 Sharp RGB

カラーチェッカーを波長から求めた色と比較してみる。
  • わかり易いように表示色空間はsRGB固定とする。
  • レンダリング空間の白色点と表示空間のsRGBの白色点の違いはBradford変換している。
  • sRGBの値と、その値からL*a*b*の差分であるΔEの値も比較した
  • 光源は演色性の良い黒体放射を使用する。6500Kでは違いが少なかったので3000Kと20000Kで検証する。

リファレンス : 波長から求めた色 光源は黒体輻射3000K


XYZ : 反射と光源の色をXYZに置き換えて掛け算したものをsRGB表示


sRGB : 反射と光源の色をsRGBに置き換えて掛け算したものをsRGB表示


ACES Ap0 : 反射と光源の色をACES Ap0に置き換えて掛け算したものをsRGB表示


ACES Ap1 : 反射と光源の色をACES Ap1に置き換えて掛け算したものをsRGB表示


Sharp RGB : 反射と光源の色をSharp RGBに置き換えて掛け算したものをsRGB表示


リファレンス : 波長から求めた色 光源は黒体輻射20000K


XYZ : 反射と光源の色をXYZに置き換えて掛け算したものをsRGB表示


sRGB : 反射と光源の色をsRGBに置き換えて掛け算したものをsRGB表示


ACES Ap0 : 反射と光源の色をACES Ap0に置き換えて掛け算したものをsRGB表示


ACES Ap1 : 反射と光源の色をACES Ap1に置き換えて掛け算したものをsRGB表示


Sharp RGB : 反射と光源の色をSharp RGBに置き換えて掛け算したものをsRGB表示



次はさらにレンダリング空間内でホワイトバランスを調整した場合

  • ホワイトバランスは光源色に合わせ、sRGB(白色点D65)空間で白になるようにしている
  • 光源は黒体輻射3000Kで行った
リファレンス : 波長から求めた色 光源は黒体輻射3000K。ホワイトバランスは3000K


XYZ : 反射と光源の色をXYZに置き換えて掛け算したものをsRGB表示


sRGB : 反射と光源の色をsRGBに置き換えて掛け算したものをsRGB表示


ACES Ap0 : 反射と光源の色をACES Ap0に置き換えて掛け算したものをsRGB表示


ACES Ap1 : 反射と光源の色をACES Ap1に置き換えて掛け算したものをsRGB表示


Sharp RGB : 反射と光源の色をSharp RGBに置き換えて掛け算したものをsRGB表示


結果

カラーチェッカーだけではサンプルが少ないかもしれないがはやり色域が広いからといってXYZをレンダリング空間にすることは向いていないみたい。
ACES ap1 と Sharp RGBが特に安定している。

そもそもXYZは色を定義するためのもので色計算を行う空間には向いていないと思う。
Bradford法のホワイトバランス変更でもXYZから一度LMS空間に戻しているのも似た問題なのかも。


現状の映像業界ではデジタルシネマの標準の一つDCI-P3が使われることが多いかもしれない。
色域の広さからもDTPで使われているadobeRGB的な位置づけだと思われるが今後はもっと色域の広いUHDTVの規格であるRec.2020に置き換わっていくと思われる。

ただ最近のデジタルシネマではACESが標準になりそうな感じなのでACES ap1が使われる可能性も高いかも。

Rec.2020は実際に表示できる色域だが、ACES1 ap1 は可視領域から少しはみ出ているためRec.2020のほうが扱いやすいのかもしれない。

どうやらMaya2016ではレンダリングの色空間が設定できるようなので次はそれを試してみたい。

参考

sharp RGB

Picture Perfect RGB 

SIGGRAPH2009 Color Imaging
(後半)

Picture Perfect RGB Rendering Using Spectral Prefiltering and Sharp Color Primaries
2015年8月25日火曜日

ColorChecker

ColorCheckerの色の値を正確に知るための調査。
その為には 「分光反射率」 と 「光源の分光分布」 と 「XYZ等色関数」 を得る必要がある。

このページからたどれば大体必要なものは得られそう。
ColorChecker - Wikipedia https://en.wikipedia.org/wiki/ColorChecker

XYZ等色関数

波長の分布からXYZ色に変換するための各波長ごとのウェイトのこと
  • CIEが定めたCIE_RGBの原色を使った加法混色であらゆる色を表そうとするとこの組み合わせでは彩度が足りなくて再現できない色が在り、その場合は足りない分は負の値とするRGB等色関数ができたが、もっと扱いやすいようにこれを変形させて負の値が無いXYZ表色系が作られた。この等色関数がXYZ等色関数。
  • CIE 1931(2°視野) と CIE 1964(10°視野) があるがほとんどCIE 1931(2°視野)が使用されていると思われる。
  • 一般的には波長に対する等色関数の範囲は380-730で扱われていると思われるが広範囲のものでは360-830nmもある。
  • CIEが定めたRGB原色は1931年当時入手しやすかった水銀の輝線スペクトルから選ばれた。
    • R = 700.0nm 可視域最長のキリのよい波長
    • G = 546.1nm 水銀の輝線スペクトルより
    • B = 435.8nm 水銀の輝線スペクトルより

XYZ等色関数についての補足

  • RGB等色関数とマイナス値。
    • XYZ等色関数の基となっているのがRGB等色関数
    • 等色実験によリファレンスの純色と比べてRGBの加法混色では彩度が足りなかったところが負の値となる。
    • 白いところほど大きな負の値になっている。
  • 下記の色は波長をCIE_RGB変換したもの。(γ=2.2の補正。また青が飽和しないよう1.96で割っている)

    • これは波長のエネルギーはすべて同じとしたときの見え方。
    • 近紫外線より大きな波長から徐々に紫が見えてきて、青、緑、黄緑、黄色、橙、赤に感じた後は近赤外線になるにつれて見えなくなってくる。
    • 1050 nmの赤外線が見えるという話や子供で310nmの紫外線が見えるという話もあるhttps://en.wikipedia.org/wiki/Light#cite_note-Sliney1976-10
  • 上記の画像で左側があまり紫に見えないのはモニタの色空間がCIE_RGBとは違うから。sRGBの色に変換したのがこれ
CIE 1931 observer
  • 2度視野等色関数ともいう
  • 視角約 1°∼約 4°の視野に関して扱う

CIE 1964 observer
  • 10度視野等色関数ともいう
  • 視角 4°以上に対して扱うもの

少しマイナーな等色関数

  • modified by Judd (1951)
  • modified by Judd (1951) and Vos (1978)
CIE1931等色関数の勧告後、Judd,Vosにより V(λ) の修正が提案され、それに伴ってCIE1931等色関数にも修正が必要になると考えられた。また、StilesとBurchによる等色関数の測定においても、被験者の等色関数データの平均とCIE等色関数には有意な差があることが報告された。しかし、CIEは、これらの差は標準を変更するほどの違いではないとして、現在でも2°視野用にCIE1931等色関数が国際標準として利用されている。
via:六原色ディスプレイを用いた等色実験

XYZ等色関数のリファレンス

CIE - INTERNATIONAL COMMISSION ON ILLUMINATION
http://www.cie.co.at/index.php/LEFTMENUE/index.php?i_ca_id=298
380nm-780nm 5nm step

JIS Z 8781-1:2012 測色−第1部:CIE測色標準観測者の等色関数
http://kikakurui.com/z8/Z8781-1-2012-01.html
360-830nm 1nm step

File Exchange - MATLAB Central
http://www.mathworks.com/matlabcentral/fileexchange/7021-spectral-and-xyz-color-functions/content/colorMatchFcn.m
Judd (1951) and Vos もある。一個下のリンクをリファレンスにしている↓

Colour matching functions
http://cvrl.ioo.ucl.ac.uk/cmfs.htm
各種等色関数を出力してくれる

色空間の変換 (1)
http://w3.kcua.ac.jp/~fujiwara/infosci/colorspace/colorspace1.html
RGB座標からXYZ座標への変換の説明が記載

Derivation of the 1931 Standard Observer
http://www.cis.rit.edu/mcsl/research/1931.php CIE1931_RGB_v2.xls
RGB等色関数のテーブルが記載。上のグラフで使用したもの。

分光反射率

可視光領域の各波長に対して反射した割合の分布を表したもの
分布量が右側に集中していれば赤い物、右ほど青、中間なら緑色、全波長を均等に強く反射すれば白、弱ければ黒といった具合

主に下の2つのデータが使われていると思う。

Noboru Ohta (1997) 

http://www.cis.rit.edu/research/mcsl2/online/CIE/MacbethColorChecker.xls
 もとはコロナ社大田登出版の書籍に掲載されているものらしい。
 5nmステップ、範囲は380nm-780nmの範囲

BabelColor Avg

http://www.babelcolor.com/download/ColorChecker_RGB_and_spectra.xls
 BabelColorというところが計測した平均値が使われている。時期的にはこちらのほうが新しい。
 10nmステップ、範囲は380nm-730nm

Noboru Ohta (1997) とBabelColor Avgの比較

分光反射のプロットと分光反射から得られるxyY,RGBがどの程度の差があるのか知りたかったので比較した。
  • 等色関数はCIE 1931 observer
  • ステップは分光反射、等色関数、ともに5nm
  • 光源を無視したxyY。(全波長でエネルギーが均一なE光源ともいえる)
  • RGBは8bit表示での比較。(xyYからCEI_RGBに変換後ガンマ2.2の補正をしたもの)



光源の分光分布

光源の各波長に対してどのくらい強度があるかの分布

下の図は5nmステップの分光分布データから求めたXYZ値とsRGB色を表したもの。
illuminant A illuminant C

illuminant D50黒体輻射 5000K

illuminant D65黒体輻射 6500K

illuminant Eilluminant F7
↑nikqさんのツイートにより間違いが指摘されていたので修正しました。6500Kの画像が5500Kのものになっていました

黒体輻射

黒体とは真っ黒な物体であり、可視光以外から見ても黒いためすべての波長を吸収する理想の物体のこと。
黒体を加熱するとそれに伴った電磁波が発生し、この黒体の温度(ケルビン)と発生する電磁波の各波長の強度の関係はプランクの法則によってわかる

鉄が熱せられて赤くなり、もっと熱すると白くなるのも似た現象。
白熱灯のフィラメントが高温になるほど赤味が少なくなるのも同じ。
太陽の色も温度が関係しているし、星が青白いものは高温だから

0Kが絶対零度で摂氏-273.15℃のこと。人体も赤外線を放射している。

黒体輻射6500KとD65は照明としては似た結果になるが、スペクトルではD65はガタガタしている。
これは大気による吸収が原因で特定の波長が吸収されるため。

温度と分光放射輝度
 下記は両軸を対数として特定の温度の分光放射輝度をプロットしたグラフ
 273kは摂氏0℃、373Kは摂氏100℃。(もちろん可視光としては見えない)


ウィーンの変位則
 電磁波のピークの波長は λ=2897/T [μm] として求められる
 例えば6000Kの場合は λ = 2897 / 6000 = 0.48 となり、480nmの可視光がピークとなる。
 人体の場合は λ = 2897 / (36+273) = 9.375 となり 9.4μmの赤外線がピークとなる

標準光源などのリファレンス

CIE - INTERNATIONAL COMMISSION ON ILLUMINATION
http://www.cie.co.at/index.php/LEFTMENUE/index.php?i_ca_id=298
A光源、D65光源のテーブルが記載。

http://ww3.isaco.ir/PERSIAN/mohandesi/STANDARD/SAPCO%201/JIS/Z8701.pdf
C光源のテーブルが掲載。もうリンクが切れているみたい。(色彩科学ハンドブックにも同じものがある)

Appendix 5: Relative Spectral Power Distributions of Illuminants - Measuring Colour - Hunt - Wiley Online Library
http://onlinelibrary.wiley.com/doi/10.1002/9781119975595.app5/pdf
A,B,C,D系,F系,黒体輻射のすべてを網羅している。


ColorCheckerの値

上記で得た分光反射率と光源の分光分布を掛け合わせたものをXYZ等色関数のウェイトで足し合わせればXYZ色空間の色が求められる
RGBに変換する場合はXYZからリニアなR'G'B'に変換したあとγ補正を行い最終的なRGBとする

BabelColorを参考に同じ値になるか確かめた

↓リファレンス
http://www.babelcolor.com/main_level/Tutorials.htm
ColorChecker_RGB_and_spectra.xls
このエクセルのタブ「RGB_8_bit」のTabel1 Babelcolor Avg. の値をリファレンスとした

XYZの値

分光反射のデータは[BabelColor Avg]を使い[D65光源]を当て、[CIE 1931 observer]の等色関数を使用。


白いラインが光源を受けた後の分光反射で数値はXYZ値。
塗られている色はXYZ空間のガンマ2.2の補正したもの。

RGBの値

XYZから各色空間用の変換行列でR'G'B'に変換し、仕様のガンマ補正をかける。

上から[sRGB]、 [AdobeRGB]、 [ProPhotRGB]




BabelColorの値。

via:ColorChecker_RGB_and_spectra.xls 一部を切り出したもの
ほとんど一緒の結果となった。(一部の値で1/255の誤差がある)