画像応用数学特論 最終課題

名前:横溝将成

学籍番号:

所属:画像メディア工学研究室

 

 

理論

階層グラフカットを用いたステレオマッチングを行う.

 

アルゴリズム

Bp = new int[width*height];

              for(int y=0;y<height;y++){

                            for(int x=0;x<width;x++){

Bpの配列に0初期値0を代入

}

              }

 

 

A[0][0]=0;

A[1][0]=n/2

A[2*j][k] = ((1+4*k)/pow(2.0,j+1))*n;                 

A[2*j+1][k] = ((3+4*k)/pow(2.0,j+1))*n;

配列Aに階層的なラベルを設定する             

              for(int a=0;a<100;a++){

                            success =0;

フラグを設定する

                            for(int i=0;i<8;i++){

                                          グラフの初期化をする

                                          画素数とエッジ数のノードを設定する.

 

画像ピクセルに対応したノード設定する

                            for(int y=0;y<height;y++){

                                          for(int x=0;x<width;x++){

                                                                                                                                           

Aの配列内にある値で配列Bpの値に近い値を変数apに代入し,

ピクセルに対応した各ノードのソース側にBpをシンク側にapのデータコストを設定する.

                                                                                    }

}

                                                                     

 

隣接点のノードとエッジの設定

横方向でノードとエッジを設定

node = width*height                 

              for(int y=0;y<height;y++){

                            for(int x=0;x<width-1;x++){

                                          index = node + x+y*(width-1);

                                                                     

Aの配列内にある値で配列Bp[width*y+x]の値に近い値を変数apに,配列Bp[width*y+x+1]の値に近い値を変数aqに代入し,

index番目にソース側にBp[width*y+x]Bp[width*y+x+1]のスムースコストを,シンク側にap,aqのスムースコストを設定する.

(以降スムースコストはVと表記する)

 

 

もしBp[width*y+x]Bp[width*y+x+1]のスムースコストよりap,aqのスムースコストのほうが大きければ,

Index番目からwidth*y+x番目にエッジの重み10000を設定

index番目からwidth*y+x+1番目にエッジの重み10000を設定

width*y+x番目からindex番目に0V(ap,Bp[width*y+x])-V(Bp[width*y+x],Bp[width*y+x+1])を設定

width*y+x+1番目からindex番目に0V(Bp[width*y+x]aq)-V(Bp[width*y+x],Bp[width*y+x+1])を設定

 

もしap,aqのスムースコストよりBp[width*y+x]Bp[width*y+x+1]のスムースコストのほうが大きければ

 

width*y+x番目からindex番目に10000を設定

width*y+x+1番目からindex番目に10000を設定

Index番目からwidth*y+x番目にV(ap,Bp[width*y+x+1])-V(ap,aq)を設定

index番目からwidth*y+x+1番目にV(Bp[width*y+x]aq)-V(ap,aq)を設定

 

 

                                                        }

                                          }

                                         

縦方向のノードとエッジを設定する

 

for(int y=0;y<height-1;y++){

              for(int x=0;x<width;x++){

                            index =(width*height + (width-1)+height)+width*y+x;

                                                       

Aの配列内にある値で配列Bp[width*y+x]の値に近い値を変数apに,配列Bp[width*(y+1)+x]の値に近い値を変数aqに代入し,

index番目にソース側にBp[width*y+x]Bp[width*(y+1)+x]のスムースコストを,シンク側にap,aqのスムースコストを設定する.

 

 

もしBp[width*y+x]Bp[width*(y+1)+x]のスムースコストよりap,aqのスムースコストのほうが大きければ

Index番目からwidth*y+x番目にエッジの重み10000を設定

index番目からwidth*(y+1)+x番目にエッジの重み10000を設定

width*y+x番目からindex番目に0V(ap,Bp[width*(y+1)+x])-V(Bp[width*y+x],Bp[width*(y+1)+x])を設定

width*(y+1)+x番目からindex番目に0V(Bp[width*y+x]aq)-V(Bp[width*y+x],Bp[width*(y+1)+x])を設定

                                                                                                                             

 

もしap,aqのスムースコストよりBp[width*y+x]Bp[width*(y+1)+x]のスムースコストのほうが大きければ

 

width*y+x番目からindex番目に10000を設定

width*(y+1)+x番目からindex番目に10000を設定

Index番目からwidth*y+x番目にV(ap,Bp[width*(y+1)+x])-V(ap,aq)を設定

index番目からwidth*(y+1)+x番目にV(Bp[width*y+x]aq)-V(ap,aq)を設定

                                                        }

                                          }

double flow = g -> maxflow();/*最大流最小カット*/                     

 

if(E > flow){                                                              

for(int y=0;y<height;y++){

              for(int x=0;x<width;x++){

SINKSOURCEに分けてラベルに対応した値を出力ファイルに代入する.                            

                                          }

}

                                                        E = flow;

                                                        success = 1;

フラグを立てる

                                          }

                                          delete g;

                                         

                            /*i_end*/

                            }

                            if(success == 0){

                                          printf("success\n");

                                          break;

                            }

              /*a_end*/

              }

関数

データコストはSADSSD

 

スムーズコストは視差Bp[width*y+x]Bp[width*y+x+1]それぞれの値を左側の画像に画素番号に代入しその差dをもとめる.

適当な閾値Tを設けdT以上の値ならば定数倍c0を設定し,dT以下なら定数倍c1を設定する(c0<c1

隣り合った画素の視差fpfqがなるべく近くなるように項つまり形状が滑らかに変化する

 

V(fp fq)c

 

 

結果

ステレオに使用した2枚の画像

ステレオによる結果

SADによる結果

3×3のマスクに閾値10 c01c13で初期値を0で行った結果.

 

3×3のマスクに閾値10 c01c13で初期値をステレオで生成した画像で設定した結果.

 

 

 

 

 

SSDによる結果

3×3のマスクに閾値10 c010c1100で初期値を0で行った結果.

 

 

3×3のマスクに閾値10 c010c1100で初期値をステレオで生成した画像で設定した結果

 

 

真値

 

考察

今回階層的グラフカットを用いてステレオで求めた画像を真値の画像に近い画像を生成しようとしたが,SADSSDともにあまりよい結果ではなかった.

なぜならば適切な閾値Tの設定ができていなためである.とくにカメラと背景の輝度値は非常に近似しているため厳密な閾値の設定が必要となるため

SADSSDの画像ともにカメラの形状をとらえられずにいる.またステレオの画像自体に黒い色が混じっているためSADSSDともに黒い色

をなめらかにできずにいる.そしてそのため今後の課題として考えられるのは閾値の厳密な設定とステレオで生成する画像の向上である.