レンズ・プロファイルを追求してみる with OpenCV ~Fisheye編 | Nature | Photography | Music | Art

Nature | Photography | Music | Art

日々好奇心の趣くまま

サイト内の写真の使用ならびに無断転用を禁じます。

シリーズあと一息。

実はこちらの方が個人的に多用するだろうと思うFishEyeの歪み補正。
前回のRectilinearのレンズとは構造が異なるため別扱いとなっているみたい。

FishEyeの場合とりわけ周辺歪みが大きく、パノラマで繋げようとしてもそのままでは全然繋がらないので経験上この補正は必須のようです。(世に出ているパノラマ編集ソフトは内部でこの作業を行っている模様。)

計算式の導出などは、lensprofile_creator_cameramodel.pdfの"Geometric Distortion Model for Fisheye Lenses"を参照。

計算式は円周方向の歪み補正が省かれているなど若干相違点があるが、大筋はRectilinearの内容が理解できればこちらも容易に理解できると思う。

例として個人的に愛用しているCanon EF 15mm F2.8 Fisheye(名玉なのに長らく前に製造中止・泣)のlcpの該当部分はこんな感じ。



緑で囲った部分が"stCamera:FisheyeModel"となっていればFishEyeレンズということを示している。

lcpの項目と補正パラメータの関係は以下の通り。赤で囲んだ部分。

stCamera:FocalLengthX : fx / Dmax. If absent, default to stCamera:FocalLength in millimeters.
stCamera:FocalLengthY : fy / Dmax. If absent, default to stCamera:FocalLength in millimeters.
stCamera:ImageXCenter: ux / Dmax. If absent, default to 0.5.
stCamera:ImageYCenter: uy / Dmax. If absent, default to 0.5.
stCamera:RadialDistortParam1: k1
stCamera:RadialDistortParam2: k2

パラメータの詳細は前回のRectLinearより若干パラメータ数が少ないが、ほぼ同様なので説明省略。

以上をOpenCVのremap関数を用いてインプリしたものを公開しました。

https://github.com/delphinus1024/fisheye_undistort

ビルド・使用法の詳細はreadmeをご覧頂くとして、実行結果を。

補正なし



補正後。変形のイメージを掴みやすくするために、サイズをオリジナルの3倍(-S=3.0 option)に取ったもの。



湾曲していた部分が直線に戻っているのがわかるかと思います。
Rectilinearの場合と異なり、FishEyeを補正して直線化すると実はこんな極端な変形をするのです。Photoshop内部だけで作業していると勝手にトリミングされるので気づかないが。

四隅がほぼ無限大に広がってしまい実用になるのはその中心部のみとなります。

実用上は上下左右の黒の部分を省いた最大矩形をトリミングすると、通常Photoshopなどで行うFishEye補正になります。

(後日補足)この後、Vignette補正についても書こうと思っていたのですが、どういうわけか理屈と結果が一致せずに停滞中。解決したら後日改めて書く(かもしれません)。