最近一直在做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是根節點,不需要考慮父節點的影響。公式如下所示,
箭頭向上代表從葉子到當前節點的代價聚合值,爲何只需要考慮子節點,而不考慮孫子節點,重孫子節點等等的原因就是由於在我們實際計算的時候,要從葉子節點一層一層往上算,這樣就會利用樹的特性,子節點的代價聚合值已經包含了孫子節點等等對我自己的影響。有點一本萬利的感覺。。。