雙目立體匹配 等 算法 論文 綜述 全局局部算法 CSCA NLCA SegmentTree樹 DoubleBP Belief-Propagation AD-Census SGM

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

本文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(int h = -censusWin.height / 2; h <= censusWin.height / 2; ++h)// 窗口 高
    {
        for(int w = -censusWin.width / 2; w <= censusWin.width / 2; ++w) // 窗口 寬
        {// 在指定窗口內比較周圍亮度值與中心點的大小
            const Vec3b &colorLP = leftImage.at<Vec3b>(hL + h, wL + w);  // 左圖 窗口內的點
            const Vec3b &colorRP = rightImage.at<Vec3b>(hR + h, wR + w); // 右圖 窗口內的點
            for(uchar color = 0; color < 3; ++color)
            {
      // bool diff = (colorLP[color] < colorRefL[color]) ^ (colorRP[color] < colorRefR[color]);
      // 左右圖與中心點的大小比較 (0/1),都比中心點小/都比中心點大 乘積就大於0
      // 一個小,一個大乘積就小於0
         bool diff = (colorLP[color] - colorRefL[color]) * (colorRP[color] - colorRefR[color]) < 0;
          // 記錄比較關係也不一致的情況
         dist += (diff)? 1: 0;// 匹配距離用漢明距表示 
// 都比中心點大/小 保留周邊像素空間信息,對光照變化有一定魯棒性
            }
        }
    }

    return dist;
}
// ad + census值 信息結合
float ADCensusCV::adCensus(int wL, int hL, int wR, int hR) const
{
    float dist;

    // compute Absolute Difference cost
    float cAD = ad(wL, hL, wR, hR);

    // compute Census cost
    float cCensus = census(wL, hL, wR, hR);

    // 兩個代價指數信息結合 combine the two costs
    dist = 1 - exp(-cAD / lambdaAD); // 指數映射到0~1
    dist += 1 - exp(-cCensus / lambdaCensus);

    return dist;
}


但傳統Census變換所獲得的像素間關係是基於灰度值的比較,故而Census變換結果 
仍然受光照等外界因素影響[4^6]。尚可可等實驗研究發現HSV色彩空間中,將(S+V)/H 
作爲一個新的參量,該參量對光照等因素具有較好的魯棒性。因此,本文將巧+V)/H引入 
Census變換中代替原有的像素灰度值,可有效降低光照等外界環境的影響。 

3. 自適應區域代價聚合 aggregation 代價聚合(cost aggregation) 動態十字交叉域

