2017年12月18日月曜日

HDRモニタとSDRモニタの見え方

ダイナミックレンジ

ダイナミックレンジとはそのモニタが出せる最大輝度(白を表示)と最低輝度(黒を表示)の比率のこと。
ダイナミックレンジのイメージ

SDRモニタとはスタンダードダイナミックレンジの略でHDRモニタではない今までのモニタのことを言う。
同時に出すことのできるダイナミックレンジが重要。
バックライトで全体的に明るくしたり暗くして最大輝度や最低輝度としているものは同時に出せるダイナミックレンジとは違うので注意。

例えば最大輝度が100[cd/㎡]、最低輝度が1[cd/㎡]ならダイナミックレンジは100:1となる。
この時最大輝度を200[cd/㎡]まで上げられれば200:1となる
一方最大輝度を0.5[cd/㎡]まで下げることができれば同じ200:1となる。
見る環境が適切なら両者の印象はほぼ変わらない

前者は電力が増えるのがデメリットだが明るい環境でもよく見える。
後者は電力は増えないが暗い環境で見ないと効果を得られない。

室内の電気を消すとpcモニタの暗部の諧調が良く見えるようになるのはモニタ本来の黒が見えるようになるから。
あるPCモニタを室内の照明を消して計測した白と黒の輝度は100[cd/㎡],0.25[cd/㎡]。  400:1
照明をつけたところ白と黒の輝度は3[cd/㎡]上がり103[cd/㎡],3.25[cd/㎡]。   32:1まで減る

HDRとSDRの違いをグラフで比較


個人的にはHDRモニタはダイナミックレンジが広がったことは良いのだが、それよりも「実際のSDRモニタ」よりも素直な出力になっているところが良いと思っている。(最近のSDRもダイナミックレンジは高い)

ここの例で示した「実際のSDR」は「理想的なSDR」よりも明るいが、暗部を明るくしていないことが問題である。
このようにSDRのTVモニタではコントラストが強い傾向がある。
PCモニタではあまりこのようなことは起きないがTVモニタではよくあること。
ニュートラル等の設定であれば「理想的なSDR」に近いが、ダイナミック等の設定ではコントラストが強く表示される
SDRモニタは年々ダイナミックレンジが上がりコントラストは機種ごとに違う。

SDRの規格では1.0までの値を相対的に扱うことしかできないいため1.0上の明るさを定義して制御するような規格がなかったことが問題だった。
なのでHDRが規格化される必要があったのだと思う。

ダイナミックレンジが10倍のSDRモニタがあったとする

もとデータは100:1だとする

↓高輝度を使わなければ問題ない

 → 

↓全体的に明るくても問題ない

 → 
これでも同じ100:1

↓実際にはダイナミックレンジが引き延ばされコントラストが強く表示される

 → 
PCで作業して画像をTVモニタに出すとこのような傾向になるのはこのため。

HDRとSDRの違いを画像で比較

ここではHDRを表現するため全ての画像の輝度を下げて説明する。
SDRの最大輝度を100[cd/㎡]とし、HDRの最大輝度を1000[cd/㎡]とする。
そのため以下の画像は全て1/10の明るさで表示する(カメラ露出1/10に固定してTV画面を撮影したようなイメージ)

HDR理想のSDR実際のSDR実際のSDRで正しく見える補正
1以上の値を表示できる。
2017年現在では高輝度なHDRモニタはSDRモニタの10倍くらいの明るさを表示できる(1000[cd/㎡])

HDRモニタは諧調も豊富で色空間も広い。
この画像では明るさの違いを見たいので色は変えていない
今までの通常のモニタのこと。
PCモニタはこれに近い。
PCモニタの場合は最大輝度を80~200[cd/m2]の間に設定されていることが多い
(sRGBの規格では白は80 [cd/m2]となっている)

この画像はHDRと比較するため0.1が最大値(sRGBγ補正後の8bit値89)

