Stereo Matching文獻筆記之(二):《A Non-Local Cost Aggregation Method for Stereo Matching》讀後感~

最近一直在做stereo matching方向的研究,仔細研讀了包括局部算法,全局算法,以及半全局算法三個方面的算法文獻,對該方向有了比較清晰的瞭解,這次分享一下我對楊慶雄的經典文獻《A Non-Local Cost Aggregation Method for Stereo Matching》(簡稱NL算法)的一些理解。


之所以想分享這篇文獻,是因爲文獻明確拋棄了support window的算法思想,指出support window在視察估計上普遍具有陷入局部最優的缺陷,創新性的提出了基於全局最小生成樹進行代價聚合的想法,我覺得這個想法非常厲害,全局算法早就有了,但是往往是基於複雜的優化算法,重心放在了視察粗估計和迭代求精兩步,十分耗時,而最小生成樹,可以天然地建立像素之間的關係,像素之間的關係一目瞭然,可以大幅減少代價聚合的計算時間,文獻表述爲線性搜索時間。計算聚合代價的過程不需要迭代,算法時間複雜度小,符合實際應用的需求,所以NL算法已經獲得了不錯的引用率。在後續算法中得到了很多改進,一些好的立體匹配算法,如CSCA,ST等都是基於NL進行了改進,以下部分着重說說我對NL核心部分,最小生成樹(MST)的理解。

