立體匹配和其他圖像處理方法不同,由於涉及到視差對應,在圖像邊緣往往出現參考圖像在匹配圖像上的對應像素超出匹配圖像範圍的情況,這時如果採取一刀切的辦法容易出現圖像邊緣大量有用信息的丟失。於是,我們很自然地想到這樣解決問題:
1、參考圖像邊緣導致對應像素超出匹配圖像範圍的視差應當直接丟棄,而從其他非超出圖像範圍的視差中取最優視差值。
2、在計算代價時,給超出圖像範圍的視差以很大的代價,然後無差別地從所有視差中取最優視差。
如上圖所示,假設初始視差範圍爲[-10,9](雖然不是常態,但是有時算法原因導致首尾視差範圍減除首尾視差,變爲[-9,8])。假設已經計算了像素P在[-9,8]視差範圍的所有代價,而disparity=-9和disparity=8時對應像素p'超出圖像範圍,這時我們需要丟棄-9和8,而在[-8,7]範圍搜索最優視差值,具體代碼如下所示:
int i,j,d;
float *tempdisp = new float[dispnum-2];
float tempf;
int tempi;
int t = 0;
for (i=0;i<height;i++)
{
for (j=0;j<width;j++)
{
int index = i*width+j;
int disparity_begin_temp = disparity_begin;
for (d=1,t=0;d<dispnum-1;d++)
{
if (j+d+disparity_begin>=0 && j+d+disparity_begin<width)
{
tempdisp[t] = aggcost[index*dispnum+d];
t++;
}
else if (j+d+disparity_begin < 0)
{
disparity_begin_temp++;
}
}
GetMin(tempdisp,t,&tempf,&tempi);
disparity[i*width+j] = tempi+disparity_begin_temp+1;
dispmap[i*width+j] = tempi+disparity_begin_temp-disparity_begin+1;
}
}
delete[] tempdisp;
其中,GetMin的函數實現如下:
void GetMin(float *val, int num, float *minval, int *index)
{
float mintemp = 999999.0f;
int tempindex;
for (int i=0;i<num;i++)
{
if (val[i]<mintemp)
{
mintemp = val[i];
tempindex = i;
}
}
*minval = mintemp;
*index = tempindex;
}
而常規的直接從所有視差範圍選擇最優視差的方法如下所示:
int i,j,d;
float *tempdisp = new float[dispnum-2];
float tempf;
int tempi;
int t = 0;
for (i=0;i<height;i++)
{
for (j=0;j<width;j++)
{
int index = i*width+j;
int disparity_begin_temp = disparity_begin;
for (d=1,t=0;d<dispnum-1;d++)
{
tempdisp[t] = aggcost[index*dispnum+d];
t++;
}
GetMin(tempdisp,t,&tempf,&tempi);
disparity[i*width+j] = tempi+disparity_begin_temp+1;
dispmap[i*width+j] = tempi+1;
}
}
delete[] tempdisp;
下面,我們通過實驗對比這種方法的有效性:
由上圖可以看出,雖然用本文方法確實補充了直接從所有視差中選擇最優視差方法導致的圖像邊緣的視差信息丟失,但是其實很多結果是錯誤的!究其原因,是邊緣圖像的代價錯誤導致的,我們在計算costmatrix時,對於超出圖像範圍的代價值給了0,這樣做不對!我們現在把它改爲999,實驗結果如下:
由上圖可以看出,這時兩種方法的處理結果幾乎沒有任何差別!
結論:
1、立體匹配中視差範圍導致的邊緣信息丟失應當主要通過代價懲罰來實現,即在計算costmatrix時,給超出參考圖像範圍的視差賦以很大的代價。如果匹配算法(如本文采用的SGM算法)中每個像素的代價互相不獨立,那麼這一處理方法不僅是充分條件也是必要條件!
2、在選擇視差時,從所有視差範圍中選擇最優值或從非超出圖像範圍的視差中選擇最優值存在差別,但是在考慮了上述1之後,差別幾乎完全消除。
3、當然,最好的方法是結合兩者,在考慮了1所述的代價懲罰之後,繼續採用本文所述的縮小視差搜索範圍的方法理論上仍然由於無差別的搜索方法,不僅是計算結果,而且GetMin計算耗時也會降低。