質問: 魚眼レンズの画像処理 魚眼レンズで撮影した画像って、ひずんでますよね。 これを普通に(って何が普通かと言う問題はあるけれど)直す 処理プログラムをおしえていただけませんか? できれば、教科書的なものでなく、サンプルプログラムがあれば うれしいんですが・・・ 言語は、c以上の高級言語ならたいていわかるので せめてポインタだけでも・・ お願いします。
回答: 射影変換(とその一部であるアフィン変換)は直線が直線になる変 換ですから、魚眼レンズの変換や逆変換には使えませんよ。ごく一 部なら近似できるかもしれませんが。 で、まずは教科書的に。 広角を含む普通のレンズは、視野の一部を視点からdだけ離れた平 面に投影します。これに対して魚眼レンズは、まず視点を中心とし た半径rの球面に視野全体を投影して、次にその投影した結果を平 面に垂直に投影しなおすものです。 # ただし、本物のレンズが完全にこの数学モデルどおりに働いてい # るかどうかは、レンズの設計にもよると思うのでわかりません。 さて、この原理がわかれば、魚眼レンズと普通のレンズの間の変換 をするための式を立てることができます。 普通のレンズの画像で中心からlだけ離れた点と、魚眼レンズの画 像の中心からlだけ離れた点が対応しているとします。そうすると、 l/r = l/sqrt(d^2+l^2) になります。つまり、 l = rl/sqrt(d^2+l^2) ですね。同じように、普通の画像上の点p(x,y)と魚眼の画像 上の点p(x,y)を対応させると、 x = rx/sqrt(d^2+x^2+y^2) y = ry/sqrt(d^2+x^2+y^2) となります。これは、普通→魚眼の座標変換式ですが、画像の逆変 換には逆変換の式を作るのではなく、この式をそのまま使います。 なぜなら、逆変換後の座標(x,y)の画素の値は、逆変換前の座標 (x,y)の画素の値になるわけですから、プログラム上は(x,y)をぐる ぐる回して、(x,y)を求めて、その位置の値を(x,y)の値とすればい いからです。 プログラムを書くなら、 for (x=0;x= 0 && x < w && y >= 0 && y < h) { futsuu[x][y] = gyogan[x][y]; } else { futsuu[x][y] = black; /* or white or any */ } } } て感じでしょうか。w,h, w,h は、それぞれの画像の幅と高さです。 ただし、x, y が画像の範囲をはみ出していないかチェックする必 要があります。 また、画質をよくするためには適当な補間法を適用します。補間法 については、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=15511 で答えているので参考にしてください。 rには魚眼の画像の半径を設定します。 d/rが中心付近の倍率になります。 参考url:http://oshiete1.goo.ne.jp/kotaeru.php3?q=15511