rawpyでPython現像その17(chromatic aberration)

python

 rawpyの現像関数、postprocess関数の引数のchromatic_aberrationに関して確認します。

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

 いわゆる色収差を補正するパラメータです。これも基本的には説明通りの動きをしてくれたので、それほど難しいパラメータではないです。

色収差

 ここでの詳細説明は省きます。簡単にいうと、光の屈折率が色(波長)によって異なるため、レンズを通った光が結像する位置がRGBでセンサ上ずれることに起因するRGB間の色ずれ。といったところでしょうか。Wikiやメーカーサイトにも詳しい説明がありますので詳細説明はそちらに譲ることとします。

 rawpyで仮定しているモデルは、いわゆる倍率収差で、レンズ中心(画像中心)からGreenを基準にRed、Blueがどれだけ倍率変化しているか?を指定することで、その逆補正をしてくれます。

 いわゆる歪み系収差の、たる型、糸巻型のゆがみは補正できないです。まぁこれは色収差とは呼ばないか。

chromatic_aberration

 rawpyのリファレンスには、

赤、青のスケーリング値を(赤のスケール、青のスケール)で指定する。デフォルトは補正無しに相当する(1,1)。赤と青の収差をそれぞれの色をスケーリングすることで補正する。

 とあります。値としては、補正前画像の、RedとBlueのGreenに対する拡大率を指定します。

 つまり、Redが1.01倍Greenに対して大きく、Blueが0.99倍Greenに対して小さい像が取れている場合には、chromatic_aberration = [1.01, 0.99]と指定する必要があります。こう指定することで、Redを1/1.01倍、Blueを1/0.99倍してくれて、結果としてRGBのサイズがそろい、収差がキャンセルされます。

 最初は変換したい倍率を指定するものだと思ったのですが、そうではなく変換したい倍率の逆数を指定するもの。ということになります。(1より大きい値を入れると縮小されます。)

処理確認

 デモザイク前に行われていると思われます。センサ上に結像する像の補正なので、そう考えるのが自然です。少なくとも色変換前に処理が行われています。(色変換をrawにせず、sRGBにしたまま過補正したら、補正しないはずのGreenに対しても倍率変更に起因した像が出てきてしまったので。)

 倍率変更時の補間手段は不明です。バイリニアだと予想してますが、検証はしていません。そしてその補間方法は選べません。まぁ目的が微小倍率変更でしょうから、補間手段によって、モアレ等の問題を起こすことはないのかなと思います。

 ちなみに縮小に設定した際の外の値ですが、倍率変更前の1倍の画像が入ってきます。

 こんな感じ。(これはRedを極端に約80%に縮小したものです。)中心に向かって縮小され、外側は倍率変更前の画像のままです。

 効果を確認してみました。こんな感じで撮影した超広角の写真。今回色収差が出そうな写真として、olympusの9mm f8 フィッシュアイ ボディキャップレンズを使った写真を選んでみました。

 軽いし、薄いし、超広角取れるし、面白いレンズでツーリングとかにはよく持っていくのですが、予想した通り隅っこで収差が出ました。

 この左上にある赤枠で囲った箇所ですが、拡大すると

 わかりやすく色収差が出てます。色でいうと、Redが大きくて、Blueが小さい画像になっています。この倍率を計算してみます。

 この格子の座標位置を求めて、この座標が中心からの倍率変更処理で、1画素だけ動くように倍率を逆算してみました。あとはトライアンドエラーで適当に値を追い込んだところ、Redが1.001倍、Blueが0.9999倍。とかそんな当たりでいい感じになりました。(画素数的に考えると、Blueには倍率変更かかってないかも…)

 びたっと補正されています。わかりやすい素直な動きです。

 コードにするとこんな感じ

img  = raw.postprocess(half_size=True,
                       demosaic_algorithm=rawpy.DemosaicAlgorithm.LINEAR,
                       output_color=rawpy.ColorSpace.raw,
                       chromatic_aberration=[1.001,0.9999],
                       )

 今回の写真と同条件、被写体が無限遠、フォーカスも無限遠であればこの補正値は今後も流用できるかな。

まとめ

 RedとBlueの画像の倍率を微小変更させることで、簡易的に色収差の補正を行うことができ、chromatic_aberrationはその倍率を指定するパラメータ。Greenは基準色として倍率変更はできない。処理はセンサ値に対して行われ、この処理の後色変換やガンマ補正等が施される。

 といった感じですかね。

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

コメント

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