画像応用数学特論 最終課題
名前:横溝将成
学籍番号:
所属:画像メディア工学研究室
理論
階層グラフカットを用いたステレオマッチングを行う.
アルゴリズム
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番目に0かV(ap,Bp[width*y+x])-V(Bp[width*y+x],Bp[width*y+x+1])を設定
・width*y+x+1番目からindex番目に0かV(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番目に0かV(ap,Bp[width*(y+1)+x])-V(Bp[width*y+x],Bp[width*(y+1)+x])を設定
・width*(y+1)+x番目からindex番目に0かV(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++){
SINKとSOURCEに分けてラベルに対応した値を出力ファイルに代入する.
}
}
E
= flow;
success
= 1;
フラグを立てる
}
delete
g;
/*i_end*/
}
if(success
== 0){
printf("success\n");
break;
}
/*a_end*/
}
関数
データコストはSADとSSD.
スムーズコストは視差Bp[width*y+x]とBp[width*y+x+1]それぞれの値を左側の画像に画素番号に代入しその差dをもとめる.
適当な閾値Tを設けdがT以上の値ならば定数倍c0を設定し,dがT以下なら定数倍c1を設定する(c0<c1)
隣り合った画素の視差fp,fqがなるべく近くなるように項つまり形状が滑らかに変化する
V(fp fq)=c
結果
ステレオに使用した2枚の画像
ステレオによる結果
SADによる結果
3×3のマスクに閾値10 c0は1でc1は3で初期値を0で行った結果.
3×3のマスクに閾値10 c0は1でc1は3で初期値をステレオで生成した画像で設定した結果.
SSDによる結果
3×3のマスクに閾値10 c0は10でc1は100で初期値を0で行った結果.
3×3のマスクに閾値10 c0は10でc1は100で初期値をステレオで生成した画像で設定した結果
真値
考察
今回階層的グラフカットを用いてステレオで求めた画像を真値の画像に近い画像を生成しようとしたが,SAD,SSDともにあまりよい結果ではなかった.
なぜならば適切な閾値Tの設定ができていなためである.とくにカメラと背景の輝度値は非常に近似しているため厳密な閾値の設定が必要となるため
SAD,SSDの画像ともにカメラの形状をとらえられずにいる.またステレオの画像自体に黒い色が混じっているためSAD,SSDともに黒い色
をなめらかにできずにいる.そしてそのため今後の課題として考えられるのは閾値の厳密な設定とステレオで生成する画像の向上である.