rawpyでPython現像その3(black level)

python

 postprocess関数の引数をひとつづつ動かしながら確認していきます。今回はブラックレベル(Black Level / user_black)をいじってみます。

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

Black Level

 黒に相当する信号値のことをBlackLevelと呼びます。通常現像後の画像であれば黒は0ないし0付近の値になっていますが、センサに光が入らずとも値を持ってしまうようで、黒の値がオフセットしているようです

user_black (int)

 postprocess関数の引数で、この黒に相当する値を指定することができます。それがuser_blackの値になります。センサの信号値が整数列なので、int指定のようです。

img = raw.postprocess(user_black=val)[:,:,[2,1,0]]

 こんな感じで指定します。[:,:,[2,1,0]]の部分はRGB to BGRしてるだけです。

 ただ、センサないしRawデータが何bit精度かもわからず、どんな値が黒に相当するのか正直何か手掛かりがないとどのように調整してよいか、分からないです。

Black Levelの取得 (black_level_per_channel)

 データのBlack Level値は、このblack_level_per_channelに記録されています。正直カメラでこの値が分かってるなら、データからオフセットさせて記録させればいいのに、と思わないでもないですが、調整量を残しています。理由は下の実験でわかります。

 この関数で取得すると、4チャネル分取得されます。それぞれの値がどのチャネル(RGB)に相当するのかよく定義はわかりませんでした。素直に考えれば、R,G,B,に加えて予備なのかな?と想像されます。もしくは2つのGチャネルに異なる値が設定できるのかも。

print(raw.black_level_per_channel)
 [1024, 1025, 1024, 1024]

みたいに表示されます。

 ただし結局user_blackで指定できるのがスカラーなので、4ch取れても意味がないです。どの値を入れたらよいものか迷います。実際に取得してみると、Canon EOS 5D MkIIのRAWデータでは上記のような値で、値が異なりました。しかも撮影タイミングで値も微妙に違いました。

 このプロパティに直接値書けるのかなぁ…と思って試したらやはり、

attribute ‘black_level_per_channel’ of ‘rawpy._rawpy.RawPy’ objects is not writable

 と怒られました。やはり1ch分しか指定できなそうです。

 本家のlibrawのドキュメントには

int user_cblack[4];

dcraw keys: none

Per-channel corrections to user_black.

 と4ch分指定できるインターフェースが用意されてそうなので、rawpyでは、隠蔽してしまったようです。なんでだろう?

実験

 値を入れてみます。この値の動きでヒストグラムがどのように変わるか確認しながら、値の意味合いを見てみようと思います。なお見やすくするため、ガンマは1.00を指定したうえで確認しています。またauto bright(自動輝度補正)は切っておくと演算が分かりやすいです。

 わかりやすいかなと思ってアニメーションにしました。これはデフォルト値からじょじょに値を小さくしていった場合です。あえて暗いところを撮影した被写体です。右方向に形を変えずに、ヒストグラムがシフトしていく様子がわかります。

 下のヒストグラムが、上のアニメーションのスタート。デフォルトのブラックレベルでのヒストグラムです。暗部のつぶれがじょじょに顔を出していく様子がわかります。

 ちなみに、RGBでシフトするスピードが違うのは、ホワイトバランスの値から、Greenに対してRが2.3倍、Blueが1.4倍ゲインがかかっているので、その分早くシフトしていると思われます。つまりブラックレベルのオフセット後の画像にホワイトバランスの処理をかけてますね。

 やはり、演算としては単純な引き算のようですね。この値で、全体から黒レベルのオフセットしている。ということになりそうです。ホワイトバランスも切った方が見やすいのかもしれませんが、あまりにRGBのバランスが悪すぎるので今回の表示では残しています。

 ここから分かるのは、データに記録されているBlack Levelより下に階調が隠れている場合があるようです。

 このデータも、付加されたBlack Levelの値より小さい値を入れ、オフセットさせると何か出てきています。まだ暗部に余裕がありそうです。Black Levelより小さい値の画素が存在し、暗部に階調があるようです。

 このように暗部の潰れを救出してあげることがBlack Level補正のお仕事のようです。

 以上user_blackの調査でした。

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

コメント

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