1. 程式人生 > >雙目立體匹配 等 演算法 論文 綜述

雙目立體匹配 等 演算法 論文 綜述

雙目立體匹配 等 演算法 論文 綜述

本文GITHUB

雙目立體視覺技術實質就是模擬人的雙眼視覺處理系統來處理通過攝像機採集所
獲取的影象,它利用兩臺或多臺攝像機在一定約束條件下采集同一場景的影象,對採集
到的影象進行資訊提取和整合,最終恢復影象中場景的三維資訊。 

基於雙目視覺的立體匹配演算法研究涉及模式識別、人工智慧、機器視覺、計算機圖
形學等領域的許多相關複雜的研究課題。隨著許多著名專家學者對此問題不斷深入地研
究,立體匹配演算法的精度越來越高,實時性越來越好。

kitti雙目演算法評測

Middlebury Stereo Evaluation - Version 2 演算法評測

立體匹配的研究背景以及意義

立體匹配導論

三維重建技術概述 pcl 點雲配準

三維重建基礎 背景意義 雙目立體視覺 tof 結構光

機器人視覺技術中所涉及的立體匹配通常是指應用於機器人立體視覺系統 
中的一項關鍵技術,是指採用行之有效的方法來分析從不同的視角條件下獲取 
的目標物體的左右影象(影象對)之間的一致性或相似性,並識別出左右影象 
(影象對)間的對應點或同名點; 立體匹配技術都是指應用於機 
器人雙目立體視覺系統中的。

當三維空間場景中的標定物被投影為二維影象時,二維影象資訊丟失了標定物的深度資訊 z,
立體匹配就是要恢復物體的深度資訊 z,它是模擬人的雙眼感知外部事物的過程。
具體來講,立體匹配是對所選影象對中的影象特徵點的計算,來建立不同影象特
徵空間點中的畫素對應關係。換句話說,就是將世界座標系中的空間特徵點與影象座標
系中相對應的影象特徵點進行一一對映,經過匹配演算法等處理計算出空間特徵點的三維
座標,最終獲得其對應的視差圖。在視差圖中,所得的是影象某一點以畫素為單位的視
差值,它一般是一個整數估計值,由是差值就可得到場景的深度資訊。 


根據採用最優化理論方式的不同,立體匹配演算法又分為基於區域性的立體匹配演算法和基於全域性的立體匹配演算法。
基於區域性的立體匹配演算法的核心在於匹配代價的計算和代價聚合階段。
基於全域性的立體匹配演算法在視差計算階段處理演算法中的大部分計算問題,最終得到的視差圖精準度更高,
基本上滿足人們在實際生產應用中對匹配精度的要求

全域性

基於全域性的立體匹配演算法使用全域性約束來解決由於遮擋或重複紋理造成的畫素誤
匹配問題,是基於優化理論方法估計視差值。全域性匹配問題通常被描述為能量最小化問
題,在其建立的能量函式中,除了資料項之外,還有平滑項。資料項主要是測量畫素之
間的相似性問題,而平滑項是平滑畫素之間的視差關係,保證相鄰畫素之間視差的平滑
性.基於全域性的立體匹配演算法需要構造一個能量函式,其形式一般為:

E = Edata + Esmooth

其中資料項 Edata 描述了匹配程度,平滑項 Esmooth體現了場景中的各種約束。

基於動態規劃的立體匹配演算法

全域性立體匹配演算法中動態規劃演算法是使用比較多的一種經典演算法,
傳統的動態規劃立體匹配演算法基於極線約束,
在每條極線上面運用動態規劃方法來尋找最佳匹配點,
並通過動態尋優的方法來尋求全域性能量最小化,得到視差匹配圖。
但由於只是掃描了水平極線上畫素點,導致視差圖的條紋現象十分明顯。

KunpengLi通過先提取影象中的特徵點,然後將特徵點用最近鄰搜尋演算法進行匹配的
方法,以緩解傳統的動態規劃演算法引起的橫條紋效應;為了更加高效的利用動態規劃立體匹配
演算法,CarlosLeung提出了一種快速最小化方案,通過使用迭代動態規劃演算法來進行立體匹
配,該演算法對行和列進行迭代以達到實現快速立體匹配的目的;TingboHu考慮到動態規劃
匹配演算法對影象邊緣不能有效匹配的問題,將單一的極線搜尋改進成單向四連線樹的匹配算
法,並針對SDFC樹設計了快速動態規劃優化方法,這樣可以在有效的提高匹配精度的同時,
將計算複雜度降低到傳統動態規劃演算法的1/12。

基於圖割法的立體匹配演算法

圖割法是一種能量優化演算法,通過一個無向圖來表示要分割的影象,並利用Ford和Fulk-
erson的最大流-最小割理論求出最小割,也就是最優的影象分割集合,
通過該方法可以很好的解決動態規劃引起的條紋現象,但是缺點是時間複雜度比較大。
顏軻先將影象進行分割並建立立體匹配的馬爾科夫有隨機場模型,然後通過約束條件
保留分割的資訊,提高了匹配的精度;Lempitsky通過將影象進行最優分割,然後對分割後
的影象進行分別計算,最後將結果進行結合,確保準確率不會下降的情況下,大大提高圖割法的執行速度.

基於置信度傳播的立體匹配演算法

置信度傳播的立體匹配演算法由馬爾科夫隨機場模型組成。其將畫素點作為網路傳輸的節點,
每個節點包含資料資訊和訊息資訊兩種,分別儲存畫素的視差值和每個節點的資訊值。
置信度傳播演算法通過畫素在四鄰域網格上進行,在匹配的時候設定編號的模型,
通過對編號相同的點進行搜尋。它的訊息值是自適應的,在低紋理區域能夠將訊息傳播到很遠。
雖然匹配的精度提高了,但由於單個畫素點容易產生誤匹配,並且進行的是全域性影象畫素的搜尋,
演算法時 間複雜度非常大。因此如何快速有效的運用該演算法也成為了研究的熱點。

