上一期的SGBM算法詳解(一)得到了許多網友的熱烈回復搞乏,心里很開心扶欣,已經一一作了解答,如果有不懂的可以繼續(xù)咨詢音同,今天開始第二個部分《SGBM算法詳解(二)》词爬。本次主要包括SGM算法和后處理兩個部分。
一权均、SGM算法
SGM算法的全稱為Semi-Global Matching顿膨,網上關于它的介紹有很多不細講,它的論文出處詳見文末參考文獻叽赊,但是這里也要為作者贊一把恋沃,很牛逼。
SGM其實本質上還是一種代價聚合算法必指,和局部立體匹配算法中的代價聚合很像囊咏,不然也不會叫Semi-Global了(當然也不全是哈,重點在后面~)塔橡,而Global又是從何而來呢梅割?為了達到和全局立體匹配算法一樣全局能量函數最小化的效果,就需要更多或者全圖所有的像素參與到當前像素的約束當中葛家。但是剛剛也說了户辞,SGM類似代價聚合,也就是一定范圍內的鄰域操作(鄰域求和癞谒,加權平均等)咆课,那如何與整張圖像上的像素扯上關系而不提高太多性能呢(重點是遠距離像素也能扯上關系),于是作者想出了多路徑約束聚合的思路扯俱,簡單說就是讓當前像素的代價聚合過程受多個方向(或路徑)上所有像素的影響,方向越多參與影響當前像素的鄰域像素就越多(原文說一般來講8-16方向就比較不錯了)喇澡,這樣既保證了全局像素的約束迅栅,又不用建立全局最小能量函數,避免了復雜運算符晴玖,降低了性能读存,所以才叫半全局算法(純屬個人理解哈)为流,是不是很厲害呢?示意圖如圖1所示让簿。不知道我這樣講解敬察,有沒有讓你明白一點半全局的意思呢?
那么講到這里尔当,大家是不是會有一個疑問莲祸,對于每個像素點P都進行多個路徑像素代價的聚合,是不是太夸張了椭迎,魯棒性怎么解決锐帜?錯誤的或不正確的代價要怎么解決?和全局能量最小化差遠了吧畜号?還有就是數據越界了怎么辦缴阎?寫代碼可是硬傷啊!
所以接下來就要說到作者提出的聚合公式,如下简软。說實話一看到公式我就渾身發(fā)抖蛮拔,但是我們大致可以看出來,有多個最小值的比較痹升,包括有點像懲罰參數P1和P2建炫。what? 懲罰參數视卢?這不是和全局立體匹配算法很像嘛踱卵,哈哈。如果把 r 看做是方向的話据过,那么下面兩個公式看起來就像是多方向某個變量的求和(聚合)對吧惋砂?
這里必須給出公式的解釋(很重要):
第一項表示視差為D時所有像素匹配代價之和。第二項表示對像素點p的鄰域Np中的所有像素q增加一個懲罰常數P1(僅在視差差值為1個像素時起作用)绳锅。第三項表示對視差差值大于1的像素使用更大的懲罰常數P2西饵。P1是為了適應傾斜或彎曲的表面。P2則是為了保留不連續(xù)性鳞芙。同時作者也對P2閾值設定給出了方法:因為不連續(xù)性通常與梯度變化是對應的眷柔,因此,可以使用一下的計算公式:
簡單講P1與視差圖的平滑有關原朝,P2與視差圖的邊緣有關驯嘱,這里給出兩組不同P1和P2的效果圖,給大家更清晰的認識喳坠。先看P1的結果鞠评,可以看出在P2不變的情況下,P1越大壕鹉,圖像越平滑剃幌。
再看P2聋涨,P2越大圖像邊緣越差。
但是這里需要強調的是负乡,P1和P2的變化規(guī)律并不是線性的牍白,而是非線性的,意思就是達到某一個值以后抖棘,可能效果就不會再改變茂腥。
如果不容易理解的話,我們可以這樣想钉答,SGM的本質是想像素P的聚合過程有多個方向上的全局像素參數础芍,那么我們可以先看單一方向的全局像素是如何參與聚合的。公式如下:
那么完成單一方向聚合約束数尿,再把所有方向上的聚合約束加起來仑性,是不是就是我們前面所說的多方向代價聚合約束了呢?公式如下:
我們這里先不管這個公式右蹦,先看opencv里面的代碼是如何描述這個公式的诊杆。
簡單說明一下:
L0 - L3 表示三個不同方向上的聚合值,一般來講是左上角順時針計算方向何陆。類似下面這個樣子:
? ? ? 1? ? 2? ? 3
? ? ? 0? ? p? ? 4
? ? ? 7? ? 6? ? 5
Lr_p0 - Lr_p3 表示不同方向上的鄰域像素的代價值晨汹。
這樣我們大致就能看出來,這個公式和代碼還是很對應的贷盲,無非就是求多個方向的最小值之和并約束一下嘛淘这,我們以L0的計算為例:
假設
? T0 = 像素p在0方向上的像素Lr_p0在視差值為d時的代價
? T1 = 像素p在0方向上的像素Lr_p0在視差為d-1時的代價 + P1
? T2 = 像素p在0方向上的像素Lr_p0在視差為d+1是的代價 + P1
? T3 = 像素p在0方向上的像素Lr_p0在非d-1和d+1時的代價最小值 + P2
? L0 = 當前代價 + min(T0, T1巩剖, T2铝穷, T3)- delta(防止聚合結果過大)
? ? 因此,我們只要將多個方向的代價求和佳魔,就完成了當前像素P的聚合過程曙聂。可以看出P1和P2懲罰的代價值所在位置是有區(qū)別的鞠鲜,較近的用P1宁脊,而較遠的用P2,同時P2>P1贤姆,所以他們的作用也就比較明顯榆苞,通過兩個懲罰項來保證視差圖的平滑和邊緣,簡單說如果P1或P2任意一個攔住了你霞捡,那么此處應該是平滑的(或者存在異常值)要好好保護起來坐漏,如果P1和P2都沒能攔住你,那此處或者附近就真的是邊緣,也要好好保護仙畦。
? ? 等到代價立方體所有代價值完成聚合,也就完成了代價的SGM優(yōu)化音婶。
? ? 完成SGM優(yōu)化以后慨畸,SGBM算法剩下的就是視差計算和視差后處理步驟。視差計算相信大家都比較了解衣式,這里采用的是勝者為王(WTA)算法寸士,不過多介紹。
二碴卧、 后處理
? ? 重點介紹一下后處理算法弱卡。SGBM算法的后處理流程包括:置信度檢測、亞像素插值和左右一致性檢測住册。
? 置信度檢測是利用代價立方體本身進行錯誤視差值的剔除婶博。簡單來講就是最佳視差值要與一定范圍內的視差值在代價值上面保持一定的全局最優(yōu)關系,這樣可以避免算法中經常遇到的局部最優(yōu)解問題荧飞。置信度代碼如下:
? 亞像素插值的目的簡單說就是讓物體表面視差更加的平滑凡人,因為我們在立體匹配的時候是將雙目視角所在空間粗略的分為了maxDisparity個平面,但是真實場景卻又是連續(xù)且漸變的叹阔,其計算公式如下:
? 左右一致性檢測的目的則是為了消除左右遮擋帶來的視差錯誤挠轴,代碼如下。這里要特別說明一下耳幢,左右一致性檢測是需要用到左右視差圖的岸晦,但是SGBM算法中并沒有重新計算右視差圖,而是采用左視差圖推斷出右視差圖的睛藻。
? 最后給出WTA的結果和后處理完以后的結果启上,可以看出,后處理的效果還是非常明顯的修档,是一個必不可少的部分碧绞。
參考文獻: