α拡張アルゴリズムと階層グラフカット


実行環境

OSWindows XP SP3 (Cygwin利用)
コンパイラg++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
プロセッサIntel(R) Core(TM)2 Duo CPU E8600@3.33GHz (2 CPU)
メモリ2 GB

1.コンパイルと実行方法

1.必要なファイルのダウンロード
 1.1.OpenCV ver1.0をインストール.
 1.2.cv_cygwin.shをここからダウンロードして実行.
 1.3.最大流最小カットのライブラリ(maxflow-v3.0.src.tar.gz)をダウンロード.(ここから)
 1.4.コンパイル用のシェルスクリプトopencv.shとソースファイル(後述)をダウンロード.
2.解凍したmaxflow-v3.0.srcのフォルダにソースとopencv.shをコピー.
3.以下のコマンドを実行
  $ opencv.sh [sourcename.cpp]
  $ a.exe [imagefile]
 ステレオの場合はコマンドは以下
  $ opencv.sh [sourcename.cpp]
  $ a.exe [leftimagefile] [rightimagefile]
 対象画像はpng,jpg,bmpなど(詳細はOpenCVリファレンスを参照)
 また、ステレオマッチングの場合最大視差等の変数の設定を変える必要がある。


ソースファイルはこちら
alpha-expantion.cppα拡張アルゴリズムのプログラム
hierarchical.cpp階層グラフカットのプログラム
alpha-expantion-stereo.cppα拡張アルゴリズムを用いたステレオマッチング
hierarchical-stereo.cpp階層グラフカットを用いたステレオマッチング


2.α拡張アルゴリズム
◆ アルゴリズム
・変数宣言
・(出力用配列の)初期値の入力
・var E=INT_MAX(大きな数)
・0からEまでのループ
 ・var success=0
 ・var alpha を0〜255までループ
   ・グラフの初期化
   ・すべての画素ノードの追加
     (エッジははらないがデータコストとスムースコストは振っておく)
   ・すべての隣接ノードの追加(このときに同時にエッジも足しておく)
   ・最大流最小カット(このときのフローをE'とする)
   ・E'<EならばE=E'に更新し、success=1とする
   ・グラフの消去
・出力用配列を出力
◆ 実行結果

原画像にはSIDBA標準画像からLenna,Tiffany,Mandrillを用いた
Lenna Tiffany Mandrill
Lenna (512x512)
Tiffany (512x512)
Mandrill (512x512)

実行結果(グレースケール)
実行時間
119sec
91sec
133sec
Lenna Tiffany Mandrill


2.3 ステレオマッチング
α拡張アルゴリズムを用いたステレオマッチングの結果についてはこちら


3.階層グラフカットアルゴリズム
◆ アルゴリズム
・変数宣言
・(出力用配列の)初期値の入力
・var E=INT_MAX(大きな数)
・0からEまでのループ
 ・var success=0
 ・(推定する値が2^6未満の場合)var alpha を0〜11までループ
   ・グラフの初期化
   ・すべての画素ノードの追加
     (エッジははらないがデータコストとスムースコストは振っておく)
   ・すべての隣接ノードの追加(このときに同時にエッジも足しておく)
   ・最大流最小カット(このときのフローをE'とする)
   ・E'<EならばE=E'に更新し、success=1とする
   ・グラフの消去
・出力用配列を出力
◆ 実行結果

実行結果(グレースケール)
実行時間
28sec
30sec
25sec
Lenna Tiffany Mandrill

◆ ステレオマッチング
階層グラフカットアルゴリズムを用いたステレオマッチングの結果についてはこちら