區域性

基於區域性的立體匹配演算法採用區域性優化的理論方法進行畫素視差估計,研究的重點
在於匹配代價的計算和匹配代價的累積上。它是在最大視差的範圍內找出匹配代價最小
的畫素點作為目標匹配畫素,利用區域性資訊求出匹配代價最小的畫素點從而計算出視
差。與全域性立體匹配演算法相同,這類演算法是通過尋找能量最小化方法進行畫素視差估計,
但是,在能量函式中只有資料項沒有平滑項。實時立體視覺系統多采用匹配速度較快的
區域性匹配演算法來處理獲得的影象。 
基於區域性的立體匹配演算法主要有 SSD、SAD 等演算法,大致可以分為三類:自適應
窗體立體匹配演算法、自適應權值立體匹配演算法和多窗體立體匹配演算法。
這些演算法都是從鄰域畫素中選擇最佳的支援區域和支援畫素,即儘可能選擇與要計算畫素具有相同真實
視差的畫素點作為其支援畫素,利用支援畫素作為鄰域約束條件,從而得到比較好的局
部視差估計。自適應窗體是窗體在自適應進行變化,包含大小和形狀,針對不同的變化
規則就具有不同的演算法。多窗體匹配演算法,主要是從多個窗體中,按照一定的規則,選
擇最佳的窗體進行視差估計。自適應權值的立體匹配演算法,主要是建立鄰域畫素的真實
支援度關係,根據它們的屬性的不同建立不同的支援度模型,能反映他們之間真實的視
差關係。 

基於區域的立體匹配演算法

基於區域的立體匹配演算法通過確定源影象上一個畫素點,並在該畫素點周圍選取一個子
視窗,然後在目標影象的區域內尋找與該子視窗最為相似的視窗,匹配得到的視窗對應的畫素
點就是該畫素的匹配點。該演算法在時間複雜度上比較小,但是對於弱紋理區域匹配效果不太
理想,受環境影響比較大,比如光照、遮擋等影響。並且在進行立體匹配的時候,子視窗大小的
選擇也成為一個難點。
現在普遍利用視差估計、視窗視差近似等方法獲得具有自適應的視窗,並在此基礎上改進
演算法。曾凡志在自適應視窗的基礎上,採用8個相同的視窗運用並行處理的方法,根據圖
像的平滑情況從8個方向選擇合適的區域,該演算法解決了在低紋理區域容易造成誤匹配的現
象,並且執行時間與傳統時間差別不大;ZF Wang將區域作為匹配的基元,通過引入區域之
間的合作和競爭,採用協作優化模式來最小化匹配成本。

於區域的影象匹配方法能夠直接產生濃密的視差圖,缺點是計算量大,實時性不強;

基於特徵的立體匹配演算法

基於特徵的立體匹配演算法主要利用影象的幾何特徵資訊,根據特徵資訊進行視差的估計。
所以在進行匹配的時候,要先進行特徵點的提取,並根據特徵點建立物體的稀疏三維輪廓,
如果想要稠密的立體圖則需要進行相應的插值演算法。基於特徵的立體匹配演算法更多的強調的是
物體的結構資訊,根據特徵提取的不同,又可以分為基於點特徵的匹配演算法,
基於線特徵的立體匹配等。

基於特徵的影象匹配方法是針對攝像機獲取的影象對中選取特定的特徵點進行匹配,
其優點是匹配速度相對較快,匹配結果的精度也較高,
對於影象對中沒有明顯紋理等特徵的區域容易造成歧義匹配而無法處理;

基於相位的匹配

是利用相位訊號作為匹配基元,它可以精確到對每個畫素的匹配,
經過特殊處理後,一般只能得到空間場景中標定物的大致結構.

基於相位的立體匹配演算法是在頻率區域範圍內對相位訊號進行視差估計,演算法假定
影象對中的對應畫素點附近在其頻率範圍內區域性相位是相等的,從頻率域相位的角度來
進行畫素點視差值的估計。相位訊號在空間域上的平移現象在頻率域中表現為成比例
的相位平移,主要依據是傅立葉平移定理。該類演算法對於各種畸變,如幾何畸變和輻射
畸變等,具有很好的抗干擾能力,所以基於相位的匹配演算法能夠獲得亞畫素級的緻密視
差圖。徐彥君提出了一種基於相位的尺度自適應的立體匹配方法,尺度自適應是一種基
於頻率響應積分面積相關的選擇規則,實現了一種新穎的尺度自適應演算法,對於常見的
“卷積
”問題,採用
“由粗及細
”的逐步求精方法處理,該方法獲得的視差圖有精度高、穩
定性好等優點,且能預測很大的視差範圍。 

經典立體匹配演算法對比表

         立體匹配演算法名稱                 演算法特性
    基於動態規劃的立體匹配演算法      時間複雜度比較低,匹配精度不高,容易出現條紋現象
    基於圖割法的立體匹配演算法        能解決動態規劃出現的條紋現象,邊緣匹配處理比較好,時間複雜度比較高
    基於置信度傳播的立體匹配演算法    收斂性比較差,時間複雜度比較高,對於低紋理問題處理的比較好
    基於區域的立體匹配演算法          時間複雜度比較低,演算法受環境影響比較大,弱紋理問題不能有效解決
    基於特徵的立體匹配演算法          時間複雜度比較低,對於幾何特徵明顯的影象匹配效果比較好

3 個基本問題

1)  匹配基元的選擇:
    選擇合適的影象特徵點、特徵線或特徵區域等作為匹配基元,使匹配結果更準確; 

    匹配基元是指在影象中有明顯特徵的點、線或者特定的區域,它是立體匹配演算法的
    最小匹配單元。由於在雙目立體視覺系統中採集影象階段經常受到攝像機的角度和位
    置、場景紋理的特徵和數量和光照的強弱變化程度等外在因素的影響,因此要在獲取的
    影象對中對所有的畫素點都進行無歧義性的匹配是有難度的。 
    
    前常用的匹配基元有:過零點(zero-crossing)、邊緣輪廓(object  boundaries)、
    線性特徵(linear features)、畫素灰度值等,
    從總體上大致分為:
    點狀特徵、區域特徵和 線狀特徵.
    
    其中,點狀特徵是最基本的特徵基元,所含有效的資訊量相對較少;
    區域特徵基元具有較好的全域性屬性,所含的資訊量較為豐富,能夠簡單描述出事物的大致結構;
    線狀特徵基元是介於兩者之間的。 
    
    點狀特徵基元的優點是對特徵點定位準確、檢測和描述畫素點的資訊更容易,在合
    適的影象中可以採用點狀特徵基元對場景進行三維重建。採用點狀特徵作為基元的演算法
    需要採用比較有力的約束準則及匹配策略來約束畫素點,通常選擇影象中的角點作為點
    狀特徵匹配基元。 


2)  匹配準則:
    將客觀世界中存在的事物固有的屬性作為匹配演算法必須遵循的準則,
    所得結果能夠更真實的反映事物的原貌及特徵; 
    
    極線約束、唯一性約束 、連續性約束 、順序一致性約束
    
3)  演算法結構:選擇或設計合適的數學方法對匹配演算法來說也是非常關鍵的一步,
    直接影響演算法的執行效率。 

相似性測度

立體匹配中的相似性測度是衡量兩幅或多幅影象中,參考影象中的匹配模板與待匹
配影象中區域之間的相似程度的度量,這個測度可以讓我們找到最優的匹配區域。
專家和研究學者對立體匹配問題已研究經,也提出了一些關於相似性測度的標準及方法。
常見的有:最小值絕對差 
SAD(Sum of Absolute Difference)、
最小值平方差 SSD (Sum of Squared Difference)、
互相關 NCC (Normalized Cross Correlation)等多種測度

立體匹配演算法的步驟

在雙目立體視覺中,立體匹配是比較關鍵的部分,也是最困難和最複雜的部分,
其目的就是根據所選相似性測度,在待匹配影象中,找出參考影象某物點的對應匹配點,
建立雙目影象間的特徵對應關係,W此計算二者的視差並恢復影象深度資訊。
立體匹配演算法的研究重點主要在於匹配基元的選擇、相似性測度函式、立體匹配策略和約束準則等。

1)匹配代價計算; 
2)匹配代價疊加; 代價聚合
3)視差獲取;
4)視差細化(亞畫素級)

基於全域性的立體匹配演算法一般不需要進行匹配代價的疊加,
而是利用匹配代價和平滑約束來實現全域性能量最小化,通常不包含第 2步。
而基於區域性的立體匹配演算法是基於矩形視窗滑動的方法,
它以中心畫素點的領域畫素點灰度均值為矩形視窗進行匹配代價的疊加。

1. 匹配代價計算

SD AD Census
C(x, y, z) =L(x +d, y) −R(x, y) 
L 代表雙目立體視覺系統中的左檢視, 
R 為雙目立體視覺系統中的右視
圖, x和 y 分別表示畫素點的座標值,d畫素點的視差值。
經過計算後得到的C 為三維矩陣,我們稱它為視差空間 DSI(Disparity Space Image),

視差空間 DSI 中任意的 d 對應有 x 和 y 的切面,
而該空間中(x, y,d) 的值表示參考影象中點(x, y) 被賦予視差 d 時的匹配代價m(x, y,d) 。

2. 匹配代價疊加/聚合

匹配代價的疊加是基於視窗的代價函式的疊加[7]。
基於區域的匹配演算法它用來增強匹配代價的可靠性,
通常以待匹配畫素為中心點選擇一個矩形區域,將區域內的匹配代價與周圍的匹配代價進行疊加。

根據原始匹配代價不同可分為 SSD(sum  of  squared differences)演算法、
SAD(sum  of  absolute  differences)等。
對於給定支援域的畫素的匹配代價聚集操作可以採用 2D 或 3D 卷積的形式進行.
C(x, y, d) = w(x, y, d) ∗ C0(x, y, d)
其中,C0(x, y, d) 為給定畫素的支援域內某畫素的匹配代價值, 
w(x, y, d) 表示支援域內給定畫素的權值。
C(x, y,d) 為給定畫素的新的匹配代價。

3. 視差獲取

視差的獲取的方法分為兩類,一類是基於視窗的區域性立體匹配演算法,它只需在視窗
的範圍內選擇匹配代價聚集後的最佳點(最佳點的獲取通常採用 SAD 或  SSD 演算法結果 取最小值)作為對應的匹配點(WTA贏者通吃)。

另一類是基於全域性的立體匹配演算法,實質是獲得能量函
數的最小值,演算法先給出一個能量評價函式,然後通過優化演算法來求得能量的最小值,
使能量函式最小的匹配關係即為最終的視差,同時可以獲得每個畫素的視差值。 

區域性匹配演算法只有資料項,並無平滑項。全域性演算法包含 資料項和平滑項。

平滑項分為兩種情況,
一種是極線間平滑性,
另一種是極線方向平滑性,兩者種情況的計算方法相同,
都採用基於鄰域的視差值計算方法,
如極線方向平滑性的計算公式:
Esmooth = sum( ρ(d(x, y),d(x+1, y)) )

在視差圖中存在視差深度不連續的情況,例如場景中的物體與其背景相交的區域。
由於視差深度不連續的情況一般都發生在影象的邊緣區域。如果存在影象中的灰度值變
化較大的區域,通常採用降低平滑代價的方法解決。由於場景中物體與其邊界處通常存
在 視 差 深 度 的 跳 變 , 造 成 視 差 深 度 不 連 續.
ρ(d(x, y),d(x+1, y))
 ====> 改為
 ρ(d(x, y),d(x+1, y)) =  | 0   , d(x,y) = d(x+1,y) ,     視差差1 而 代價相同  平滑處
                         | t   , |d(x,y) - d(x+1,y)|=1    視差差1 而 代價額差1 ,  t為常數
                         | w   ,  其他情況 , w 更加灰度差值大小確定

