手把手教你編寫SGM雙目立體匹配(基於C++,Github同步更新)(七)(弱紋理優化)

歡迎收看長篇小說SGM第七章:弱紋理優化

如前所述,SGM是一個優化的算法,源自兩篇優秀的論文,作者Hirschmüller在2005年於TOP期刊PAMI上第一次發表SGM算法,又在2008年的頂會CVPR上再次發表,而CVPR上發表的和此前PAMI上的區別就在於增加了很多後處理步驟,博主自第五篇開始介紹的內容都來自於2008年的論文。很慚愧,博主自2014年開始接觸SGM,開始並沒有有完全讀懂,後處理部分只是選擇性的實現幾項並再未靜下心來認真閱讀原文,直至今日,纔對2008年的論文有一個完整的瞭解,感覺再次收貨良多,如重拾舊友,倍感親切。

本篇所介紹的內容是SGM後處理的其中一步:弱紋理區視差優化。如不出意外的話,本篇是手把手SGM教學的最後一篇,至此,原文中的所有模塊都實現完成。當然,博主也不打算立Flag說肯定是最後一篇,萬一後面心血來潮做一個額外的補充豈不是打臉。

【博主最近實在太忙,所以沒時間寫代碼,但是手實在癢,所以決定先把理論講一講,後面再補代碼】

三個假設

在弱紋理優化之前,作者提出三個假設,這三個假設至關重要,它是優化方法的理論依據,我們來看看原文如何描述:

  1. Discontinuities in the disparity image do not occur within untextured areas.
  2. On the same physical surface as the untextured area is also some texture visible.
  3. The surface of the untextured area can be approximated by a plane.

我來翻譯一下:

  • 1)弱紋理區域不存在視差非連續。
  • 2)弱紋理區域內應該存在一些可見的紋理。
  • 3)弱紋理區所表示的表面能夠用一個平面近似。

我將untextured翻譯成弱紋理而非無紋理,我想作者討論的應該是弱紋理,而無紋理是屬於弱紋理的極端情況。

我們來逐個分析這三點假設,

1)弱紋理區域不存在視差非連續。

此假設在多數情況下成立,視差非連續往往會存在圖像亮度的變化,比如前景和背景會因爲離相機的距離不同而導致輻射強度不同,在圖像上表現出亮度的差異,有了亮度的明顯差異就不再屬於弱紋理的範疇(弱紋理就是因爲亮度差異太小而無法區分)。因此弱紋理區域內可以假設視差都是連續的。
【圖】
但少數情況此假設會失效,有些情況前背景確實在圖像上是同一亮度值,比如前後兩塊白牆,就可能在圖像上都是無法區分的白色,這屬於少數情況。
【圖】
作者在此建立多數情況成立的假設,顯然是無意提出適用於所有情況的完美解決方案,難度確實太大,而適應多數情況的解決方案是更合理且有效的。

2)弱紋理區域內應該存在一些可見的紋理。

此假設是必要假設,原因很簡單,弱紋理區內若完全無紋理,則不可能估計正確視差,譬如左右視圖上同一塊區域都是全黑或者全白,實在想不出有什麼辦法可以正確估計視差。

這個假設很關鍵,弱紋理區域內有一些可見紋理所表達的背後含義是:可見紋理像素可以正確的計算出視差,從而爲區域內其他像素的視差計算提供重要信息,這也是文章中弱紋理視差優化的前提,後面我們細說。

3)弱紋理區所表示的表面能夠用一個平面近似。

此假設是三個中最弱的假設,該假設的理由是:非平面的表面往往會在圖像上表現出亮度的變化。這個理由不一定成立,空間中的一個圓柱面也可能在圖像上表現成連續的弱紋理塊。但該假設也有很多正確的場景,比如多數結構化場景中,牆面、地面等都都是平面,在圖像上常常表現成一大塊弱紋理區域,符合該假設。

綜上所述,三個假設所針對的是:空間中的平面在圖像上呈現出一塊亮度一致的弱紋理區域的情況。如果符合此種情況,則可基於上述三個假設採用文章中的優化方法來優化。

亮度一致性分割

弱紋理區視差優化的第一步是檢測弱紋理區。弱紋理區的一大特徵就是在圖像上色彩(亮度)及其相近。

SGM作者採用Mean-Shift分割算法對影像進行分割,Mean-Shift是非常出名的圖像分割算法,它的原理博主就不細說了,簡單的說它把顏色相近的區域劃分爲同一子塊,從而把圖像分割成多個子塊的算法。博主貼一些Mean-Shift的實驗圖同學們感受一下(來自opencv的meash-shift算法):

看到這裏,大家可能會心裏有點想法了,肯定是利用塊內的好結果來修正差結果,就是不知道具體細節,那我們再繼續往下分析。

首先,我們把分割結果每一塊記爲SiS_i(i=0...Ni=0...NNN爲分割快數),把面積小於閾值(論文推薦值:100)的塊丟掉,因爲小面積的弱紋理區域SGM處理的還不錯,不需要做優化。

其次,我們把每一塊內的視差連通塊,記爲SikS_{ik},表示圖像塊SiS_i內的第kk塊視差連通塊。

不得不說,SGM對這種極弱紋理的數據結果真是太辣了。當然其他算法也不會太好,畢竟是立體匹配的疑難雜症。如果能處理好弱紋理,對室內的圖像三維重建是不錯的突破。現在室內都是Kinnect等主動式深度採集設備的天下。

有同學就舉手問:要是圖像塊內完全沒有視差塊呢?這就要回到我們前面的假設2了:弱紋理區域內應該存在一些可見的紋理。有可見紋理SGM便能在紋理位置估計出有效視差。什麼?完全沒有?對不起,你破壞了我的假設,我不考慮,就是這麼傲嬌!

好了,標記工作完成,接下來就是對弱紋理區域做視差優化了。

弱紋理區視差優化

圖像分成一塊塊了,每塊內的視差也分成塊了,接下來該怎麼做?

輪到我們的假設3登場:弱紋理區所表示的表面能夠用一個平面近似。

所以我們一個圖像塊就是一個平面對不對,一個平面的視差也是一個平面(這簡單的推理留給大家)。所以思路就是:尋找圖像塊SiS_i內的最優視差平面,然後基於平面方程計算塊內無效像素的視差。

而尋找塊SiS_i內的最優視差平面的方法就是對塊內的所有視差塊都分別擬合一個平面FikF_{ik},然後基於每個FikF_{ik}計算塊內所有像素的視差,之後計算塊SiS_i的能量值EikE_{ik},取能量值最小的平面FikF_{ik}爲最優視差平面。
能量值計算公式

計算出塊SiS_i的最優視差平面後,便可通過平面公式計算出塊內非遮擋無效像素的視差值。非遮擋像素的判斷規則上一篇博客有講解。最後的優化公式如下:

實驗結果

【代碼暫缺,實驗結果暫缺,後補】

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