実際のTVモニタは輝度はHDRには及ばないがとても明るい(この場合HDRの半分の明るさまで表示された)
この例では1.0の入力が5.0と5倍になっているが。
暗部ほど倍率が下がっているため暗部は明るくされていない。(更に暗くされることもある)
よってコントラストが強調される。

TVの画質の調整項目の「ダイナミック」のような設定だと特にこの特性に近くなる
ここではHDRと比較するため0.5が最大値(sRGBγ補正後の8bit値188)
ここでのSDRモニタは明るさ5倍なのでソースのHDRの明るさを1/5にした。そしてモニタ特性の逆カーブを与えてデータを補正しすることで正しく表示することができた。
モニタごとに特性が違うのでこれを全てのモニタで正しくすることは難しいが、平均的にみて明るさを約1/2~1/3にするのが良いみたい。コントラストの逆補正カーブの調整はコンテンツの再生前に簡易的な調整項目からある程度は合わせられるかもしれない

HDR対応のPCとHDRモニタを使用して、HDRとSDRの見た目を切り替えて比較するとHDRの高輝度部分がとてもよく見えることに感動するのだが、これは理想のSDRと比べているからで、
実際のSDRのTVモニタでは上の例のようにブーストされ明るくなり、HDRとの違いをそれほど感じないことが多い。さらにコントラストの強いギトギトした画像になりやすく、良い言い方をすると、「派手な見た目」とか「コントラストが高くてよい」と表現される。
場合によってはHDRよりSDRのほうが綺麗といった誤解を生むことも多い。

このようなSDRモニタが蔓延していたので映像制作者の意図したコントラストを表示することは難しかったが、今後HDR規格が普及してくればこの辺りも改善されると思う。

別の比較画像

HDRのイメージ


「SDR(理想的)」のイメージ


「実際のSDR」のイメージ(ダイナミック系)


今回テストしたHDR画像
hdr_sample_sRGB.exr

今回SDRの明るさをHDRの見た目に合わせる実験をしたTVは「KJ-65Z9D」。
簡易的な計測だがイメージとしてこんな感じ。(HDRの輝度を1.0とした時の比較)

実際の見た目を考慮したもの

「SDRグラフィック」: 画質設定は「グラフィック」にしたもので理想的なSDRに近い
「SDRダイナミック」: 画質設定は「ゲーム」にしたもので輝度もかなり高くガンマ値1.35くらいの強いコントラストとなった。

2017年現在のHDRモニタのは最大輝度1000[cd/㎡]程度でSDRのTVモニタは輝度が300[cd/㎡]くらいあり、高いものだと500[cd/㎡]出ているものもある。このモニタは700[cd/㎡]も出ていた
なのでSDRの明るさとHDRの明るさの見た目を近づける場合はこのことから、
SDRをHDRの明るさに近づける場合は出力を1/2~1/3くらいに暗くするのがよい。
HDRをSDRの明るさに近づける場合は2~3倍明るくするのが良い。

HDR方式のOETF,EOTF

OETF,EOTFとはOpto-Electronic Transfer Function、Electro-Optical Transfer Functionの略。

OETFは光を電気信号に変えるためのカーブのこと。
EOTFはモニタが表示するとき上の電気信号を光に変えるときのカーブのこと。
これは今までのSDRモニタで言うところの「データ側のγ補正」と「モニタのガンマ特性」に相当する。

HLG : Hybrid Log Gammaの略、今までのSDR同様の相対輝度(割合)で表す
PQ : Perceptual Quantizerの略、絶対輝度[cd/㎡]で表す


HDRは急カーブに感じるが、それは入力の範囲が大きいから。
入力に実際の数値を割り当てたものが下のグラフ
このグラフはOETF(線形の明るさが0~1までのデータとして格納される)

