2015年10月7日水曜日

人の感覚とモニタガンマのメリット

リニアワークフローを説明するうえで、明るさに対する人の感覚のことまで説明するとかえって混乱する場合がありますが間違った認識をしないようにあえて説明しておきます。
さらにモニタのガンマ特性は悪いことだけではなく諧調に対するメリットがあるのでその部分にも触れておきます。

モニタガンマのおさらい

モニタのガンマは下記のような入出力特性があります。



rec.709 HDTVの標準規格 ガンマ値は1.9に近い
sRGBwindowsで採用されてる規格ガンマ値は2.2に酷似 
DCI-P3デジタルシネマの標準規格ガンマ値は2.6

他にもいろいろありますが、これらの規格と同様に暗部が暗くなります。

ブラウン管は当初から電圧と出力結果が線形にはならずに上の図のように非線形でした。
これを修正する回路を用意するとコストが増えるため、送信側で値を補正するようにしたといわれています。
これが現在でも続いています。

0.2の入力を例にすると


rec.709では実際よりも約1/4で出力されています。
sRGBでは実際よりも約1/6で出力されています。
DCI-P3は実際よりも約1/13で出力されています。

間違った値に慣れてしまっている

PCで画像を扱っている人は間違った値になれてしまっています。
例えばフォトショップで絵を描いている人は0.5くらいを中間グレーとしてい描いていると思いますが
画面に出る結果は0.5ではなくて0.21です。
モニタの最大輝度である真っ白を1.0とした場合21%の明るさということです。
0.3として塗っているものは0.07で表示されています。
(モニタによってばらつきがあるのでsRGBモニタで正しくキャリブレーションされている前提とします)

これは特殊なメガネを掛けて作業していると考えてください。全体的に暗くなるのではなく暗部ほど暗く映る最悪なメガネです。
そのため0.21に見えるように自分で補正して0.5にしているということです。
もしガンマ特性がないリニアなモニタがあれば0.5ではなく問題なく0.21付近を使っていたでしょう。

絵をかいたりしている分にはあまり問題になりませんが画像で演算しようとすると破綻してしまいます。見た目で作られたデータには間違った値が入力されているから当たり前ですね。

このせいでいリニアだのガンマだのとわけがわからないことが起きてリニアワークフローをしないと正しく計算できないという面倒なことが起きています。

リニアワークフローとはこの最悪なメガネをはずした状態で作業するイメージです。
ただし鑑賞者は最悪なメガネをかけているのでその人たちに正しく見えるように最後の段階で補正する必要があります。

対数的な人の感覚

0.21が中間なの?と思う方が多いかもしれません。
0.21が中間付近ではありますが厳密には中間グレーではりません。
これは単純に0.5という入力がモニタによって0.21になっただけです。
中にはガンマ2.8という規格の放送もありますのでこの場合は0.14になってしまいます。

一般的には0.18が中間と言われています。
「中間は0.5じゃないの?」と思う人が多いと思います。それではなぜ0.5は中間ではないのでしょうか。

答えから言いますと、「人の感覚はリニアではない」。「人の感覚は対数的」ということです。
人の感覚は「一定の比率で増えていくものを等間隔に感じる」特性が多くあります。

昼間に懐中電灯を使ってもあまり効果がありませんが暗いところほど効果を感じるのはまさにそれです。
明るいところでも暗いところでも懐中電灯に照らされる光の増加量は同じです。

周囲の明るさが5、懐中電灯によって増加する量が50だった場合は照らされたところは周囲より11倍明るいです。
周囲の明るさが10000、懐中電灯によって増加する量が50だった場合は照らされたところは周囲より1.005倍明るいです。0.5%だけの増加です。
これでは明るくなったと感じません。
人は差で感じるのではなく比で感じる良い例ですね。

このような対数的な感覚は「フェヒナーの法則」や「スティーブンスのべき乗則」として知られていますので興味がある方は調べてください

星の明るさと等級

一般的にわかり易いのが星の明るさと等級です。一等星とか2等星とか言われるもので、明るさの変化が一定に感じるように決められたもののようです。
実際の明るさは一定比で増えています。

等級 6 5 4 3 2 1
明るさ 1 2.5 6.25 15.6 39 100

このように等級が上がるたびに明るさは約2.5倍に増えています。(正確には 100^(1/5) = 2.512)

周波数と音階

1オクターブ上がるごとに周波数は2倍になっています。


平均律というものがあり、これは周波数を特定数で分けたもので、楽器の調律などに使われる一種らしいです。
12平均律の場合は1オクターブを12分割します。
周波数の倍率は 2^(1/12) となり、1.0594倍ごとに周波数が増えていくことになります。