4. 視差修正

視差獲取及優化步驟中得到的是估計的視差圖,
由於遮擋、噪聲和光強等因素的影響,匹配過程中不可避免的存在誤匹配點。
估計視差圖中存在一些離散的空白畫素,需要對其做進一步修正。 
常用的修正方法有兩種:
    一種是採用左右一致性檢驗的方法,
        該方法的步驟是對兩幅影象中的匹配點分別檢測並進行對比,
        若相同,說明該匹配點視差值是正確的,
        若不相同,則認為該點是誤匹配點並對其進行校正處理。
    另一種是採用平滑濾波的方法,
        常用的平滑濾波是中值濾波,它將視窗內所有畫素的灰度值從大到小排序,將排序後的
        中間值取出替代要誤匹配的資料,讓周圍的畫素值更接近的真實值,從而消除孤立
        的噪聲點,達到視差修正的目的。 

面臨的挑戰

1. 遮擋區域的立體匹配。
2. 弱紋理或重複區域的立體匹配。歧義性(ambiguity)比較大。視差平面集合能近似表示場景的結構。
3. 深度不連續畫素點的立體匹配。物體的邊緣,簡單的推理和插值
4. 照變化引起的立體匹配問題。沒有考慮鏡面反射的情況。
5. 傾斜區域的匹配問題。

影象分割

影象分割(Image segmentation)方法是近年來才引入立體視覺系統中,也是立體匹
配演算法研究中的一個重要的研究方向,影象分割技術在複雜場景的影象識別、影象分析、
影象理解和表達等方面能夠發揮其優勢。影象分割的原理是對攝像機所拍攝場景中的圖
像進行分析,根據一定相似準則分析出影象場景中的一些相類似的特徵點或特徵區域,
再根據一定的約束準則對影象中相似點或相似區域的畫素進行分組並聚合,此時聚合後
的影象上會出現有特殊規律的區域。這些特殊的區域既使後續的影象高階處理(包括
影象識別、影象分析、影象理解和表達等)階段的操作步驟大大減少,又能保持影象結
構特徵的關鍵資訊不丟失。針對立體匹配演算法,將影象分割成一些具有相同特徵的小區
域,而這些區域往往有一個平滑的視差,然後利用上述方法進行匹配就會得到更好的效果。 
研究者和專家們對影象分割技術的研究及方法在一直不斷的探索改進中,
常見的影象分割演算法有
    基於閾值分割、
    基於區域分裂合併、
    分水嶺分割、
    均值漂移(Mean shift)、
    區域生長法、
    基於邊緣檢測的分割 以及
    基於聚類演算法的分割等方法。
應用於立體匹配中的方法也有許多,其中均值漂移演算法和分水嶺分割法在立體匹配方面比較受研究者的青睞。

論文

1. CSCA 2014 多尺度代價聚合

論文: Cross-Scale Cost Aggregation for Stereo Matching

程式碼

參考部落格

立體匹配最基本的步驟

1)代價計算 CC。
   計算左圖一個畫素和右圖一個畫素之間的代價。

2)代價聚合 CA。
   一般基於點之間的匹配很容易受噪聲的影響,往往真實匹配的畫素的代價並不是最低。
   所以有必要在點的周圍建立一個window,讓畫素塊和畫素塊之間進行比較,這樣肯定靠譜些。
   代價聚合往往是區域性演算法或者半全域性演算法才會使用,
   全域性演算法拋棄了window,採用基於全圖資訊的方式建立能量函式。

3)深度賦值。
   這一步可以區分區域性演算法與全域性演算法,區域性演算法直接優化 代價聚合模型。
   而全域性演算法,要建立一個 能量函式,能量函式的資料項往往就是代價聚合公式,例如 DoubleBP。
   輸出的是一個粗略的視差圖。

4)結果優化。對上一步得到的粗估計的視差圖進行精確計算,策略有很多,
例如plane fitting,BP,動態規劃等。

可以看作為一種全域性演算法框架,通過融合現有的區域性演算法,大幅的提高了演算法效果。

論文貢獻

第一,設計了一種一般化的代價聚合模型,可將現有演算法作為其特例。

第二,考慮到了多尺度互動(multi-scale interaction),
     形式化為正則化項,應用於代價聚合(costaggregation)。

第三,提出一種框架,可以融合現有多種立體匹配演算法。

CSCA利用了多尺度資訊,多尺度從何而來?
其實說到底,就是簡單的對影象進行高斯下采樣,得到的多幅成對影象(一般是5對),就代表了多尺度資訊。
為什麼作者會這麼提,作者也是從生物學的角度來啟發,他說人類就是這麼一個由粗到精的觀察習慣(coarse-to-line)。
生物學好奇妙!

該文獻生成的稠密的視差圖,基本方法也是逐畫素的(pixelwise),
分別對每個畫素計算視差值,並沒有採用慣用的影象分割預處理手段,
如此看來運算量還是比較可觀的。

演算法流程

1. 對左右兩幅影象進行高斯下采樣,得到多尺度影象。

2. 計算匹配代價,這個是基於當前畫素點對的,通常代價計算這一步並不重要,
   主要方法有CEN(Census,周圍框,對視窗中每一個畫素與中心畫素進行比較,大於中心畫素即為0,否則為1。從而得到一個二進位制系列),
   CG(Census + TAD(三通道畫素差值均值) + 梯度差值(灰度畫素梯度差值)),
   GRD(TAD + 梯度差值)等幾種,多種代價之間加權疊加

   得到的結果是一個三維矩陣
   左圖 長*寬*視差搜尋範圍
   值為每一個匹配點對的匹配代價