入力を合わせると
sRGBの1.0を100[cd/㎡]とした時、HLGの最大輝度は12倍、PQは100倍として合わせたもの
グラフをみるとHDRのOETFでは0~1までで諧調の約半分を使っていることがわかる。
1.0~最大輝度までを残りの半分で表している。

PQのOETFは暗部の諧調が多いことがわかる


明るさに割り当てられている諧調数はこんな感じ。
わかり易いように全て8bitの256個の諧調の分布とした。

縦軸は含まれる諧調の数、横軸はsRGBの1.0を100[cd/㎡]とした輝度。
sRGBは暗部の諧調が少ないがPQのOETFは暗部の階調が多いことがわかる。
2017年12月5日火曜日

HDR画像の作成

HDRモニタはSDRモニタと比べて輝度比と色域が大きくなったため現実の輝度比や色の再現が可能になってきている。
そのためにも写真の輝度や色を実物に近づけて現像したい

ブラケット撮影。RawTherapeeで現像。スクリプトでHDRに統合しexrで書き出した。

rawデータは本当に線形なのかを確認してみる

例えば半分の明るさで撮影したらRGB値も半分ということなので、半分の明るさで撮影したものは2倍の明るさにすれば同じRGBになるはず
このように線形に値が保たれることにより、露光違いのrawデータから簡単にHDRに復元することが可能になる。

カラーチェッカーの撮影と現像を行う際に、あえて暗く撮影したものでも同じようになるかを試した
以下の現像はRawTherapeeを使用した

適正露出の他にあえて暗く撮影したものでテスト

現像設定 : プロファイル無し、ホワイトバランスのみ固定調整、出力プロファイルsRGB
彩度が低いのはカメラ色空間のため。

適正な露光量で撮影(1倍) 3EV暗く撮影(1/8倍) 5EV暗く撮影(1/32倍)

暗く撮影した分を現像時に明るくすると同じ色になるのか

カラーチェッカーが正しい輝度になるように現像側で微調整するが、暗く撮影したものは更に露光量の逆補正をして、ほぼ同じ見え方になることを確認した。

中段は一部を切り抜いた等倍サイズなので、明るくした分ノイズが多くなっていることが確認できる。
下段はカラーパッチの色を一色(平均化)にしたもの。
ただし、これ以上暗く撮影していくとノイズが多くなりすぎてしまうこととそれによって色まで変わってきてしまう。
なので暗く撮影されている部分はHDR合成の時に評価してはいけない。

0.25EV明るく現像(1.19倍) 3.25EV明るく現像(9.51倍) 5.25EV明るく現像(38.1倍)


以下は「RAW_to_sRGB」のカラーマトリクスを掛けてsRGB色空間へ変換したもので、同じように線形性が高いことが確認できる



ノイズ

rawデータは12~14bitあるのでダイナミックレンジは広いがノイズが無視できないためHDR合成で評価するレンジはそこまで広くしないほうがよい。

カメラの用語では「ダイナミックレンジ」や「SNR(s/n比)」等といわれる項目に関係している。
「ノイズが少ない」=「ダイナミックレンジが広い」 = 「s/n比が高い」だと思う。
ノイズが少ないカメラほどHDR合成に余裕があり、ブラケット撮影の露光差を大きくして、枚数を減らすことができる。

HDR現像の結果


100[nit]くらいの明るさが1.0になるようにすべてを現像しダイナミックレンジを実感しやすいように並べた。
太陽を除いても明るいところ10,0000[nit]~暗いところ1[nit]までコントラスト比が10万。

等倍の明るさで表示 約7EVの露光量に相当
100[nt]くらいの明るさが丁度よく見える(オフィスの照明内やPCモニタの白くらいの明るさ)。
照度300[lux]位のEV値
 
