rawpyでPython現像その8(exp_shift)

python

 rawpyの現像関数、postprocessの引数であるexp_shiftに関して、値の意味を確認していきます。

 postprocess関数に関しての詳細はこちら

exp_shift

 線形な露出(exposure)のシフト。使用可能レンジは1.00を基準に、0.25(2段暗くなる)から8.0(3段明るくなる)。(0.25, 0.5, 1, 2, 4, 8でステップを刻むと思われる) とのこと。露出補正ですね。

段(step)とは

 露出の段(step)とは、1段明るくすると、倍の光をセンサで受ける。1段下げると半分の光になる。だと思っています。なのでシャッタースピードであれば、1段上げるには倍の時間、1段下げるには半分の時間の露出時間になるし、絞りであれば、1段上げるには倍の面積(絞りにして1/1.414倍)1段下げるには半分の面積(1.414倍)してあげることになります。

 こんなイメージです。シャッター速度か絞りのどちらかを動かしたらね。という意味で、どっちも動かしちゃうと2段変化してしまいます。

 ちなみに自分はいつも撮影時には1/3か2/3ステップ暗い設定で撮影してから現像してます。白飛びが怖いので。

 この動きを模すので、計算としてはガンマ前の光量(画素値)を2倍とか1/2倍とかしているだけです。ココで指定した値をダイレクトに掛け算していると思われます。

計算

 であれば単純にbrightオプションを使って、2倍とか0.5倍とか指定してあげればよさそうですが、 どうもそれとは出力が微妙に違いました。 あらかた同じ画像が出てきて、一見すると何も違いはないです。ほんと微妙に数画素不一致です。

    raw = rawpy.imread(filename)
    gam = [1.00,0.00]
    img1 = raw.postprocess(half_size=False,
                           demosaic_algorithm=rawpy.DemosaicAlgorithm.LINEAR,
                           no_auto_bright=True,
                           exp_shift=2.00,
                           exp_preserve_highlights=0,
                           output_color=rawpy.ColorSpace.raw,
                           gamma=gam)

    img2 = raw.postprocess(half_size=False,
                           demosaic_algorithm=rawpy.DemosaicAlgorithm.LINEAR,
                           no_auto_bright=True,
                           bright=2.00,
                           output_color=rawpy.ColorSpace.raw,
                           gamma=gam)
    

 このコードでは、img1にはexposure shiftで2倍の明るさにした画像を、img2にはbrightで2倍の明るさにした画像をそれぞれ現像しています。 純粋に2つの処理の違いを見たかったので、ほかのオプションは色変換や明るさの補正、ガンマをOFFにしています。

 このようにして得た2つの画像の不一致画素をよくよく見ると、どうやら明るい画素(R, G, Bのどれかが255に張り付いている画素)ないしそのそばの画素で不一致が見られます。デモザイキングの処理が怪しいです。

デモザイキング

 通常カメラのセンサはRGBの画素が以下のように並んだいわゆるベイヤー構造をしています。なので、同一座標で、全画素RGBすべての要素がそろっているわけではなく、欠落画素を補間して作り出しています

 その補間処理の事を通常デモザイキングと呼び、各種アルゴリズムがあるようです。ココでは一番シンプルと思われる線形補間を例に示しています。上図のように、欠落画素を回り4画素から線形補間して求めています。おそらく、

demosaic_algorithm=rawpy.DemosaicAlgorithm.LINEAR

 オプションはこの演算をしていると思い込んでいます。

 このデモザイキングを行う前後で1段明るくする演算、つまり画素値を2倍をしたときに答えが異なることがあります。例えば、

 このように、デモザイクする前に画素値を2倍にすると、上図のように元の画素が200を示している場合に、400になれず最大値でクリップされます。その後デモザイクが行われると、中央の画素は244となります。に対して、

 このようにデモザイクした後に2倍すると、上図のように、元の200だけでなく、デモザイクされた中央の140画素も倍されることで、最大値にクリップされます。このようにデモザイク前後で同じ画素値2倍の処理でも結果が異なります。

 これが今回の一見同じ2倍への画素値変換に対しても起こっていると予想されます。

 露出補正を名乗るからには、デモザイクする前の信号に対してゲイン調整を行うというのがこの処理の実体のようです。

 なので、この処理の後で行われる自動明るさ補正(auto_bright)には注意が必要です。

  通常の明るさ補正(bright)は自動明るさ補正の後に行われるので、見た目の変化 (1より大きくすれば明るく、小さくすれば暗く変化) がわかりやすいですが、 この露出補正では、微妙に調整しても、この後行われる自動明るさ補正の影響で画像にまったく変化が出ないことがあります。(露出補正が台無しになります。)

 同じ掛け算なので、ホワイトバランス調整の前後のどちらかはわかりません。確かに元の信号にゲインをかけた方が正しい画素変化をしそうですが、正直使いどころがわからないといえばわからないオプションでした。

まとめ

 exp_shiftオプションは、デモザイキングする前の原信号に対して、ゲイン調整をすることで、明るさ(露出)の調整をする機能。初期の段階で行われる処理なので、その後に行われる処理との兼ね合いに注意。といった感じですかね。

 この露出調整の処理オプションにはゲイン以外にもパラメータ exp_preserve_highlights というものがあります。この使い方も解き明かしていこうと思います。

python現像
スポンサーリンク
キャンプ工学

コメント

タイトルとURLをコピーしました