3. 代價聚合,一個領域內的代價合併(聚合相當於代價濾波)
   BF(bilateral filter,雙邊濾波器 ),
   GF(guided image filter,引導濾波器),
   NL(Non-Local,非區域性,最小生成樹),
   ST(Segment-Tree,分割樹,圖論分割樹) 等,

   基於濾波器的方法是設定一個視窗,在視窗內進行代價聚合。
   雙邊濾波器就是對視窗內畫素進行距離加權和亮度加權。 

   後兩種都拋棄了固定視窗模式,
   基於NL的代價聚合是使用最小生成樹代替視窗。
   基於ST的代價聚合是使用分割塊代替視窗。

   分割樹ST代價聚合方法:
        a. 初始化一個圖G(V,E)
           每個畫素就是頂點V,邊(E)是兩個畫素點對之間三通道畫素差值絕對值中最大的那個,作為邊的權值。

float CColorWeight::GetWeight(int x0, int y0, int x1, int y1) const {// 兩個點對
//得到三通道兩個畫素值差值最大的那個通道的差值的絕對值,作為邊測權重
return (float)std::max(
    std::max( abs(imgPtr(y0,x0)[0] - imgPtr(y1,x1)[0]), abs(imgPtr(y0,x0)[1] - imgPtr(y1,x1)[1]) ), 
    abs(imgPtr(y0,x0)[2] - imgPtr(y1,x1)[2])
    );


        b. 利用邊的權值對原影象進行分割,構建分割樹。
           先對邊按權值大小進行升序排列
           判斷邊權值是否大於閾值,大於則不在同一個分割塊,否則就在同一個分割塊
        c. 對整顆樹的所有節點計算其父節點和子節點,並進行排序。
        d. 從葉節點到根節點,然後再從根節點到葉節點進行代價聚合。

4. 多尺度代價聚合
   五層金字塔,利用上述方法對每一層計算代價-代價聚合
   新增正則化項的方式,考了到了多尺度之間的關係

   保持不同尺度下的,同一畫素的代價一致,如果正則化因子越大,
   說明同一畫素不同尺度之間的一致性約束越強,這會加強對低紋理區域的視差估計
   (低紋理區域視差難以估計,需要加強約束才行),
   但是副作用是使得其他區域的視差值估計不夠精確。
   不同尺度之間最小代價用減法來體現,
   L2正規化正則化相比較於L1正則化而言,對變數的平滑性約束更加明顯。

5. 求最優視差值
   贏者通吃:winner-takes-all
   將每一個視差值代入多尺度代價聚合公式,選擇最小的那個代價對應的視差值為當前畫素視差值。

6. 視差求精
    1:加權中值濾波後,進行左右一致性檢測; 
       進行不可靠點檢測,找左右最近的有效點,選視差值較小的那個; 
       然後對不可靠點進行加權中值濾波; 
    2:分割後,進行左右一致性檢測; 
       進行不可靠點檢測,找左右最近的有效點,選視差值較小的那個; 
       然後進行對不可靠點進行加權中值濾波; 
       然後求分割塊的平面引數,對分割塊內的每個畫素進行視差求精。

速度

在“CEN+ST+WM”組合下,
在640p的影象上,執行時間需要6.9s,
在320p的影象上,執行時間為2.1s,
在160p上,需要0.43s。

總結

1)CSCA是一個優秀的立體匹配演算法,它的價效比,綜合來說是比較高的,並且CSCA只是一個框架,
   言外之意,我們可以根據框架的思想自己建立新的演算法,說不定能夠獲取更好的效能。
2)我認為CSCA是一個多尺度的區域性演算法,還不應該歸類為全域性演算法的類別,這種多尺度思想,
   我想在今後的工作中會有越來越多的研究人員繼續深入研究。

2. NLCA 演算法 全域性最小生成樹代價聚合 (變形樹區域性框)

論文:A Non-Local Cost Aggregation Method for Stereo Matching

程式碼

參考

關鍵點

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

避免了局部最優解,找到了全域性最優解。
其實MST就是一種貪心演算法,每一步選擇都是選取當前候選中最優的一個選擇。

從一個頂點開始,選取一個最小邊對應的頂點
從已經選取的頂點對應的連線頂點中選取最小的邊對應的頂點。。。

最小生成樹

prim(普里姆)演算法:

程式碼

原地圖:

修建步驟(從一點向外擴充套件,每次都選最小權重對應的邊):





kruskal(克魯斯卡爾)演算法:

程式碼

修建步驟(每次選出最小的邊,不產生環,直到所有的頂點都在樹上了):






因為支援視窗的辦法,本質上只考慮了視窗內畫素對中心畫素的影響,
視窗之外的畫素的影響徹底忽略,其實想想看,這樣做也沒有什麼不妥,
但是它並不適用一些場合,比如文獻列舉的影象,帶純色邊框的一些影象。

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

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

3. ST(Segment-Tree,分割樹,圖論分割樹)

程式碼

論文

ST(segment tree)確實是基於NLCA的改進版本,
本文的演算法思想是:
    基於影象分割,
    採用和NLCA同樣的方法對每個分割求取子樹,
    然後根據貪心演算法,將各個分割對應的子樹進行合併,
    演算法核心是其複雜的合併流程。
但是這個分割不是簡單的影象分割,其還是利用了最小生成樹(MST)的思想,
對影象進行處理,在分割完畢的同時,每個分割的MST樹結構也就出來了。
然後將每個子樹視為一個個節點,在節點的基礎上繼續做一個MST,
因此作者號稱ST是 分層MST,還是比較貼切的!

演算法是基於NLCA的,那麼ST和NLCA比較起來好在哪裡?
作者給出的解釋是,NLCA只在一張圖上面做一個MST,
並且edge的權重只是簡單的灰度差的衍生值,這點不夠科學,
比如說,當遇到紋理豐富的區域時,這種區域會導致MST的構造出現錯誤
,其實想想看的確是這樣,如果MST構造的不好,自然會導致視差值估計不準確。
而ST考慮了一個分層的MST,有點“由粗到精”的意思在裡面。

