画像応用数学特論
最終レポート課題:階層グラフカットでステレオ
上川智幸
kamikawa@ime.info.hiroshima-cu.ac.jp
(2013/1/15 提出)
開発環境
OS | Windows XP Home Edition SP3 (32bit) |
コンパイラ | Microsoft Visual C++ 2008 Express Edition |
プログラミング言語 | C++ |
使用ライブラリ | OpenCV 2.2.0
MAXFLOW |
OpenCVの導入(VisualC++2008の場合)
- sourceforgeよりダウンロードを行い,ファイルを任意の場所に解凍する.
- システム環境変数のPathに「〜\opencv\build\x86\vc9\bin」および
「〜\opencv\build\common\tbb\ia32\vc9」を指定する.
- VisualC++2008オプション内のVC++ディレクトリにて,インクルードファイルに「〜\opencv\build\include」を,
ライブラリファイルに「〜\opencv\build\x86\vc9\lib」を追加する.
- VisualC++2008プロジェクトのプロパティにて,構成プロパティ-リンカ-入力-追加の依存ファイルに
必要なライブラリファイルを追加する(使用する関数による).
処理内容
平行化処理の行われた2枚の画像に対して,階層グラフカットを用いたステレオマッチングを行う.
アルゴリズム
- 入力左画像および入力右画像を読み込む.
- ブロックマッチングによるステレオを行い,各画素のラベル(視差)の初期値を設定する.
- ブロックマッチングにはShiftableウィンドウおよびSSDを用いる.
- 階層ラベルを作成する.
- ラベルの更新がなくなるまで以下の手順を繰り返す.
- 階層ラベルの構造に従って以下の処理を繰り返す.
- 画素間にノード・エッジの追加された2次元グラフを作成する.
- 各ノード,エッジにコストを設定する.
- データコストにはShiftableウィンドウおよびSSDを用いる.
- スムーズコストには視差の違いに係数をかけたものを用いる.
- グラフカットを行い,新しいラベルの総コストを計算する.
- 新しいラベルの総コストが現在より小さければ,ラベルを更新する.
- 求まったラベル(視差)を画像として出力する.
結果
図1,2に入力として使用した画像を,図3に左画像(図1)の視差の真値を示す.
これらの画像は以下のサイトよりダウンロードした.
http://vision.middlebury.edu/stereo/data/
階層グラフカットを用いる場合,α拡張グラフカットを用いる場合それぞれについて,ウィンドウサイズを3とし,
スムーズコスト係数cを変化させて行ったステレオマッチングの結果が,図4〜9である.
また,それぞれの計算時間を表にまとめたものを,表1に示す.
|
|
図1: 入力左画像 | 図2: 入力右画像 |
|
図3: 左画像の視差の真値 |
|
|
図4: 階層グラフカット,c=3000 | 図5: α拡張グラフカット,c=3000 |
|
|
図6: 階層グラフカット,c=4000 | 図7: α拡張グラフカット,c=4000 |
|
|
図8: 階層グラフカット,c=5000 | 図9: α拡張グラフカット,c=5000 |
表1: 図4〜9の実行に要した計算時間[sec]
スムーズコスト係数 | 階層グラフカット | α拡張グラフカット |
3000 | 34.875 | 137.672 |
4000 | 41.156 | 141.813 |
5000 | 30.281 | 146.094 |
考察
表1を見ると,階層グラフカットを用いることでα拡張グラフカットを用いる場合よりも大幅に計算時間を
短縮できていることがわかる.ラベルを半分ずつに区切るという性質上,最大視差の大きな画像であるほど
計算時間の短縮が見込めるだろう.
階層グラフカットとα拡張グラフカットでは同じコストを与えた場合でも結果が異なっており,それぞれの
手法で最も良い結果が出ていると思われるコストの値も異なるが,これは階層グラフカットでのスムーズコストの
与え方がα拡張グラフカットとは異なることに起因すると考えられる.
それぞれの手法で最も良い結果を得られたコスト同士(図5および図8)で比較した場合では,辿るラベルを
省略する階層グラフカットではどうしても精度で劣ってしまうことがわかる.しかし,階層グラフカットでは
計算時間が大幅に小さく済み,視差が大きくなるほどこの効果がより強く現れることが期待されるため,
入力画像の性質や,グラフカットの目的に応じた手法を適切に選ぶことが重要であると言える.
付録
ソースコード
2013年1月10日発表資料
ソースコードの使用方法
- 「graphcutStereo.h」をインクルードする.
- graphcutStereoクラスのオブジェクトを生成する.このとき,引数として入力左画像のファイル名,
入力右画像のファイル名,最大視差を与える.画像の形式は以下のものが使用できる.
- Windows bitmaps - BMP, DIB
- JPEG files - JPEG, JPG, JPE
- Portable Network Graphics - PNG
- Portable image format - PBM, PGM, PPM
- Sun rasters - SR, RAS
- TIFF files - TIFF, TIF
- graphcutStereoクラスのメンバ関数hierarchical_graphcut,あるいはalpha_graphcutを呼び出す.
それぞれ階層グラフカットとα拡張グラフカットによってステレオマッチングを行う関数であり,
引数としてスムーズコストに含まれる定数cを必要とする.
- graphcutStereoクラスのメンバ関数output_disparityを呼び出し,視差画像を出力する.
output_disparityに与える引数が出力画像ファイル名となる.
コンパイル方法(VisualC++2008の場合)
- プロジェクトを作成する.
- 添付のソースコード,およびグラフカット用ライブラリMAXFLOWをプロジェクトに追加する.
- プロジェクトのプロパティにて,OpenCVの設定を行う(前述の「OpenCVの導入」4項).
- ビルドを行う.