一般的代價聚合思想:
    局部算法採用一個固定或者自適應窗口來代價聚合;
        一個領域內的代價合併(聚合相當於代價濾波)
        BF(bilateral filter,雙邊濾波器 ),雙邊濾波器就是對窗口內像素進行距離加權和亮度加權。
        GF(guided image filter,引導濾波器),基於濾波器的方法是設定一個窗口,在窗口內進行代價聚合。
   全局算法採用整幅圖像得到的抽象結構來代價聚合,
        例如MST((minimum spanning tree最小生成樹)、ST(分割樹)馬爾科夫圖模型等等。
        
就是事先確定一個有意義的區域,之後直接在這個區域內進行代價聚合。

ADCensus建立了一個灰常有意思的,工程化的區域結構,分割算法耗時不捨得用,幹
脆我直接用相對暴力的方案對圖像進行分割好了,
看圖說話,下圖就是作者採用的分割方法。

構建動態交叉域:

採用方法的思想很簡單,
當前像素假設是p(水平和垂直十字區域),我對p先進行垂直方向的遍歷,
如果像素q滿足兩個約束,那麼就算同一分割區域,否則遍歷停止,
然後再在得到的N個q和p的水平方向根據同樣的規則進行遍歷,於是就得到了對應的分割區域。
然而,作者從來都沒有說對圖像進行了分割,只是說確定p的cross,其實就是分割的意思。
約束如下所示,這個約束是經過改造過的(
cross region不是作者提出來的,也是引用他人的方法,作者對約束從兩個擴充爲三個),
這麼改的原因是作者考慮到了之前的約束方案會導致將邊緣點也包括進去,
這樣會對邊緣的視差計算十分不利,於是提出了一個更加嚴格的約束形式,
考慮到了相鄰像素色彩上的差異。

水平上臨近點的所有豎直臨近點(或者稱arms)所覆蓋的區域,
與反過來的先豎直後水平所覆蓋的區域本就是兩回事,不是一定會相同的。

計算每個像素的上下左右邊界,在進行代價聚合時,若採用先水平後垂直的方式,
就是對邊界內垂直線上的每個像素的水平邊界先加和,
然後再把中心點像素垂直線上的像素進行加和?


代價聚合的目的:減少初始代價中的匹配模糊和圖像噪聲的影響。
代價聚合的依據:相似的區域具有相似的視差;
常見代價聚合方法:圖像分割,自適應權重,自適應窗口等。
這篇文章採用動態交叉域的代價聚合方法:
分爲兩步:交叉域構建,代價聚合;
代價聚合規則:計算顏色差值和空間距離,通過3規則構建交叉域;通過4次迭代進行代價聚合。
優點:對大的少紋理和視差不連續區域減少匹配誤差。

代價聚合:

迭代4次的正確理解爲:對所有像素點水平邊界計算一次cost累加(1次完成);
對所有像素點垂直邊界計算cost累加一次(2次完成);
對所有像素點垂直邊界計算cost累加一次(3次完成);
對所有像素點水平邊界計算一次cost累加(4次完成)。 
發現兩次cross-based region 形狀是不一樣的。
所以爲什麼改變聚合方向順序會有不一樣的結果。

3. 視差優化(disparity computation):掃描線視差優化 ScanlineOptimization

目的:選擇最佳的視差範圍,生成視差圖。
4方向的掃描線優化策略:適合並行計算,減少匹配模糊。

Scanline方法文章改進的是smi-global matching的能量函數求解方法,
只是將原來的8個方向減少到4個方向,重新看下SGM原理便不難理解,
SGM能量函數在二維圖像中尋找最優解採用了分而治之的方法,
分爲8或4個一維問題。下面分析下從左到右方向的一維動態規劃問題。

每一個點的代價聚合值是“當前代價 + 
min(路徑相鄰點的當前視差代價聚合值,
路徑相鄰點的視差差值爲1的代價聚合值 + P1,
路徑相鄰點的視差插值大於1的最小代價聚合值 + P2)- 路徑相鄰點的視差插值大於1的最小代價聚合值 ”,
聽起來夠繞口的,其實就好比最小代價的蔓延,
當前代價聚合值由當前代價和路徑上一點的加了懲罰的最小代價聚合值所決定(
最後那一項純粹是爲了防止數字過大,這是常用手段).

r指某個指向當前像素p的方向,在此可以理解爲像素p左邊的相鄰像素。

Lr(p, d) 表示沿着當前方向(即從左向右),當目前像素p的disparity取值爲d時,其最小cost值。

這個最小值是從4種可能的候選值中選取的最小值:
    1.前一個像素(左相鄰像素)disparity取值爲d時,其最小的cost值。
    2.前一個像素(左相鄰像素)disparity取值爲d-1時,其最小的cost值+懲罰係數P1。
    3.前一個像素(左相鄰像素)disparity取值爲d+1時,其最小的cost值+懲罰係數P1。
    4.前一個像素(左相鄰像素)disparity取值爲其他時,其最小的cost值+懲罰係數P2。
另外,當前像素p的cost值還需要減去前一個像素取不同disparity值時最小的cost。
這是因爲Lr(p, d)是會隨着當前像素的右移不停增長的,爲了防止數值溢出,所以要讓它維持在一個較小的數值。

4. 後處理(refinement):多步後處理操作 Multi-stepDisparity Refinement 多步視差細化

a. 離羣點檢測:通過左右一致性準則,檢測出離羣點:遮擋區域和視差不連續區域的點

   條件的異常點被分爲遮擋點和誤匹配點,其中對於異常點p的左視差Disp(p),
   如果極線範圍內右Disp(p)被check則該點定義爲誤匹配點,否則該點爲遮擋點。

b. 傳播異常視差點, Iterative Region Voting 迭代區域投票法
   它的目的是對outlier進行填充處理,一般來說outlier遮擋點居多,
   填充最常用的方法就是用附近的穩定點就行了,省時省力,就是不利於並行處理,
   作者要設計的是一個完全適合GPU編程的算法,所以採用了迭代區域投票法,
   具體做法是對之前區域構建所得到的每個區域求取視差直方圖(不要歸一化),
   例如,得到的直方圖共有15個bin,最大的bin值是8,那麼outlier的視差就由這個8來決定,
   但是穩定點的個數必須得比較多,比較多才有統計穩定性.

   這裏再次用到cross-based自適應窗口,對於異常視差點p,統計窗口內所有有效視差點構成直方圖Hp,如果滿足下麪條件

   此外,這個方法是迭代的,這只是針對穩定點個數具有統計意義的區域,
   有些outlier由於區域內穩定點個數不滿足公式,這樣的區域用此方法是處理不來的,
   只能進一步通過16方向極線插值來進一步填充,
   二者配合起來能夠取得不錯的效果,自己做了實驗,這兩種方法的順序也必須一先一後,否則效果也不行,
   說明一個是大迂迴戰略,目的是消滅有生力量,
   一個是殲滅戰,打的是漏網之魚,二者珠聯璧合,可喜可賀。
    
    
c. 異常點修復 Proper Interpolation:
    根據異常點分類採取不同的修復方式
    大體可以理解爲對於遮擋點,該點來自背景的可能性比較大,
    採用周圍16點相鄰點視差最小值進行填充;
    否則採用相鄰顏色相似度最高點的視差值進行填充。
    
d. 非連續視差調整 Depth Discontinuity Adjustment:
    非連續視差適應,先求下邊緣檢測,對於視差值在邊緣上的點p找到邊緣兩側點p1, p2,
    該點視差 Dl(p)取這兩個側點中代價最小的那個視差值。
    該方法可以減少非連續性錯誤。
e. Sub-pixel Enhancement: 亞像素增強
    二次線性插值

f. 常規中值濾波
    
作者也採用left-right-check的方法將像素點分類成爲三種:
遮擋點,非穩定點,穩定點。
對於遮擋點和非穩定點,只能基於穩定點的視差傳播來解決,本文在視差傳播這一塊採用了兩種方法,
一個是迭代區域投票法,
另一個是16方向極線插值法,
後者具體來說:沿着點p的16個方向開始搜索,如果p是遮擋點,
那麼遇到的第一個穩定點的視差就是p的視差,如果p是非穩定點,
那麼遇到第一個與p點顏色相近的穩定點的視差作爲p的視差。
針對於視差圖的邊緣,作者直接提取兩側的像素的代價,
如果有一個代價比較小,那麼就採用這個點的視差值作爲邊緣點的視差值,
至於邊緣點是如何檢測出來的,很簡單,對視差圖隨便應用於一個邊緣檢測算法即可。
做完這些之後,別忘記亞像素求精,這和WTA一樣,是必不可少的。
流程圖如下,忘記說了,再來一個中值濾波吧,因爲大家都這麼玩,屬於後處理潛規則。

9. Semi-Global Matching(SGM)半全局匹配

參考

代碼

論文:Stereo Processing by Semi-Global Matching and Mutual Information

SGM中文名稱“半全局匹配”,顧名思義,其介於局部算法和全局算法之間,
所謂半全局指的是算法既沒有隻考慮像素的局部區域,也沒有考慮所有的像素點。
例如,BM計算某一點視差的時候,往往根據目標像素周圍的矩形區域進行代價聚合計算;
DoubleBP在計算目的像素視差的時候,考慮的則是圖像所有的像素點。
拋開具體的方法不說,SGM中考慮到的只有非遮擋點,這正是定義爲半全局的原因。

論文關鍵點:
    分層互信息的代價計算+
    基於動態規劃的代價聚合+
    其他

a. 代價計算 互信息 Mutual Information

它採用了基於互信息的計算方法,互信息是一種熵。
那我們就先說說熵,熵是用來表徵隨機變量的不確定性(可以理解爲變量的信息量),
不確定性越強那麼熵的值越大(最大爲1),那麼圖像的熵其實就代表圖像的信息量。
互信息度量的是兩個隨機變量之間的相關性,相關性越大,那麼互信息就越大。
可以想想看,兩幅圖像如果匹配程度非常高,說明這兩幅圖像相關性大還是小?
顯然是大,知道一幅圖像,另外一幅圖像馬上就知道了,相關性已經不能再大了!!!
反之,如果兩幅圖像配準程度很低,那麼兩幅圖像的互信息就會非常小。
所以,立體匹配的目的當然就是互信息最大化。
這就是爲什麼使用互信息的原因。

熵和互信息的定義分別如下所示:
熵:E = sum(pi * log(pi))  pi爲圖像分佈的概率,即圖像的灰度直方圖(像素數/像素總數)
交叉熵(衡量p與q的相似性): sum(pi * log(qi)) pi、qi 0~255兩幅圖像的直方圖概率
聯合熵((X,Y)在一起時的不確定性度量): sum(pij * log(pij))

圖像的灰度值是0~255,每個灰度值對應的像素個數除以圖像像素個數就是該灰度值對應的概率,
單幅圖像的概率密度是一維的,那麼自然地,
兩幅圖像的 聯合概率密度就是二維的,它的定義域取值就是(0,0)~(255,255)

互信息對光照具有魯棒性,
我們已經得到了互信息圖,剩下要做的事情只是根據左圖和右圖挑選出來的像素點的灰度值對,
在互信息圖中直接查找就行(又是一個速度優勢),
注意:要取個負號,這點直覺上很好理解,
互信息越大->相關性越大->兩個點的匹配程度越高->代價計算值理應越小。

Visual Correspondence Using Energy Minimization and Mutual Information

b.

利用動態規劃來求解E,其實這個求解問題是NP完全問題,
想在2D圖像上直接利用動態規劃求解是不可能的,只有沿着每一行或者每一列求解才能夠滿足多項式時間(又叫做掃描線優化),
但是這裏問題來了,如果我們只沿着每一行求解,那麼行間的約束完全考慮不到,
q是p的領域的點其實這個時候被弱化到了q是p的左側點或者右側點,這樣的求優效果肯定很差。
於是,大招來了!!我們索性不要只沿着橫或者縱來進行優化,而是沿着一圈8個或者16個方向進行優化。

smi-global matching的能量函數求解方法,
只是將原來的8個方向減少到4個方向,重新看下SGM原理便不難理解,
SGM能量函數在二維圖像中尋找最優解採用了分而治之的方法,
分爲8或4個一維問題。下面分析下從左到右方向的一維動態規劃問題。

每一個點的代價聚合值是“當前代價 + 
min(路徑相鄰點的當前視差代價聚合值,
路徑相鄰點的視差差值爲1的代價聚合值 + P1,
路徑相鄰點的視差插值大於1的最小代價聚合值 + P2)- 路徑相鄰點的視差插值大於1的最小代價聚合值 ”,
聽起來夠繞口的,其實就好比最小代價的蔓延,
當前代價聚合值由當前代價和路徑上一點的加了懲罰的最小代價聚合值所決定(
最後那一項純粹是爲了防止數字過大,這是常用手段).

r指某個指向當前像素p的方向,在此可以理解爲像素p左邊的相鄰像素。

Lr(p, d) 表示沿着當前方向(即從左向右),當目前像素p的disparity取值爲d時,其最小cost值。

這個最小值是從4種可能的候選值中選取的最小值:
    1.前一個像素(左相鄰像素)disparity取值爲d時,其最小的cost值。
    2.前一個像素(左相鄰像素)disparity取值爲d-1時,其最小的cost值+懲罰係數P1。
    3.前一個像素(左相鄰像素)disparity取值爲d+1時,其最小的cost值+懲罰係數P1。
    4.前一個像素(左相鄰像素)disparity取值爲其他時,其最小的cost值+懲罰係數P2。
另外,當前像素p的cost值還需要減去前一個像素取不同disparity值時最小的cost。
這是因爲Lr(p, d)是會隨着當前像素的右移不停增長的,爲了防止數值溢出,所以要讓它維持在一個較小的數值。

在這裏插入圖片描述

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