歪曲収差を実現する

レンズを使ったカメラでは、映像が歪んで見えてしまうことがあります。

第17回 :レンズの大敵を探る 〜収差 3〜 デジカメの「しくみ」

"歪曲収差"と言う現象で、一般的に歪曲収差が少ないことがレンズ性能の良し悪しの判断で重要になってくるそうで。

3次元空間のある点を撮影して画像座標を得る時、 歪曲収差の無い理想的なレンズで(x_u, y_u)、 歪曲収差のあるレンズで(x_d, y_d)、 画像中心から(x_u, y_u)までの距離をr、 レンズの歪みをk_1 ~ k_5で表すと、 歪曲収差は以下のようにモデル化することができます。


x_d = (1+k_1r^2 + k_2r^4 + k_5r^6)x_u + 2 k_3 x_u y_u + k_4 (r^2 + 2 x^2_u)


y_d = (1+k_1r^2 + k_2r^4 + k_5r^6)y_u + k_3(r^2 + 2 y^2_u) + 2k_4 x_u y_u

ただし、実使用上はk_3以降は無視出来ることも多いらしく、以下のように簡略化する事も多いようです。


x_d = (1+k_1r^2 + k_2r^4)x_u


y_d = (1+k_1r^2 + k_2r^4)y_u

これを参考にして歪曲収差をGLSLで実現した物が以下。(表示崩れ回避の為gist使用)

歪曲収差の実現 · GitHub

twigl.app

参考

GLSLの冒頭の1行目について丁寧に解説する - Qiita

[GLSL] Shadertoyのシェーダ芸人になるためのTips集 - Qiita

ディジタル画像処理[改訂新版]

ディジタル画像処理[改訂新版]


数式とコード書こうとすると表示崩れてしまうのだが、両立させる方法あるんだろうか