Descattering Transmissive Observation using Parallel High-frequency Illumination
平行高周波照明による透視画像の散乱光除去
Kenichiro Tanaka1,2,
Yasuhiro Mukaigawa2,
Yasuyuki Matsushita1, 3,
Yasushi Yagi1
1 Osaka University,
2 Nara Institute of Science and Technology
, 3 Microsoft Research Asia
ICCP 2013 (oral) :
[Paper, pre-print (PDF)]
電子情報通信学会論文誌D :
[論文, pre-print (PDF)]
論文誌
高周波照明:ソースコード
ソースコードを Github のページで配布しています.Github リポジトリp>
内容物:以下の通り,複数の Python スクリプトが含まれています.それぞれ,-h
オプションを付けることで,どういったオプションがあるのかを見ることができます.
1. | チェスボード画像の生成 | generate_checker_board.py |
2. | 撮影後の画像処理 | separate_direct_global.py |
3. | 撮影の自動化(一眼レフ) | ScriptCapture/ScriptCaptureDSLR.py |
4. | 撮影の自動化(Point Gray) | ScriptCapture/ScriptCapturePgr.py |
実行環境と依存パッケージ:基本的には,どのOSでも使用できると思いますが, Ubuntu 14.04 でのみ動作確認しています.依存パッケージは,python (2.7), numpy, OpenCV
です.
Ubuntu 14.04 の場合は,以下のコマンドで依存パッケージをインストールできます.
$ sudo apt-get install libopencv-dev python python-numpy python-opencv
実践してみましょう
準備:カメラを三脚に固定し,プロジェクタ(あるいは液晶ディスプレイ)を接続します.
まずは,投影する画像を生成します.
$ python generate_checker_board.py
デフォルトでは,チェスボード画像が18枚と,全体が白と黒の画像,計20枚が生成されます.
撮影:生成されたチェスボード画像を,PowerPointなどに貼りつけて,スライドショーを実行します.それぞれのスライドに対して,1枚撮影します.この時点では,白と黒の画像は撮影をスキップします.PNG 形式で保存しましょう.
後処理:最後に,簡単な画像処理を行い,直接光と大域光に分離します.撮影された画像を images
ディレクトリに保存したとすると,
$ python separate_direct_global.py -d images
とスクリプトを実行すると, images
ディレクトリ内に, direct.png
と, global.png
が出力されます. direct.png
が鮮明な画像となっていることを確認しましょう.
さらにもっと
カメラの設定:カメラはシャッター速度や絞りなど,すべてのパラメータをマニュアルで設定しましょう.オートのままだと,撮影のたびに明るさが変わるので,うまくいきません.ノイズが多いと困るので,低感度・長時間露光が良い画質につながります.また,プロジェクタによっては時間的に異なる色を高速に切り替えて表示しているものがあるので,シャッター速度を長めにして,プロジェクタの明るさのちらつきをキャンセルする必要があります.
一眼カメラや高級コンデジには,カメラ上部にカメラのモードを設定するダイアルがあります.これを M (マニュアル)にしましょう.注意するべき項目は以下の3つです.
ISO 感度 | できるだけ低めに.ISO 100 が目安.大きな数字ほど明るくなります. |
f 値 | 絞る方向で.f 8 ~ 16 程度が目安.小さい数字ほど明るくなります. |
シャッター速度 | 長めに.大きい数字ほど明るくなります. |
これら3つのパラメータは,すべて明るさをコントロールするので,シーンの明るさに応じて設定を微調整しましょう.
これとは別に,保存フォーマットをJPEGではなくRAWにして撮影し,PNG画像などのロスレスフォーマットに現像しましょう.JPEGなどで圧縮された画像は,ピクセルの値が変化するため,適していません.現像は,たとえば,以下のコマンドで行えます.
$ dcraw -4 -c input.raw | convert - output.png
パターンの細かさ:投影パターンの最適な細かさは,プロジェクタやカメラの解像度,シーンにより異なります.最終的な画像上で見たときに格子サイズが 3px 程度になるくらいの大きさが経験的にベストです.あるいは,投影パターンがシーンのテクスチャよりも2倍以上に細かければOKです.
パターンのシフト:投影パターンのシフトを細かくすると,アーチファクトが減少します.格子サイズの 1/N ずつずらすとき,横方向に N 回,縦方向に N/2 回,合計 N^2/2 回シフトすることで,全パターンを網羅できます.
白と黒の画像:全体が白(あるいはグレー)の画像を投影すると,散乱光を除去する前の不鮮明なリファレンス画像が撮影できます.実験結果の比較に利用できます.全体が黒の画像を撮影すると,プロジェクタのオプティカルブラック+外乱光が撮影できます.すべてのパターン投影画像から黒の撮影画像を引くと,より頑健な成分分離が行えます.black.png
という名前で保存しておくと,自動的に引き算を行います.
撮影の自動化:投影画像を変化させて撮影する手順は,プログラムにより自動化できます.撮影の自動化スクリプトを,ScriptCapture という名前のフォルダで,提供しています.一眼レフ用と,Point Grayのカメラ用があります.試してみてください.
Tips: パターンの投影コマンドと,実際にプロジェクタやディスプレイに画像が表示されるまでには多少のタイムラグが存在します.投影パターンとキャプチャ画像が一致しない時は,ダミーのキャプチャを挟むといいでしょう. ダミーキャプチャは--dummy 1
オプションで設定できます.