rawpyの現像関数、postprocessの引数であるexp_shiftの、さらにそのオプション、exp_preserve_highlightsに関して、値の意味を確認していきます。
postprocess関数に関しての詳細はこちら。またexp_shiftに関して詳細はこちら。このexp_shiftに関して、まだ目を通されていなければ先に見ていただいた方がよいです。
exp_shiftを明るい方にずらさないと効果を発揮しないパラメータです。
exp_preserve_highlights
いわゆる露出補正を行うexp_shiftオプションに対するさらにオプションとなるのがこの現像パラメータ。exp_shiftによる露光シフトを行った際に、ハイライトを保存する量を指定する。0.0から1.0(全保存)まで指定。とリファレンスにはあります。
これが何を行っているかというと、説明文からも予想できるように、どうやらハイライトに対してトーン調整を行い、白つぶれを抑制してくれているようです。
具体的にどのようなカーブを描くか確認していきます。まず、exp_shiftを2.0(1段プラス側に露光補正)にし、ハイライト保存無しに相当すする0.0を指定した場合の入出力に相当するグラフが以下のようになっています。
ここでも、以下のように、ガンマ補正や、色変換、自動明るさ補正等のオプションはOFFにしています。
gam = [1.00,0.00]
img1 = raw.postprocess(demosaic_algorithm=rawpy.DemosaicAlgorithm.LINEAR,
no_auto_bright=True,
exp_shift=2.00,
exp_preserve_highlights=0,
output_color=rawpy.ColorSpace.raw,
gamma=gam)
このグラフは、横軸にexp_shiftを行わなかった画素値、縦軸にexp_shiftを2.0で実施したときの画素値をプロット(散布図)したものです。この方法で入出力の特性を確認していきます。
何のことはない、y=2xのグラフになっています。形がFのようになっているのは、先のexp_shiftのところでも確認したように、デモザイクの前に露光補正を行っているため、デモザイク前露光補正による値のクリップに起因している模様です。
以下の図はその様子を示したもので、左が入力のベイヤー、次に露出補正+1、最後にデモザイキング(線形)の様子を示しています。この図のように、原信号がエッジに隣接した、128, 128, 0, 0に類似の4画素が、2倍にされクリッピングされ、255, 255, 0, 0と変換、そこからの補間で生成される中心の画素は128を超えられない。それゆえにこのF現象が起こっていると思われます。
この図で示すところの、最初の128がこれ以上いくら大きくても、2倍にした後に255にクリップされるので、デモザイク後の補間画素が128を超えられないです。今回は気にしないことにします。
今度これをexp_preserve_highlights = 0.5として現像してみました。すると、
出力が128を超えたあたりから直線的な変化ではなくなってきました。この0.5という数字をどのように変換したのかはわかりません。続けて全保存を意味する1.0にしてみると、
こんなカーブになりました。やはり出力が128くらいまでは直線(y=2x)で、以降曲線になってます。こんな感じのトーンカーブをかけることになりそうです。やはり1.0という数字をどのように料理したかはイマイチわかりませんが、気持ちはわかる感じです。
階調がダークからハイライトまで、まんべんなくある場合にはいい感じにハイライトの白飛びを抑えてくれそうです。被写体の背景の空。とかそんな写真にはいい感じで使えそうな気がします。
0, 0.5, 0.75, 1.00を重ねたものがこれ、
出力がちょうど中間の128まではそろって線形で、以降何ぞカーブがかかっている様子がわかります。3倍のゲインをかけ、完全保存を意味する1.0のカーブが、以下。
やはり出力128まで線形。というルールは保たれているようです。ガンマ補正のカーブみたいですね。
まとめ
exp_shift(露光調整)をプラス側に行った際に発生する白つぶれを抑制するようなトーンカーブをデモザイク前の画素に対して実施してくれるオプション。ということがわかりました。
他の明るさ補正系が完全な掛け算によるゲイン調整であることを考えると、このハイライト部に凝った補正は少し貴重かもしれません。この処理でダーク部だけ持ち上げることが可能になる。とも取れます。
コメント