その他類似した感覚

  • 音量(ホーンやデシベル)
  • 重さの比較
  • サイズ比較
  • マグニチュード
  • お金の感覚
  • 年齢に対しての時間経過の感じ方(ジャネの法則。例えば20歳の1年は10歳の半年に感じる)

自然界では小さな刺激から大きな刺激までがあり、その刺激幅(ダイナミックレンジ)を広く感じ取れるためにきっと必要だったのでしょう。

気が付いた人もいると思いますがfloatの持ち方と似ていますね。余談ですがopenEXRもfloatですが光を扱うのに適しています。

0.18が中間グレーと言われる理由

カメラの世界では18%反射率のグレーカードがよく使われていて、このカードのことを中間グレーと言ったりもします。
調べたのですが18%が中間グレーという定義の出所がわかりませんでした

色々説があります。
  • 人の肌の反射の平均の平均が18%
  • コダックで計測した自然物の反射率の平均が18%
  • 印画紙の黒が3%で白が96%の反射率。その対数的な中間が18%

上の2つは中間グレーとは言っていないです。
正確な中間グレーというよりはこの反射率で露出を合わせれば失敗しないという意味合いのほうが大きいのかもしれません。

3番目の印画紙の説に関してですが、本当の中間を求めると17%になります。
下記は7分割した時で、そうすると1.78倍ごとに増えます。

1 2 3 4
中心
5 6 7
3 5.3 9.5 17 30 54 96

sRGBでの画像です。
注意:モニタの輝度比と反射率が一致しているとは限らないので厳密にはこの見た目=反射率ではないです。例えばモニタの黒は輝度0ではないです

コントラスト比 3:96 = 1:32
定数 = 32^(1/6) ≒ 1.78  (7分割の場合)。
奇数分割なら中心がとれます。3分割なら 係数= 32^(1/2) ≒ 5.66


但し最近のディスプレイのように黒がしっかり出せる環境で暗室で鑑賞した場合にこの方式で中間グレーと感じる値を算出するともっと小さな値になります。
例えば最低輝度0.1最高輝度96とした場合。最近のTVモニタならこのくらいのコントラスト比はありそうです。

1234
中心
567
0.10.3140.993.19.73196

sRGBでの画像。
普通のモニタでは黒表現が乏しいため左2個の差がわからないと思われます。もしかしたら高コントラストなモニタにではこちらのほうが正しく見えるかもしれません。
コントラスト比 1:960
係数=3.14となります。

ちなみに一般的なPCモニタは暗闇で見た場合は黒1[cd/㎡]白120[cd/㎡]でコントラスト比120くらいはありそうです。なのでプリント写真よりはコントラスト高いと思います。

なので結局は環境にかなり依存するものとなりますが、一般的な反射率の基準で考えると18%と考えて差し支えないように感じました。

モニタガンマによる諧調のメリット

人の感覚は等間隔ではなく暗部ほど分解能があります。
そのため暗部ほど諧調が必要です。

もしモニタがリニア特性だった場合は等間隔の8bitでは都合が悪いです。
暗部なほど諧調が足りずに明部は諧調がありすぎるということになります。

下図はガンマ特性がリニアな場合とsRGBとの比較です。
モニタのガンマ特性のおかげで暗部に諧調が多く含まれる好ましい結果になっています。


偶然なのか狙っていたのかはわかりませんがモニタのガンマ特性のおかげで視覚的に重要な、「暗部に多くの諧調を持たせる」ということができてしまったということです。
なのでモニタガンマは悪いということではなく必要だったのではないでしょうか。

但しモニタガンマにもいろいろあるので、たとえば旧マックのガンマ1.8のモニタのほうが暗部の諧調が少なく2.6のほうが暗部の諧調が多いことになります。(同じ見た目になるものを表示したとき)

まだ最近はコントラスト比(黒と白の輝度差)が高いディスプレイも多いのでそもそも8ビットではマッハバンド(諧調の段差)がばれやすいかもしれません。

諧調保持としてのガンマ補正

先ほどの話ではモニタガンマの規格によって自然とガンマ補正(ガンマエンコーディング)されたデータが作られるということになります。
sRGBなら約ガンマ2.2に対しての補正が行われます。
もし昔のマックの規格ならガンマ1.8に対しての補正が行われるということです。
これは入力データと出力データの見た目を一致させるための補正なので、8ビットのデータを等間隔に感じるように効率よくデータを格納するフォーマットとは厳密には関係ありません。

それでは暗部から明部までのデータを効率よく持つには何が良いのかを考えたいと思います。
個人的には諧調が足りないケースは特に暗部だと感じているのでガンマ2.2でも足りないと思っています。ちょうど良い機会なので調べることにしました。
ガンマ2.5?、それとも3.0くらい?