ST是NLCA的擴充套件,是一種非傳統的全域性演算法,
與NLCA唯一的區別就在於ST在建立MST的時候,引入了一個判斷條件,使其可以考慮到影象的區域資訊。
這點很新穎,說明作者閱讀了大量的文章,並且組合能力驚人,組合了MST和基於圖表示的影象分割方法。
它的執行時間雖然比NLCA要大一些,但是相比較全域性演算法,速度已經很可以了。
但是ST也有一些缺陷,首先,演算法對影象區域資訊的考慮並不是很嚴謹,
對整幅影象用一個相同的判斷條件進行分割,分割效果不會好到哪裡去,
並且基於實際資料實測,會發現視差圖總是出現“白洞”,說明該處的視差值取最大,
這也是區域資訊引入的不好導致的。雖然在細節上略勝於NLCA,但是演算法耗時也有所增加。
上述原因也是本文引用率不佳的原因。

4.上下采樣 視差精細化

上下采樣

upsampling的意思是上取樣,是影象方面的概念,之所以要用NL作上取樣,主要原因還是速度問題,
往往stereo mathcing方向的演算法的時間複雜度都比較高,於是為了提高速度,
考慮在原影象的下采樣影象計算視差圖,然後在對低解析度的視差圖進行上取樣成為高解析度的視差圖,
這是一個折中的方法,效果肯定沒有直接在高解析度影象上生成視差圖好,但是速度卻能夠提高几倍不止。

一般的上取樣方法相信大家都比較熟悉,最基本的思想就是根據當前畫素鄰域內的畫素值進行估計,比
如說權值濾波,也有的文獻是基於3Dtof相機獲得低解析度視差圖和高解析度的彩色圖,然後在進行上取樣操作。
這篇文獻就是基於權值濾波的思想,將NL應用在了視差圖上取樣方向,其流程圖如下所示: 

原影象——————————>下采樣————————>計算視差圖—————|
     |                                       |
     |________-> 計算最小生成樹————————————————>根據 最小生成樹 進行上取樣

texture handing

texture handing一般翻譯成為紋理抑制或者是紋理處理,指的是對於具有複雜的紋理區域
,一般要在邊緣保持的同時模糊區域內的紋理,這是一個影象處理上經常用的方法,
作者在這上面也下了功夫,目的還是估計視差圖,因為NLCA演算法對於帶噪聲影象效果很差,
尤其是在其紋理豐富區域,所以催生了這一塊應用。

視差圖求精 refinement

視差圖求精是重頭戲,由於遮擋,光照等原因,求出來的視差圖往往部分點視差不正確,
需要對視差圖重新求精,是stereo matching必不可少的一步,NL同樣在這裡有應用,
它事先利用left-right-check對左右視差圖進行處理,得到視差圖的穩定點和不穩定點,
同時直接在左視差圖上定義新的代價值,再同樣利用原圖所得的MST,
對所有畫素點重新進行代價聚合,最後利用”勝者為王”演算法估計新的視差。

5. DoubleBP 分層 Belief Propagation 置信度傳播演算法 由粗到精的思想 全域性立體匹配演算法的代表性作品

論文

參考

DoubleBP是一個立體匹配全域性演算法,
來自於論文《Stereo Matching with Color-Weighted Correlation, Hierarchical Belief Propagation, and Occlusion Handling》
DoubleBP共有兩大貢獻,一個是考慮到了影象的穩定點與非穩定點,
然後根據低紋理區域和遮擋區域內的非穩定點來不斷的更新能量函式中的資料項,
最終使得視差能夠正確地從穩定點傳播到非穩定點(這點和tree filter那篇部落格很像哦)。
另一個就是融合了當前在立體匹配領域中幾個不錯的方法。所言不虛,因為在DoubleBP之前,
所有的全域性演算法都沒有考慮在穩定點上做文章,其實我們想想看,
穩定點肯定靠譜一些,放棄不穩定點直覺上是正確的。

DoubleBP是絕對的全域性演算法,其重點放在了視差圖的迭代求精上,
靠的就是不斷更新能量函式,然後利用HBP不斷的求解。全域性演算法耗時嚴重,
作者故意在設計演算法的時候,使之更加適應平行計算。
這樣也具有一定的實際應用能力,但是很可惜,就算在FPGA上平行計算,仍舊達不到實時。

結論

演算法後續採用了“亞畫素求精+均值濾波”的辦法進一步提升了效果,我們會發現對於低紋理區域的黑色斑塊,
通過亞畫素求精竟然全部消失,其實每個演算法中都可以利用這種方法進行後處理,
但是我在其他演算法中得不到太明顯的效果,遠低於文字的提升,想來想去可能是由於經過迭代求精之後,
DoubleBP得到的畫素代價序列更加靠譜,這樣求取的區域性極值自然就更加精確,反之,
如果求得的代價序列並不理想,那麼經過二次多項式擬合之後,求取的極值可能會起到相反的作用。
當然這只是我的實驗效果的猜想,還請大家指教。

這是一篇很牛的文章,應該可以被稱為全域性立體匹配演算法的代表性作品,用工程組合的方法,
將多個模組組合起來,達到精確的估計效果,引用率很高,我看完這篇文章之後,
最大的感覺就是在立體匹配這個領域,複雜的“一步到位”的方法,可能並不適用,
還是工程組合的方法適合這個領域,這篇文章提出的畫素分類,視差值從穩定點傳遞到不穩定點的思想,
被多篇論文所採用,難怪作者認為這才是他最大的貢獻。

6. 置信度傳播演算法(Belief-Propagation)與立體匹配

參考

