2013年8月19日月曜日

Fourier Slice Theorem (2D)

Light Field Cameraの勉強をしているとFourier Slice Theoremというのが出てくる。Lytro創始者Ren NgのFourier Slice PhotographyではN次元まで拡張されている。4D light fieldの2D Sliceはうまく行かなかったので、まずは2次元でちゃんと出来るか確認してみた。
図はRen Ng氏のドクター論文より。



まずはProjectionを行う。図の左側だ。基底変換をした後に積分をすればよい。
これを実装しようと思ったが、アホな頭には思った以上に難しい。例によってツールを使う。どうやらこのような変換はRadon Transformとして知られているおりCTなどのトモグラフィに応用されているようだ。Pythonで使う場合はskit-imageを使う。このライブラリで変換を行うと2次元画像が出力される。が、今回は1次元(1つの角度)だけ取り出して描画する。これでProjection演算は完了。図は元画像を10°傾けてプロジェクションしたもの。
元画像は0と255の2値からなる画像なので、実はこの変換の結果は角度に関係ない。


続いて、図をフーリエ変換したあとにSliceしてそれを逆フーリエ変換する。図では→、↓、←、という変換経路。FFT→Rotation→Slice→iFFTというふうに実装してみた。これの変換をすれば先ほどと同じ出力が得られる、というのがFourier Slice Theoremである。スライスする部分は自分で実装。

まず下図は0°でスライスした結果。FFTの結果はパワー(絶対値の2乗)を画像として載せている。てっぺんが少し平らになったがなかなか良く再現出来ている。



続いて10°の結果を載せる。だいぶ形がおかしい。


別の現実的な画像でやってみる。まず0°。スケールが違うので少し違って見えなくもないが、再現出来ていると言えよう。


続いて10°。


んー。似てない。
多分Sliceするときに精度が落ちてしまったのだろう。4D Light Fieldでも同じ原因で出来なかったのだろう。しかし、こんなに変わってしまうとは。なにか工夫すればうまくいくのか…

追記:
どうやら調べてみると、離散的になデータをグリッドで扱うところに誤差があるっぽい。
同じようなことをやろうとした人たちがいるようだ。
https://groups.google.com/forum/#!topic/comp.soft-sys.matlab/Fe9Wf8Slhzs

最後の方では補完を試みたけど、全然ダメだったとか、
実際はこの方法使われてないとか書いてある。


0 件のコメント:

コメントを投稿