各写真の平均輝度と最大輝度[nit](オリジナル解像度で計測)
平均           140    
最大      11,700    
平均         1,480    
最大       69,700    
平均      1,500      
最大  150,000      
平均      4,270      
最大  190,000      
平均        1,990    
最大    305,000    
平均            150    
最大     158,000    
平均      1,610      
最大  158,000      
平均      6,350      
最大1060,000      
平均      49,500    
最大 8,140,000    
平均            816    
最大         4,860    
平均         122      
最大      5,740      
平均         384      
最大    20,000      
平均             56.3 
最大      19,500    
平均              10.8 
最大       80,900    
平均             0.64 
最大    51,700      
平均             1.4   
最大      4,460      

1/10の明るさで表示  約10EVの露光量に相当
1000[nit]くらいの明るさが丁度よく見える。明るい看板や夕暮れに近い時間の空等。
照度3,000[lux]位のEV値
 

さらに1/10の明るさで表示(1/100)  約13.5EVの露光量に相当
10.000[nit]くらいの明るさが丁度よく見える。晴天の青空くらいの明るさが見える。
照度30,000[lux]位のEV値

さらに1/10の明るさで表示(1/1000)  約17EVの露光量に相当
100,000[nit]が収まる明るさ。夜の屋外の街頭でこのくらい明るいものもある
照度300,000[lux]位のEV値


さらに1/10の明るさで表示(1/10,000) 約20EVの露光量に相当


さらに1/10の明るさで表示(1/100,000) 約23.5EVの露光量に相当
太陽はここまでしか撮影できなかった(絞り値f/36 露出時間1/4000s -22EV)
これ以上撮影する場合はNDフィルタが必要。
実際の太陽の輝度は1,865,000,000[nit]と言われていてEVにするとたぶん-31EVは必要。


10倍の明るさで表示  約3.5EVの露光量に相当
照度30[lux]位のEV値


さらに10倍の明るさで表示(100倍)  約0.3EVの露光量に相当
1[nit]の明るさが見えるような露光量。
照度3[lux]位のEV値
ちなみに月明りだけの屋外は0.2ルクス程度なのでこれに照らされた白い紙の輝度は約0.06[nit]となりもっと暗い画像となる



ホワイトバランス

現像時のホワイトバランスは6500ケルビンくらいで固定した。
6500kのライトが白くなるようなホワイトバランスで現像するということであり、現像ソフト側の数値が必ずしも6500kといいうことではない。
こうすることでハロゲンランプは2800ケルビンくらいの暖色の色として現像され、晴天の日陰の中では1万ケルビン以上の青い色で現像される

輝度

個人的には100[nit]を1.0とすることが好み。
pcモニタの白がちょうど100[nit]くらいだし、それを1.0とするとイメージしやすいから。

100[nit]は白い紙の反射の明るさと考えると314ルクスくらい当たっていることになり
1ルクスから10万ルクスまで表現するとしたら比率としては中間くらいの位置になる(314*314 ≒ 10万)

カメラのEVと輝度の関係は0EV=約2.5ルクスが基準とされているので、
0EVでちょうど白で現像されるものは約0.8[nit]ということ。
5EVでちょうど白なら32倍の約25[nit]ということになる。
ただし今回α6300では100[nit]にキャリブレーションされたモニタの白を現像したら理論値より0.6段くらい暗く現像されたのでその補正を入れている

厳密には撮影倍率によって輝度が変わってしまうけど普通に撮影する場合はあまり気にしなくてもいいと思う。

HDR現像

python版openCVで作成した。
露出違いのRaw色空間でHDR現像して、その後に色変換マトリクスを掛けてsRGB等の目的の色空間に変換する。
前回カメラRawからXYZに変換するマトリクスを作成したがそれを利用した。
マトリクスがわからなければDxOMarkに掲載されているのでもいいかもしれない

色域外をクランプすると見た目が良くないことがある。
色域外になるとrgbどこかが0になっている状態になることがあり、明るくしても白に近づくことができないため不自然に感じる。
なのでギリギリのところでクランプを回避しているがこの辺りは適当にやっている。

HDR現像スクリプト

後で記載