置信度傳播演算法(Belief-Propagation)在立體匹配。
現有的全域性立體匹配演算法,很大一部分都是基於Belief-Propagation來進行視差求精,
二者天然的紐帶就是,一幅圖加上對應畫素標籤就可以看成是一個馬爾科夫場,
只要有馬爾科夫場,很自然地就可以利用BP演算法進行優化求解。
馬爾科夫場是一種概率圖模型,圖中的節點就是畫素,圖中的隱節點就是標籤,
在Stereo-Matching裡面,標籤就是畫素的視差值,視差值總是會有一個範圍,
BP就是在這個自定義空間中找到使得全域性能量最小的那些視差值。


一般的非全域性演算法,在  代價聚合值 求出來之後便戛然而止,
直接來一個WTA(贏者通吃),就算是把視差求出來了,如果代價聚合準確還可以,
如果不準,求出來的視差圖“慘不忍睹”,
全域性演算法就是在代價聚合的基礎上加了一個雙保險,
不單單希望代價聚合值的和最小化,
還要考慮影象的區域性,
桌面肯定是一個區域,
一個人肯定是一個區域等等等等,
它們的視差應該差不多,
所以直接利用這個數學模型來達到這種需求。

立體匹配要解決的主要問題有兩個,
    一個是低紋理區域的視差估計,
    一個是深度不連續區域的視差估計,也就是遮擋區域,
作者認為深度不連續區域往往就是顏色不連續區域(這點多篇論文都這樣提到過,SegmenTree,DoubleBP等等)。
而BP有兩大優點,
   第一個是資訊不對稱,
   第二是BP的訊息值是自適應的,
第一點我也沒有徹底弄明白原理,關於第二點,BP往往在低紋理區域中能夠將訊息傳遞到很遠,
但在深度不連續區域卻馬上就會停止傳遞,所以說它是自適應的。

7. Spatial-Depth Super Resolution for Range Images 對深度圖進行上取樣

論文

Range Images 它的意思就是深度影象,並且特指通過深度相機(例如,TOF相機)採集到的深度影象。
給定一個低解析度視差圖,通過本文提出的演算法,將低解析度視差圖上取樣成為高解析度視差圖。
為什麼要將低解析度深度圖上取樣為高解析度深度圖,原因其實很簡單,就是為了一個速度。
想得到高精度的視差圖依賴於複雜的全域性演算法,非常耗時,距離實時應用還有很大的距離,
於是作者另闢蹊徑,直接通過對低解析度深度圖上取樣,達到精度還不錯的高解析度視差圖,這是一個具有開創性的想法。

演算法思想

本文的演算法思想可以用一句話概括:結合硬體採集的低解析度視差圖以及高解析度原圖,
利用雙邊濾波對低解析度視差圖進行上取樣,得到與原圖同等解析度的視差圖。

步驟:
1). 我們先對低解析度視差圖進行上取樣,當然,這樣的視差圖一定很挫。

2). 我們再根據上取樣得到的大視差圖,計算代價體(cost volume),其實就是代價計算項(參考DoubleBP)。

3). 根據得到的cost volum,利用雙邊濾波對其進行處理,得到更好的cost volum。

4). 基於更好的cost volum,用WTA(牛逼哄哄的勝者為王演算法),得到視差圖。

5). 還沒完,對得到的視差圖進行亞畫素求精。

6). 盡情的迭代,到爽為止!!!

雙邊濾波

濾波演算法中,目標點上的畫素值通常是由其周圍的一個區域性區域中的畫素所決定,
例如可以基於畫素之間的灰度值或位置關係。
影象的濾波演算法有很多種,高斯濾波,gabor濾波等等,
每種都有自己的特點,例如最簡單的高斯濾波,其只考慮了影象的空間位置資訊,
根據畫素與中心畫素的距離遠近,計算畫素的權值,高斯濾波對影象所有區域都“同等對待”,
模糊了紋理的同時也模糊了邊緣。而雙邊濾波卻不是這樣,
它不僅考慮到了畫素之間的位置關係,還考慮到了畫素之間的顏色差異,

這樣就使得雙邊濾波是一種“邊緣保持(Edge-Preserving)”的濾波方法,

僅對非邊緣區域進行較大程度的模糊,針對邊緣由於考慮到了畫素之間的顏色的差異,
和邊緣顏色相近的畫素能夠得到較大的權值,和邊緣顏色不相似的畫素只能夠獲得較小的權值,
自然使得邊緣一側的畫素權值較小,對邊緣的干擾作用也隨之減弱。
濾波之後,邊緣的顏色還是之前的顏色,只有微微的模糊。

亞畫素求精

但是本文的重點不是這裡,重點在求出視差值之後的“亞畫素求精”,
大部分的立體匹配演算法都可以進行亞畫素求精,
至於為什麼要進行亞畫素求精?
那是由於整數級別的視差值計算出來的深度值不會精確到哪裡去(用公式算算就知道了,如果基線距離過大),
如果我們想求取精確的深度資訊,那麼亞畫素求精是最簡單有效的方法。

本文采用的方法就是傳統的 二次多項式插值,這裡很有意思。
    因為我們得到的視差值都是離散的,並且是整數,舉個例子,
    如果我們通過WTA得到一點的視差值是10,以及對應的代價值30,
    我們同時也可以得到視差9的代價值(假設是40),
    視差11的代價值(假設為50),
    我們可以利用二次多項式函式(如下所示)來計算浮點型的視差值.
    
    f(x)=a*x^2 + b*x + c
    xmin = -b/2a
    引數有a,b,c共三個,所以我們要想求解這三個引數,就需要3個方程,
    根據上面的(10, 30)、(9, 40)、(11, 50),我們就可以求解出這個多項式的最小值,
    這個最小值就是所謂的 多項式差值,最小值的公式如下:
    
    xmin = d - ( ( f(d+) - f(d-) ) / ( 2 * (f(d+) + f(d-) - 2*f(d) ) ) )
    d=10  ; f(d) = 30
    d+ = 11 ; f(d+) = 50
    d- = 9  ; f(d-) = 40
    這就是亞畫素求精的全部內容,這樣的方法可以應用在任何一種立體匹配演算法上,
    非常通用,我認為這一步是非常重要的,尤其在我們要基於視差圖進行進一步分析的時候,
    整形的資料往往誤差太大,果斷弄成浮點型的資料。文中稱為離散和連續,一個意思。
    
    在計算完每個畫素點的亞畫素之後,通常還要進行均值濾波,在9*9的視窗中。

