上一篇博客中提到了SGM的第一部分,基於分層互信息(HMI)的代價計算,本文繼續說說自己對SGM代價聚合部分的理解。
SGM的代價聚合,其實仔細看看,這並不是嚴格意義上的代價聚合,因爲SGM是爲了優化一個能量函數,這和一般的全局算法一樣,如何利用優化算法求解複雜的能量函數纔是重中之重,其能量函數如下所示:
其中,C(p, Dp)代表的就是基於互信息的代價計算項,後面兩項指的是當前像素p和其鄰域內所有像素q之間的約束,如果q和p的視差只差了1,那麼懲罰P1,如果大於1,那麼懲罰P2,這麼做基本上是機器學習中的常用方法,即所謂的正則化約束。這裏需要注意的是,P2要大於P1,這麼做真心有用。
1. 假如不考慮像素之間的制約關係,不假設領域內像素應該具有相同的視差值,那麼最小化E(D)就是最小化每一個C,這樣的視差圖效果很差,因爲圖像總會收到光照,噪聲等因素的影響,最小的代價對應的視差往往是“假的”,並且這樣做全然不考慮相鄰之間的像素關係,例如,一個桌面的視差明顯應該相同,但是可能由於傾斜光照的影響,每個像素的最小代價往往會不同,所以看起來就會亂七八糟,東一塊西一塊。這就是加上約束的目的。
2. 添加兩個正則化項一方面是爲了保證視差圖平滑,另一方面爲了保持邊緣(保持邊緣一直沒想明白爲什麼?)。懲罰的越大,說明越不想看到這種情況發生,具體來說,如果q和p之間的視差有所差異但又不大,那麼就要付出代價,你不是想最小化能量函數麼?那麼二者都要小,如果沒有第二項,那麼求出來的視差圖將會有明顯的鋸齒現象,如果只有第三項,那麼求出來的視差圖邊緣部分將會得到保持,但由於沒有對相差爲1的相鄰像素進行懲罰,物體內部很可能出現一個“斜面”。
3. 這事情還沒完,本文中有對這兩項的解釋,原文內容如下所示:
這句話的隱含意思是,如果我們讓P1<P2,那麼會允許出現小的斜面,也會保持邊緣,前面一句我理解,懲罰的力度不大,就會導致這種事情還會發生,這也正是作者想看到的,水至清而無魚嘛,不過,後一句中的P2並不是常數項,是根據相鄰像素的差距來決定的,括號裏面的“與大小無關”看起來就更加矛盾了,不知道哪位可以給好好解釋一下這句話?
有了能量函數,下面要做的就是求解它了,這個時候問題來了,這個E對p是不可導的,這意味着我們常看到的梯度下降,牛頓高斯等等算法在這裏都不適用,作者於是採用了動態規劃來解決這一問題,動態規劃相信大家都知道了,但是其真正的精髓卻是深藏不露,我早在大三期間就接觸到了動態規劃算法,這麼多年過去了,雖然時而會用到這個算法,但到現在仍舊不敢說自己徹底懂它。。。。
簡單地說,p的代價想要最小,那麼前提必須是鄰域內的點q的代價最小,q想要代價最小,那麼必須保證q的領域點m的代價最小,如此傳遞下去。