rawpyの現像関数postprocessに関して、一通り引数の意味合いを確認したので、いったんまとめておきます。
処理順とその処理の大雑把な内容(予想)を、デモザイク処理を境にして、まとめてみます。APIのドキュメントをまとめたものはこちら。併せてみていただけると使い方がわかりやすいかと思います。
処理順(デモザイク前)
おそらくの処理順です。推測です。また個人的にこれは使い方がよくわからんと思うものは省いています。ここまでするくらいならlibrawのソース見ればいいのかも…。
まずはデモザイク前
こんな感じを予想しました。左が計算(処理)の内容予測、右側がそこに影響するパラメータを書いています。くどいですが予想です。
Black Level 補正
まずはBlack Level補正。黒レベル(暗電流)を差っ引いています。これはこの先の計算を考えると妥当なところだと思います。カメラ(データ)に入っているパラメータだけでなく、好きな数字をRGB共通ですが、設定できるようです。
16bit化
その後、カメラないしデータ毎に異なるビット数を16bitに揃えます。たぶん内部演算は16bitだと思われます。これをキャンセル (調整) するパラメータ( no_auto_scale )が存在しています。
White balance
続いて、ホワイトバランス調整。これはRGB独立にゲイン調整するもので、データに入っているもの、内部計算するもの、ユーザー指定のもの、といろいろなオプションが用意されています。
露出補正
続いて露出補正。これも何のことはないRGBすべてに対し同じゲインをかけるものだと思われます。この露出補正には少し凝った、ハイライト部の階調つぶれを抑制するパラメータ(exp_preserve_highlights)が用意されています。
収差補正
ここまでで、ゲインが整っているので、続いてレンズ収差の補正を行います。これはGを基準にRとBの倍率を補正することで実現しています。この倍率をパラメータとして指定するようです。
ノイズ除去
続いて、ノイズ除去。2種類のノイズ除去が用意されており、主に偽色ノイズを除去するfbdd noise reductionと、輝度も含めたいわゆるノイズを除去するウェーブレットノイズ除去が行われます。どちらが先かわかりません。
デモザイク
最後に、デモザイク(デベイヤ)処理が行われます。ココではアルゴリズムが複数選べますが、デフォルトだと封じられているアルゴリズムもあります。またdcbと呼ばれるアルゴリズムに関してのみ、他に調整用パラメータが用意されています。また、デモザイク処理をキャンセルするパラメータ( half_size )も用意されています。あと、four color rgbのパラメータもGreenチャネルのデモザイクに若干作用しそうです。
普通に現像するのであれば、せいぜいホワイトバランス調整と露出補正。撮影条件次第でノイズ除去、レンズによっては収差補正。といったところでしょうか。スマホのデータであればノイズ除去は丁寧にやらないとひどいことになります。
未補正の生データを取り出す場合には、黒レベル0、no_auto_scaleをTrue、four color rgbをTrueにしたうえで、half_sizeをTrue。あと他の処理はすべてOFFにすることで取り出せそうです。がそれであればpostprocessを呼ぶ必要ないですね。
ここまでの処理でいったんカメラセンサの値を画像にするところまでが出来上がります。ここからが仕上げの処理になります。
処理順(デモザイク後)
続いてデモザイク後です。仕上げ、見栄え、こんなあたりの調整処理になると思います。
こんな感じを予想しました。先と同じように、左が計算(処理)の内容予測、右側がそこに影響するパラメータを書いています。くどいですが予想です。
色変換
まずは色変換です。センサのデバイスに依存したRGBを、標準の色空間へ変換してあげます。この時の演算は3×3の行列演算です。通常はsRGBでよいのでしょうが、広い色空間にもマッピングできます。
ノイズ除去
続いてノイズ除去第二弾です。メディアンフィルタをかけることで、ここでもやはり色ノイズを除去しています。パラメータはメディアンフィルタをかける回数。メディアンフィルタのウィンドウサイズではありません。またRGBに対してかけるわけではなく、色成分に対してかけているようです。
自動明るさ補正
次に、トーン調整を行います。まずは飽和させる画素数を閾値として、自動明るさ補正が入ります。この補正では閾値 atuo_bright_thr をパラメータとして、ゲインを自動計算し、そのゲインを乗じることで補正を行っています。デフォルトは全体の1%の画素を255に張り付けるようなゲインになります。適度だと思います。
手動明るさ補正
続いて、手動で明るさを補正するパラメータです。おおよそ自動で済むとは思いますが、複数枚の画像を同じトーンにするのであれば、自動はうまくないので、手動が望ましいかと思います。同じようにゲイン調整しているだけだと思われます。そのゲインがパラメータです。
ガンマ補正
画素値を調整するという意味では、最後にガンマ補正を行います。これは単純なゲイン調整ではなく、いわゆる1/2.2乗の上凸の特性を適用します。人の視覚特性に合わせて調整する、定番の処理です。極ダーク部での急激な補正を抑制するような工夫(標準的なようですが)もされています。
回転・反転
続いて、回転・反転の処理が入ります。最後に置きましたが、正直どこでも結果は等価だと思います。
ビット数変換
最後にビット数を8bitに落とす処理が入ります。内部の演算精度(だと勝手に思っている)16bitのまま出力することも可能になっています。あと処理でもう少し凝ったことをしたい場合には16bitのまま出力させる必要がありそうです。
まとめ
ひとまず。23回もかけてpostprocessの各種処理を見ていきました。(そのxxとかつけなきゃよかった。)やっとまとまりました。一部処理をはしょったり、解明を放棄したパラメータもありますが、ここまでで大間違いはしていないと思います。間違いがあったら教えてください。
ただ少し処理が足りない気がします。凝りだしたらきりがないですが、せめて
周辺光量補正
樽・糸巻等の歪曲補正
ハイライト・ダーク部独立の階調補正
彩度補正
エッジ補正
くらいは欲しかったかなぁと思います。この後の処理でもなんとかなるとは思いますが、周辺光量補正や歪曲補正は処理順的にはデモザイク前が最適かなぁ。Photoshop使えって感じかなぁ。
自前で、あるいはOpenCVを使って、後処理も考えてみようと思います。しかしpostprocessの後処理って…。
コメント