8. AD-Census,作者與SegmentTree是同一人

論文 On Building an Accurate Stereo Matching System on Graphics Hardware

參考

特點:
    1. 適合並行;
    2. 基於特徵融合的代價計算;
    3. 基於自適應區域的代價聚合;

1. 適合並行

這點是相當吸引人的,也是作者的出發點,眾所周知,全域性演算法不適合並行,為啥?
因為建立了複雜而且漂亮的能量函式,需要用同樣複雜而且漂亮的迭代優化演算法求解,
可惜的是這樣的優化演算法如果想並行處理難度太高,並且也快不到哪裡去,
所以導致現有很多全域性演算法無法得到應用,我們只能眼睜睜的看著middlebery上的頂級演算法
,一邊淌著哈喇子,一邊望洋興嘆。不過本文關於並行這塊的解釋就不多說了,
不親自動手實現是無法體會出來並行帶來的快感。

2. 特徵融合 代價計算(cost initialization):絕對差AD+Census變換演算法

我看過的文獻中,很少有在代價計算這一步中融合多種特徵的,
一般只採用一種特徵而已並且對這塊內容的研究也偏少,作者另闢蹊徑的融合了現有特徵AD和Census,
AD就是最普通的顏色差的絕對值,立體匹配演算法中經常使用,
其公式如下所示:
AD:絕對差值,三通道畫素絕對差值均值。
reference image一般翻譯成為參考影象,
base image和guidance image就是reference image, 一般被翻譯成為基準影象,
match image一般被翻譯成為匹配影象,那麼參考影象和匹配影象的關係是什麼呢?
我真的好想說,不就是一個代表左圖一個代表右圖嘛!

立體匹配的流程,
    a. 左圖和右圖先做代價計算,怎麼做的呢,
        遍歷左圖中的每一個畫素,
        然後根據 視差範圍 中的每一個視差值,
        來找到對應 右圖的畫素,
        然後 根據 公式計算 代價,
    b. 然後再針對左圖,遍歷每個畫素進行代價聚合計算,這就是重點,如
        果你在左圖上計算代價聚合,那麼左圖就叫做參考影象,右圖就是匹配影象,反之,反過來叫。

Census 代價 與 AD 代價融合

程式碼

Census指的是一種代價計算方法,其屬於非引數代價計算方法中的一種(另外一個代表是rank transform),
準確的說它是一種距離度量,它的計算過程的前半部很像經典的紋理特徵LBP,
就是在給定的視窗內,比較中心畫素與周圍鄰居畫素之間的大小關係,
大了就為1,小了就為0,然後每個畫素都對應一個二值編碼序列,
然後通過 漢明距離(類似字串編輯距離)來表示兩個畫素的相似程度。

Census保留周邊畫素空間資訊,對光照變化有一定魯棒性。
Census具有灰度不變的特性,所謂灰度不變指的就是畫素灰度值的具體大小和編碼之間的相關性不是很強,
它只關心畫素之間的大小關係,即使你從5變成了10,但只要中心畫素是15,就一點事情都木有,
這樣的性質我們肯定會想到它一定對噪聲和魯棒,的確是這樣。
但是它的缺點也很明顯,按照文章的說法, 對於結構重複的區域這個特徵就不行了,那基於顏色的特徵AD呢?
它是對顏色值很敏感的,一旦區域內顏色相近(低紋理)或者有噪聲那麼掛的妥妥的,
但是對重複結構卻不會這樣,基於這種互補的可能性,作者嘗試將二者進行融合,
這是一種很簡單的線性融合但是卻取得了很好的效果:
f(cost,引數) = 1 - exp(- cost/引數); 畫歸到 0~1, 之後再相加。

兩種計算方法得到的取值範圍可能會相差很大,比如一個取值1000,
另一個可能只取值10,這樣便有必要將兩者都歸一化到[0,1]區間,
這樣計算出來的C更加有說服力,這是一種常用的手段。
論文中給出了AD,Census,AD-Census對一些細節處理的效果圖,
可以看得出來各自的優缺點,第一行是重複紋理區域,
第二行是低紋理區域,白色與黑色都說明計算的結果很差。

AD往往比Census在物體邊緣上的處理更好一些,邊緣明顯清晰,但是AD得到的噪聲太多,並且在低紋理區域,
AD出現了很大的空洞,在這一點上Census做的相對較好,
AD-Census在物體邊緣上的效果是二者的折中,但噪聲更少,整體效果更加理想。

// 對應畫素差的絕對值 3通道均值  Absolute Differences
float ADCensusCV::ad(int wL, int hL, int wR, int hR) const
{
    float dist = 0;
    const Vec3b &colorLP = leftImage.at<Vec3b>(hL, wL);// 左圖對應點 rgb三色
    const Vec3b &colorRP = rightImage.at<Vec3b>(hR, wR);// 右圖對應點 rgb三色

    for(uchar color = 0; color < 3; ++color)
    {
        dist += std::abs(colorLP[color] - colorRP[color]);// 三色差值 求和
    }
    return (dist / 3);//3通道均值
}

// census值
float ADCensusCV::census(int wL, int hL, int wR, int hR) const
{
    float dist = 0;
    const Vec3b &colorRefL = leftImage.at<Vec3b>(hL, wL); // 左圖 中心點 RGB顏色
    const Vec3b &colorRefR = rightImage.at<Vec3b>(hR, wR);// 右圖 中心點 RGB顏色

    for