師岡大志
e-mail:morooka@cv.info.hiroshima-cu.ac.jp
締め切り:2012/1/23
提出日:2012/1/23

画像応用数学特論レポート課題


課題内容:階層グラフカットでステレオ

対応する二枚のステレオペア画像ファイルを読み込み、階層グラフカットアルゴリズムを使いステレオマッチングを行い、視差を画像ファイルにして出力するプログラムを作成せよ。

階層グラフカットアルゴリズム

実装したアルゴリズム
・変数宣言
・for p=全てのピクセル
	・fp=初期値
・end for
・A={{0},...,{3,...,64}}
・E=とても大きな値
・for ループ=0〜とても大きな値
	・success=0
	・for i=0~11
		・グラフの初期化
		・全てのノードの追加
		・for p=全てのピクセル
			・A[i]のうち、beta_pに最も近い値をalpha_pに設定
			・ノードのソース側にD(beta_p)、D(alpha_p)を設定
		・end for
		・for(p,q)=全ての隣接点
			・A[i]のうち、beta_pに最も近い値をalpha_pに設定
			・A[i]のうち、beta_qに最も近い値をalpha_qに設定
			・もし、V(beta_p,beta,q)< = V(alpha_p,alpha_q)の場合
				・ノードaからノードpへのエッジの重みに10000を設定
				・ノードaからノードqへのエッジの重みに10000を設定
				・ノードpからノードaへのエッジの重みに、V(alpha_p,beta,q)-V(beta_p,beta_q)か0のうち大きいほうを設定
				・ノードqからノードaへのエッジの重みに、V(beta_p,alpha,q)-V(beta_p,beta_q)か0のうち大きいほうを設定
			・もし、V(beta_p,beta,q)>  V(alpha_p,alpha_q)の場合
				・ノードpからノードaへのエッジの重みに10000を設定
				・ノードqからノードaへのエッジの重みに10000を設定
				・ノードaからノードqへのエッジの重みに、V(alpha_p,beta,q)-V(alpha_p,alpha_q)か0のうち大きいほうを設定
				・ノードaからノードpへのエッジの重みに、V(beta_p,alpha,q)-V(alpha_p,alpha_q)か0のうち大きいほうを設定

		・end for
		・最大流・最小カットアルゴリズムの適用
		・E'=求まったラベルで計算した総コスト関数
		・E'<Eなら、現在のラベルを求まったラベルにし、E =E'にし、success =1にする
		・グラフの消去
	・end for
	・もしsuccess==0ならループを脱出
・end for
コスト関数
データコスト:

スムーズコスト:

ソースファイル

対象画像tukuba

処理の対象とした画像はtsukubaはhttp://cat.middlebury.edu/stereo/data.htmlからダウンロードし、Harfsizeを用いた。


左画像 右画像

処理結果tukuba

tsukuba(1画素のみ、12.93秒) tsukuba(窓:3×3、12.19秒)
tsukuba(窓:5×5、18.94秒) tsukuba(窓:7×7、14.24秒)
tsukuba(窓:9×9、13.96秒)tsukuba(1画素のみ、19.29秒)

対象画像Aloe

対象としたAloeはhttp://vision.middlebury.edu/stereo/data/からダウンロードしThirdSizeを用いた。

左画像 右画像

処理結果Aloe

Aloe(窓:5×5、c=1、22.14秒) Aloe(しきい値によりc=1,c=4、16.96秒)

α拡張グラフカットでのステレオマッチング

ソースファイル
今回は、実行結果などは省略するが、Aloeの処理時間は35.07秒であった。

考察・感想

tsukubaの処理結果より、窓サイズをあまり大きくしすぎると領域が潰れてしまっていることがわかる。しかし、1画素のみで処理を行うと細かい間違いが発生している。また、スムーズコストのcの値をしきい値により場合分けは結果を見るかぎり効果があったが、しきい値やcの値などどのように設定するかは検討する必要がある。
また、α拡張での場合と比較して、実行時間は長くとも約20秒で終わっており高速に処理が終わった。

環境

OS:CentOS release 5.7
コンパイラ:gcc ver.4.1.2
ライブラリ:MAXFLOW(グラフカットライブラリ),openCV