(轉載請註明:http://blog.csdn.NET/wsj998689aa/article/details/45041547, 作者:迷霧forest)


1. 算法思想

本文的算法思想,是放棄原有的基於支持窗口的方式,採用基於全局MST的方式,構建代價聚合公式。因爲支持窗口的辦法,本質上只考慮了窗口內像素對中心像素的影響,窗口之外的像素的影響徹底忽略,其實想想看,這樣做也沒有什麼不妥,但是它並不適用一些場合,比如文獻列舉的圖像,



左上角的圖像就是原始灰度圖像,這個時候我們就會發現,這幅圖像中像素與像素之間的關係用支持窗口來處理明顯不靈,比如說周圍框狀區域的任何一個像素,肯定與框狀區域內部的像素的深度信息一致,而與中間區域的像素不同。或者說,如果單考慮顏色信息,紅框內的像素關係最大,如何表徵這樣的關係就是一個問題。很遺憾,我們不能事先提取出這樣的區域,因爲圖像分割真的很耗時,並且不穩定,這就是作者的牛逼之處,他想到了MST可以表示這種像素關係,於是採用像素之間顏色信息作爲“邊權值”,進一步構建MST。


這裏還要仔細說一下,這幾幅圖代表的其實是全圖像素點對(0,0)點的權值大小,大家可以看一下論文裏面BF的公式,也就是b、c兩幅圖,文章把參數看成了窗口的大小標誌,如果參數足夠大,其實exp裏面的值就是0,空間信息的作用完全消失,這個時候就要看像素顏色差的作用了,我想這一點給作者一個提示,那就是BF中空間信息的考慮可能是多餘的!!!於是作者只利用顏色差信息來構建MST。


MST指的是最小生成數,全稱是最小權重生成樹。它以全圖的像素作爲節點,構建過程中不斷刪除權值較大的邊。注意,是全圖所有的像素,然後採用kruskal(克魯斯卡爾)算法或prim(普里姆)算法進行計算。這樣便得到了全圖像素之間的關係。然後基於這層關係,構建代價聚合,這便是文章標題Non-Local Cost Aggregation的由來。


通過MST計算權值的效果如上圖第二行所示,紅色代表高權值,藍色代表低權值。明顯發現MST有效的表徵了像素對像素的影響。代價聚合公式如下所示,具體的符號含義,這裏就不說了,相信做過立體匹配的童鞋一眼就會看明白。



2. 算法核心

我當時看到這裏,頓時產生了一個疑問,這樣做的代價聚合考慮到的是全部的像素,那麼耗時豈不是很驚人?因爲我是逐像素計算視差的啊,每個像素都要考慮周圍所有的像素。。。。這時間複雜度可能太恐怖點了吧!?果不其然,我自己試了一下這種最粗暴的方式,2分鐘都算不完一幅圖。


請原諒我的愚鈍,作者既然考慮到了MST,說明MST的性質也要被很好的利用,我總結MST在計算效率上的一句話是:MST可以將計算範圍從所有節點縮小到父節點和子節點上。因爲人家是一棵樹嘛!比如說,全圖320*240,也就是76800個節點,而父節點只有一個或多個子節點(其實最多隻有3個,因爲是4鄰居),算法效率可想而知。下文就說一下我對算法過程的理解。


2.1 leaf-to-root


假設上圖是一個MST,邊上的數值代表權重,此時如果計算的是V4的代價聚合,那麼很容易,直接計算子節點(V3, V4)的代價聚合值與各自邊緣的乘積集合,因爲V4是根節點,不需要考慮父節點的影響。公式如下所示,



箭頭向上代表從葉子到當前節點的代價聚合值,爲何只需要考慮子節點,而不考慮孫子節點,重孫子節點等等的原因就是由於在我們實際計算的時候,要從葉子節點一層一層往上算,這樣就會利用樹的特性,子節點的代價聚合值已經包含了孫子節點等等對我自己的影響。有點一本萬利的感覺。。。


2.2 root-to-leaf

但是這樣做是不夠的,上面的V4沒有父親節點,屬於特殊情況,如果我們要計算V3的代價聚合值呢?顯然只考慮V1和V2是不夠的,還得考慮V4的影響。也就是從上到下的影響。如圖所示:

注意和上一幅圖的區別,這個時候我們完全可以假設V3爲根節點,它的父節點也變爲他的子節點,這樣的話,可以利用同樣的辦法,將V4的代價聚合值乘以它的權重一起再加進來。但是,這裏還是有區別的,因爲V4的代價聚合值已經考慮到了V3的影響,所以必須事先將V4的代價聚合值減去V3的代價聚合值纔可以。公式如下所示:



其中,從上向下的代價聚合值就是最終的代價聚合值,同上一步一樣的方式,要從上到下一層一層的計算代價,這樣便可節省很多計算量。

2.3 時間複雜度

由於MST的性質,使得原本對全部像素的比較,只需要對父節點,子節點的比較即可,每次計算代價聚合值,從上述公式看來只需要一次加法,一次減法和三次乘法,這樣便極大提高了速度,同時又考慮到了全局像素的影響。在middlebury上數據集的平均計算時間僅爲90毫秒。

作者提供了文獻和源代碼的同時,也給出了一個ppt,就在作者的主頁上,對其算法原理仍舊迷惑的童鞋可以下載去看看。

3. 實驗效果&結論

實驗效果就不介紹了,論文上一目瞭然,這篇文章提供了源碼,大家可以跑跑看,我這邊針對一般場景進行了測試,效果還是很不錯的,經過進一步優化可以進行實際應用。這篇文章比較經典,一些後續的算法就是對其進行了改進,比如說分割樹算法《Segment-Tree based Cost Aggregation for Stereo Matching》,將圖事先進行區域分割,再在各個區域中計算MST,在生成MST的過程中,考慮到了顏色值與距離作爲邊緣權值,取得了比NL更好的效果。

4.後記

今天突然看到網上另外一篇關於本文的讀後感,發表的時間是在今年的3月份,寫的不錯,我們二人文章是從不同的角度闡述,附上連接,感興趣的朋友不妨結合着看一看,作者最後提出了兩個代碼問題,我認爲是這樣的:爲了避免一棵樹出現很長的情況,作者在代碼中利用路徑壓縮的方法連接不同子樹,如果兩顆子樹的高度相同,那麼一顆子樹的高度只加上1,另外一顆子樹的根節點作爲子節點;如果二者高度不同,那麼一定是高度小的樹作爲高度大的樹的子樹,小樹的根節點作爲大樹根節點的子節點,這樣合併之後的樹的高度就不會變,非常的巧妙。但這些代碼細節在論文中是不會被提及的,所以代碼非常值得仔細研究評估。
(《基於MST的立體匹配及相關改進(A Non-Local Cost Aggregation Method for Stereo Matching)》,http://www.bubuko.com/infodetail-668886.html)

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