立體匹配中的全域性匹配——動態規劃筆記
近來研究立體匹配,從入門開始,先學習一些基本的演算法思想。
立體匹配演算法中,全域性匹配是一個很重要的部分,利用影象的全域性約束資訊,對區域性影象的模糊不敏感,它的計算代價很高。全域性匹配演算法通過構建全域性能量函式,然後通過優化方法最小化全域性能量函式以求得緻密視差圖。
全域性匹配演算法一般有動態規劃、置信傳播、模擬退火、圖割法、遺傳學等,這裡首先介紹動態規劃,也是從一些論文中提取的思想,可能有不對的地方,望指正。
動態規劃的思想就是把求解整個影象深度值的過程分解為一些子過程,逐個求解子過程,具體過程為根據外極線順序約束,通過在視差影象上尋找最小代價路徑得到最終視差圖,從而減少了演算法的複雜度,動態規劃的思想體現了順序約束和連續性約束。傳統的動態規劃演算法可以很好的處理因區域性紋理單一而造成的誤匹配,演算法複雜度不高,缺點是匹配過程忽略了每條極線間視差的約束,導致了視差圖有條紋瑕疵現象。
動態規劃大致就是這個思路。
2:動態規劃立體匹配基於極線約束,通過依次尋找每條極線上匹配點對的最小代價路徑的動態尋優方法求解全域性能量最小化,得到匹配視差圖。演算法步驟:
A:階段劃分:傳統的方法是隻在水平方向尋找掃描點,所以演算法是在水平掃描線的視差空間切面上尋找最優路徑的過程,以畫素點的行方向為橫座標,視差值d為縱座標,依次將整個過程分為1,2,3,4……k個階段,每個x座標點對應一個階段,把立體匹配劃分成可以排序的若干個階段。
B:確定狀態
將上述各個階段所處的匹配階段用不同的狀態表示。狀態的選擇要滿足無後向性。無後向性的意思就是當前階段的狀態只是之前階段的綜合結果,並不對後續階段產生影響。
共有三種狀態:相互匹配M,左可見右遮擋為L(某點在右圖中沒有匹配點),右可見左遮擋為R(如果前一個點的視差比後一個視差大,就是前面點的匹配點在後一個點的匹配點的後面)。
C:狀態轉移方程:所謂狀態轉移方程就是根據前一階段的狀態確定當前階段的狀態,根據順序性的約束,允許的狀態轉移形式有7種(用小寫字母表示前一階段的狀態,大寫字母表示當前階段的狀態)
0表示正確匹配,1、2表示匹配產生左影象遮擋,4、5表示產生右影象遮擋點,3、6表示影象由背景進入前景,視差跳變產生並不連續點。
D:求取最優解,並記錄該最優解的路徑
在實際程式設計中,按順序自左向右,或者自右向左對各階段(即同一極線上的點)依次進行計算,計算相似性測度函式和平滑函式的最小值,當所有階段都計算完成後,全域性能量函式最小的一條最優匹配路徑也就得出來了。
全域性能量函式表示如下,
E(d)= E(data) + E(smooth)
其中 E(data) 為影象資料約束項,判斷匹配畫素點之間的相似性, E(smooth)為相鄰點間的平滑約束項,判斷相鄰點之間的連續性。
資料項由匹配代價獲得
其中表示左畫素點與視差為d的右畫素點的匹配代價函式。
其中N表示相鄰畫素對的集合,dp,dq分別表示畫素點p與畫素點q的視差,平滑項s(dp,dq)表示相鄰畫素點p、q之間的平滑約束,定義如下:
其中P1,P2,P3表示不同情況下的懲罰常量,Cp,q表示待匹配的畫素點與其相鄰點q之間的色彩差異,當相鄰點視差值相同時,懲罰量為0;差值為1時懲罰量為P1,當差值大於1且兩個對應畫素點的色彩差異小於閾值T時,懲罰量為P2,否則懲罰量為P3。P1,P2,P3,T分別賦值10、20、40、35 。
Cp,q也可以是影象中相鄰畫素點p和q之間的梯度。
最優解d*=arg minE(d),這裡是指使E(d)取得最小值時的d值。d是一個數組,傳統的是一行行求每個點的視差,每一行組合起來就是視差圖,並且是稠密的。
傳統的動態規劃思想:
我做一個類比,求這個最優路徑就相當於上面求怎麼最少步數的登上80層,每一步上幾個臺階就相當於每一個點的視差值,每一點的視差值得範圍是設定的視差搜尋範圍,求出最優路徑就是把每一步上的臺階數計算出來了,相當於每一步的視差也就計算出來了。邊界值就設為0,可能有更好的設法,然後依次計算。
先逐個計算每個畫素在每個視差下的匹配代價聚合值,這樣一行畫素就構成一個以行畫素為橫座標,以視差值為縱座標的二維陣列,然後根據唯一性約束和順序性約束使全域性能量函式最小,就是求所有點的視差匹配代價加上平滑約束得到的值最小。這樣既求得比較精確的視差又讓視差平滑了。
不知道這樣理解對不對。誰理解的更好,請指導一下,菜鳥求指導
這樣的動態規劃求出的只是在水平掃描線上尋徑,忽略了掃描線間視差的約束,視差圖有明顯的條紋現象。
3:改進的動態規劃:
A:基於行列雙通道的動態規劃演算法,在行掃描線上尋徑的同時考慮垂直方向的視差一致約束,對掃描行間也進行動態規劃的尋優。首先用水平路徑所求的匹配視差結果作為初始視差值,再次在列方向上二次動態尋優,求取能量函式最小值,生成緻密視差圖。
引入一種獎懲的方法,通過減小初始視差值d*所對應匹配代價函式的值來引導其在列方向動態尋優,即將在行方向上動態尋優求解得到的初始視差值作為一個結果,然後對這個視差結果對應的資料項給予一個更新,其它資料項在這個過程中保持不變。
r是一個相對於代價函式較小的數,這裡取3,太大會對列尋優沒作用,太小對行尋優沒意思。
在列方向上進行動態尋優,即為只考慮列方向上相鄰畫素點的視差約束,運算過程與行方向一致。這樣可以改啥條紋現象,但時間複雜度比原來高出一倍,失去了效率優勢。
這樣得到的結果有少量明顯的視差點。後處理方法:在行方向上如果一個畫素點左右鄰域上畫素點的視差相等,則把其左右鄰域畫素視差值賦予該畫素點;在列方向上如果一個畫素點其上下鄰域畫素點的視差相等,則將其上下鄰域畫素的視差值賦予該畫素點,其它情況下不變。
B:基於樹結構的動態規劃演算法
在全域性能量函式中的平滑項 E(smooth)表示相鄰畫素點p、q在其對應視差值dp、dq情況下約束項。
其中集合N表示畫素點間相互約束的鄰域範圍,這個演算法是研究鄰域N的幾種樹結構DP演算法。
a就是傳統的行掃描線動態尋優;
b是一種類似於樹的結構來連線四個方向的點,排除邊界點與角點,鄰域N選擇上下左右四個方向,每個點都與它的四個相鄰畫素點有關,演算法有效解決行掃描線間的垂直約束問題。
c、e是演算法對每一個畫素點建立水平和垂直兩個方向的樹結構,首先在行掃描方向進行動態尋優計算最佳匹配代價值,然後檢查最優值是不是也是垂直方向的最優值,用WTA得到最優視差值。
d是將匹配中二維約束近似轉化為多個一維約束,採用以中心畫素點為根節點的八個不同方向的平滑約束對影象進行動態規劃尋徑,缺點是在求解最優視差值的過程中各個方向都不能提供有效的紋理資訊使得演算法在弱紋理區域誤匹配率高。
其中b的解決方案:
首先對每一列做向下的動態規劃運算,得到極線間從最左邊開始的每一個畫素的最優匹配代價,將所得的優化代價存放在矩陣
接著對每一列做向上的動態規劃運算,得到極線間從最下邊開始的每一個畫素的左右匹配代價,這時的q指向p下面的畫素,把得到的結果存放在矩陣
為了得到每個畫素的優化代價,可以將向上和向下動態規劃運算代價進行累積,在座標(x,y)的畫素記為px,y,則賦予它視差d時的最小能量函式
上式等於
最後在得到優化矩陣後,將極線間的動態規劃與極線上的動態規劃結合,用已取得的運算結果更新視差空間代價值
其中a是用來調整極線間動態規劃對視差結果影響的引數。
然後進行極線上的動態規劃,在基於上面的更新後的視差空間進行的,最後把累積結果存放在矩陣
最小化這個矩陣,就可以求取每個畫素的視差了。
這種方法複雜度過大,時間太長。
4:基於控制點的雙向動態規劃匹配。
利用事先確定的正確匹配點作為匹配控制點,在動態規劃過程中對尋優路徑進行指導,從而煎炒條紋瑕疵,降低了複雜度。
控制點是那些事先知道的正確的匹配點。那麼就可以通過將這些正確匹配點設為一個較小值迫使所找尋的路徑經過這些正確點。這些點滿足左右一致性約束;避免偽最優匹配,匹配代價小於遮擋代價,排除孤立的控制點,即那些沒有直接近鄰控制點的點。
b中的黑點就是控制點,有效縮小搜尋空間。
具體步驟:
A:得到每個畫素的初始匹配代價C(x,y,d),處理遮擋問題需要計算出左右視差影象,故左右視差影象都需要得到。
B:控制點集的計算,採用以下方法計算控制點集。
C:初始匹配代價的聚集
首次在極線間分別採用下面兩式進行自上而下和自下而上的動態規劃計算,然後進行垂直方向的匹配代價累積
為避免視差圖在極線間出現垂直條紋,採用權重方式實現匹配代價的更新。
D:基於控制點的雙向動態規劃
以左圖為準時,從左到右搜尋最優路徑,以右圖為準時,從右到左搜尋最優路徑。當路徑到達控制點時,記錄下控制點處的視差值,用來約束控制點後面畫素的能量函式計算,進而達到約束後面畫素的視差結果的作用。非控制點處,左右極線上分別進行動態規劃的計算,然後利用動態規劃回溯的方法尋找每個畫素的視差。
計算出左右視差影象後,根據弱一致性約束,當左視差影象中的某點視差大於右視差影象對應點的視差時採用其對應點的視差取代,這樣可以有效的處理半遮擋及前景物體區域的誤匹配。
對於無紋理區域的誤匹配利用同區域已匹配點的視差填充。
對大視差的影象對誤差比較大。
若求取的控制點個數為C,那麼控制點的採用可以使傳統複雜度由O(MND*D)降低為O((MN-C)D*D),獲得的控制點越多,動態規劃的計算複雜度越小。
在論文中看到的測試結果