雙目立體匹配經典算法之Semi-Global Matching(SGM)概述:匹配代價計算之Census變換(Census Transform,CT)(附計算C代碼)

  基於互信息的匹配代價計算由於需要初始視差值,所以需要通過分層迭代的方式得到較爲準確的匹配代價值,而且概率分佈計算稍顯複雜,這導致代價計算的效率並不高。學者Zabih和Woodfill 1 提出的基於Census變換法也被廣泛用於匹配代價計算。Census變換是使用像素鄰域內的局部灰度差異將像素灰度轉換爲比特串,思路非常簡單,通過將鄰域窗口(窗口大小爲n×m,n和m都爲奇數)內的像素灰度值與窗口中心像素的灰度值進行比較,將比較得到的布爾值映射到一個比特串中,最後用比特串的值作爲中心像素的Census變換值Cs,如公式1所示:

式1

其中,n’和m’分別爲不大於n和m的一半的最大整數,爲比特位的逐位連接運算,ξ運算則由公式2定義:

式2

基於Census變換的匹配代價計算方法是計算左右影像對應的兩個像素的Census變換值的漢明(Hamming)距離,即

式3

  Hamming距離即兩個比特串的對應位不相同的數量,計算方法爲將兩個比特串進行亦或運算,再統計亦或運算結果的比特位中不爲1的個數。

  基於Census變換的匹配代價計算方法如圖1所示,

圖1 漢明距離示意圖

  從圖1可以看出,Census變換對整體的明暗變化並不敏感,因爲是比較的相對灰度關係,所以即使左右影像亮度不一致,也能得到較好的匹配效果。

  Census相比互信息還具有並行度高的優點,因爲Census變換值是局部窗口運算,所以每個像素可以獨立運算,這個特性讓其可以很好的設計多線程並行計算模型,無論是CPU並行還是GPU並行都能達到非常高的並行效率。

  在實際匹配過程中,簡單的執行匹配代價計算並不能得到高質量的視差圖,必須經過代價聚合步驟,聚合後的代價能夠更準確地反應匹配相似度,下篇博客中,將爲大家詳解SGM的代價聚合步驟,查看請點擊 >> link

(注:博主已經開始寫SGM編碼博客啦,感興趣的可以關注博客手把手教你編寫SGM立體匹配代碼(基於C++,Github同步更新)

附:
計算Census值及Hamming的代碼:
Census值

uint8 gray_center= img_data[image_y *img_width + image_x];		// 中心像素值
// 遍歷大小爲2csh*2csw的窗口內鄰域像素,逐一比較像素值與中心像素值的的大小,計算census值
uint32 census_value = 0u;
for (sint32 i = -csh; i <= csh; i++) {
	for (sint32 j = -csw; j <= csw; j++) {
		census_value <<= 1;
		uint8 gray = img_data[(image_y + i)*img_width + image_x + j];
		if (gray < gray_center) {
			census_value += 1;
		}
	}
}
census[image_y *img_width + image_x] = census_value;		// 中心像素的census值

Hamming距離

// unsigned to 32bit
//計算hamming距離
uint32 hamDist32(const uint32& x, const uint32& y)
{
	uint32 dist = 0, val = x ^ y;

	// Count the number of set bits
	while (val)
	{
		++dist;
		val &= val - 1;
	}

	return dist;
}

  1. ZABIH R, WOODFILL J. Non-parametric local transforms for computing visual correspondence[M]. 1994: 151-158. ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章