画像応用数学 最終レポート
氏名:伊井野達也
メール:iino@ime.info.hiroshima-cu.ac.jp
日付:1月21日
階層グラフカットを用いたステレオマッチング
使用環境
使用OS:CentOS 5.4
コンパイラ:g++
使用言語:C/C++
ライブラリ:maxflow(http://pub.ist.ac.at/~vnk/software.html )
階層グラフカットを用いたステレオマッチングアルゴリズム
- 現在のラベルβを初期化
- 階層ラベルAを作成
- グラフの総コストEを初期化
- 階層の深さdepthだけ以下をループ
- グラフを初期化
- ノードを追加
- 全ての画素kに対して
- 現在の深さiの階層ラベルA[i]のうち最もβ[k]に最も近い値
をαkに設定
- ノードのソース側にD(βk),シンク側にD(αk)を設定
- 全てのエッジに対して,(以下では,画素p, qのエッジ)
- 現在の深さiの階層ラベルA[i]のうち最もβ[p]に最も近い値をαpに設定
- 現在の深さiの階層ラベルA[i]のうち最もβ[q]に最も近い値をαqに設定
- ノードaソース側にV(βp, βq),シンク側にV(αp, αq)を設定
- もし,V(βp, βq) ≦ V(αp, αq)ならば,
- ノードaからノードpへのエッジの重みに10000(比較的大きい数)を設定
- ノードaからノードqへのエッジの重みに10000(比較的大きい数)を設定
- ノードpからノードaへのエッジの重みに,V(αp, βq)-V(βp, βq)か0のうち大きいほうを設定
- ノードqからノードaへのエッジの重みに,V(βp, αq)-V(βp, βq)か0のうち大きいほうを設定
- もし,V(βp, βq) ≧ V(αp, αq)ならば,
- ノードpからノードaへのエッジの重みに10000(比較的大きい数)を設定
- ノードqからノードaへのエッジの重みに10000(比較的大きい数)を設定
- ノードaからノードpへのエッジの重みに,V(αp, βq)-V(αp, αq)か0のうち大きいほうを設定
- ノードaからノードqへのエッジの重みに,V(βp, αq)-V(αp, αq)か0のうち大きいほうを設定
- 最大流・最小カットアルゴリズムを適用し,総コストE'を計算
- もし,E > E' ならば
- 現在のラベルβkを求まったラベル更新
- 総コストの更新(E = E')
- グラフの消去
- 総コストが収束するまで4を繰り返す
コスト関数
コスト関数は,アルファ拡張,階層グラフカットのどちらも講義で紹介されたものを参考にした.
- データコスト
- 出力画像fpが入力画像Ipに出来るだけ近くなるようにする項
- D(β) = SAD(β) = Σ|I(x, y) - I(x - β, y)|
- スムーズコスト
- 隣り合った画素fp,fqの明るさが出来るだけ近くなるようにする項
- V(fp) = |fp - fq|
実行結果
左画像
右画像
結果
ソースコード
hierarchicalGraphCut DownLoad (zip)