人が等間隔に感じる明るさを調べるにあたって関連するキーワードがいくつかあったのでメモしておきます。
  • HSV (Human Visual System、人間視覚システム)
  • JND (Just Noticeable Difference、丁度可知差異、弁別閾(difference threshold) )
  • ウェバー・フェヒナーの法則、スティーヴンスのべき法則
  • Color Appearance Model(輝度の順応、背景や観測環境によって見え方が変わり、そこも考慮した見え方のモデル)
  • CIECAM02

等間隔に感じる明るさ

代表的と思われるものを記します。
ただし、CIECAM02等のColor Appearance Modelにもあるように背景色や環境光の違いによっても見え方が変わってしまうので、そこまでを考慮した見え方は難易度が高そうなので検証はしません。

スティーブンスの法則

ウェバー・フェヒナーの法則は大変有名ですが、大体0.1から2000 [cd/m^2] 位のレンジでのみ成り立ち、それ以外のレンジでは信頼できません。以下のスティーブンスの法則 (Stevens' Law)はよりよい近似を与え、されに0.1 [cd/m^2]以下のレンジでも良いモデルとなることが知られています。
Y=k (X-C)^n
n は1/3くらいが良い近似を与えると言われています。
via:奥田正浩 研究室 -ウェバー・フェヒナーの法則-

「明るさ」は、「輝度」に対して単調に増加するが、その関係は、線形ではない。
例えば、分光分布が同じで「輝度」が10倍になれば、それにつれて「明るさ」も確かに大きくなる。しかし、10倍ほども大きくはならず、約2倍程度にしか感じない。
「輝度」と「明るさ」の間には、概ね次式のような関係がある。
「明るさ」 ∝「輝度」1/3
via:NAC CMS対応フィルムライティングプロファイル
上の文献にあるように感じる明るさは1/3乗としたとき、10倍ごとに増えた時はこのようになります。
物理的な明るさ0.010.1110
感じる明るさ0.220.4612.15
10倍ごとに増えていくと感じる明るさは約2.15倍となります。


L*a*b*の明るさL

L*a*b*色空間は均等色空間の一つで、CIE_Labとも呼ばれています。
均等色空間上の座標の距離の差が人の感覚の差に近く設計されたものです。
L*a*b*は色の差を数値化する色差としても使われています。
L*は明るさを表していて、CIE Lightnessとも呼ばれるようです

Lab色空間は人間の視覚を近似するよう設計されている。知覚的均等性を重視しており、L成分値は人間の明度の知覚と極めて近い。したがって、カラーバランス調整を正確に行うために出力曲線を a および b の成分で表現したり、コントラストの調整のためにL成分を使ったりといった利用が可能である。
via:Lab色空間 - Wikipedia

L*a*b*の変換式の中1/3乗が出てきています。
単純な1/3乗ではなく、1/3乗した後にカーブ全体1.16倍した後に0.16引いています。
そのため暗部がマイナスに行かないように暗部を直線で表しカーブの部分と滑らかにつなげています。
ここの線形部分は数学的な便宜として使われているようなのでこの部分の視覚性均等が保たれているのかはわかりません。



gamma2.6という説

DCI-P3規格について説明されている部分にガンマ2.6が視覚的に諧調がちょうどよいと記述されているものがありました。

Why Gamma 2.6?
・The Human Visual System is more sensitive to absolute luminance changes in dark images than bright images.
・Requires finer luminance steps in dark than in bright
・Power law function with exponent of 2.6 is a good fit to human visual system

via:DCI Requirements Image -Dynamics



一番上にあるモニタガンマのグラフを見ればわかると思いますが、sRGBガンマとガンマ2.6では。0.2の入力に関してはγ2.6のほうが2倍の諧調があることがわかります。(出力値がsRGBの約半分なので)

3つのカーブを比較

ガンマ2.6のカーブはL*a*b*のLに近いいです。
右側のグラフは比較しやすいようにガンマ3.0空間で見た時の物です。



他のカーブ

ガンマ2.4
ガンマ2.4がL*に近似しているので良いという説もありました。
VDP
S.Daly発案のVisible Differences Predictorというものがあり、2つの画像の誤差を推定するものらしいです。
ここで使われている応答カーブは下記のものです。

DN(x) = x/(x+12.6x^0.63)

参照ページ
  • 奥田正浩 研究室 -VDP-
  • High Dynamic Range Imaging and Low Dynamic Range Expansion for Generating HDR Contentというpdfの23ページにも同じ式がありました 

等間隔に感じるグラデーションを画像で比較

L*、γ2.6、γ3.0を比較してみます。
他にも参考としてコダックグレースケールやsRGBガンマ、線形グラデーションも載せておきます。
sRGBに合わせた値で出力しています。
特に暗部は周りの環境やモニタのコントラストによって見え方がかなり変わります。
この中では個人的にはL*が全域にわたって等間隔に感じました。
両端の値0と1.0は反射率で考えた場合あり得ないので除外してもよかったですが一応載せておきました。

L*をリファレンスとして比較してみました。
  • kodak gray sclae : 濃度が0.05から1.95まで0.05ステップで作られたグレーカードで反射率は約90%から1%までです。(カードなので反射率0と100はありません。)。全体的に暗部に行くほど差がわかりずらい傾向に感じます
  • L* : L*の値を0から100まで5ステップで表示したものです。
  • sRGBγ : L*と比べて中間部分のコントラストが少し足りなく感じますが4個目までの暗部はL*に近い感じです。
  • γ2.2 : sRGBとほとんど同じですが4~8個目までの中間諧調への部分がL*に近づきました。但し最暗部がsRGBより視認しづらいです。
  • γ2.6 : 中間から明るい部分まではL*に似ていますが、最暗部が暗すぎて認識しづらいです。
  • γ3.0 : 全体的にガンマがきつすぎて暗く感じます。暗部以外はkidak gray scaleと似ています。
  • リニア : 反射率を5%ごとに増やしたものですが等間隔に感じません。暗部ほど差が極端にに感じます。人の感覚がリニアに感じられない良い例です。
数値を記したものも用意しました。

諧調のテスト

CIE_LabのL*のグラデーションでテストしてみます。
L*のグラデーションをガンマ補正等でエンコードして保存し、ロード後にデコードし、sRGB出力のためにsRGBガンマ補正をしたもので諧調の比較をしました。

これは8bitのテクスチャをレンダリングしたときを想定してどのようなエンコードが適切なのかを調べるためにテストしました。

テストしたエンコードの種類は、リニア、sRGB、γ2.6、γ3.0、γ5.0です。
結果としては、リニアエンコードは暗部の諧調が著しく損なわれていています。
また、比較用にあえてγ補正をきつくしたγ5.0のエンコードは諧調が暗部により過ぎたため、露出補正で暗くしたときに中間の諧調が他と比べて低いことがわかりました。
sRGB、γ2.6、γ3.0に関してはどれを使ってもそれほど違いがないように感じます。

L*のグラデーション表示

リニアエンコード以外は特に問題がないように感じます。

L*のグラデーションを反射率約1%から6%の範囲としたものを露光調整で4段上げたもの

黒い8bitテクスチャがカメラ露出を上げてレンダリングされた時の諧調劣化を想定しました。(実際にいはバイリニア補完がかかると思うのでマッハバンドは軽減されると思います)
sRGBでも問題なさそうですがγ2.6と比べると最暗部の諧調が少したりないかもしれません。

L*のグラデーションを3段分暗くしたもの

デコード後に3段下げて(リニアスペースで1/8したもの)sRGBガンマ補正したものです。
γ5.0では中間の諧調が他と比べてなんとなく足りない感じがします。
その他はあまり問題ないように感じます。

8bitテクスチャでレンジを最大限使う

テクスチャで0~1まで使われている例は少なく例えばガンマ補正済みテクスチャでは黒の表現でもsRGBエンコードでは0.2~0.25くらいです。(黒は反射率3%~5%位なので)

また、コンクリート単体のテクスチャだったりするとレンジも少ないです。
例えば中間的な明るさのテクスチャで濃淡も少ない場合はレンジが0.4~0.7位かもしれません。
それを0から1.0にマッピングして持っておけば諧調は増えるはずです。
ただし元画像は高諧調のテクスチャである必要があります。

マッハバンドが起きやすそうな画像でテストしてみました。
sRGBで0.2(8bit値50)程度の黒のテクスチャに少し斑を付けています。



これをレンダリング側で露光量を上げたりコントラストをきつくしたりするとマッハバンドが見えたりします。

下記は上のテクスチャを8bitで保存したものとレンジを有効に使って8bitに保存したものに対して、露光を上げ、コントラストを強めてマッハバンドが確認できるようにしたものです。
右側はレンジを有効に使っているのでマッハバンドは出ていません。
sRGBの0~1のデータをsRGBの0.15~0.33にしたものなので諧調が多く含まれていることがわかります。



下のグラフは0~1を0.2~0.6にした例ですが暗めのテクスチャは大抵この範囲内に納まりそうです。

16bitのテクスチャを使っている場合は全く関係ないですが、8ビットのテクスチャを使わなければいけない時のレンダリングで役に立つと思います。
ただしテクスチャのデコードの時に範囲a,bの情報を渡す必要があります。

0 件のコメント:

コメントを投稿