雙目立體匹配算法:SGM

一、簡介

  立體匹配旨在爲校正後的左右視圖提供稠密的匹配對,這種問題稱爲"stereo correspondence problem"。有大量的算法用於求解立體匹配問題,根據Scharstein和 Szeliski的研究,所有這些算法的計算流程基本上都可以分爲四個步驟:A.匹配代價計算;B.代價聚合; C.視差計算/優化; D.視差細化。其中匹配代價用來度量像素或者像素塊之間的相似性,計算匹配代價的方法有AD、SAD、BT、NCC、Census-Hamming、HMI、Daisy以及基於深度學習方法的匹配代價等等。代價聚合的目的是將每個像素的匹配代價和它周圍的像素關聯起來,常用的方法是將一個固定尺寸的窗口中的相同視差下的匹配代價簡單求和、加權求和,或者在利用圖像中的梯度或顏色進行分割後的區域中進行聚合,還有一些方法使用引導濾波等進行代價聚合。
  在上述框架下,立體匹配算法基本被分類爲兩種:(1)局部算法:A => B => C => D(2)全局算法:A => C => D。局部算法一般在代價聚合之後,通過選擇最低匹配代價來得到對應的視差,即winner takes all。全局算法沒有進行代價聚合,而是定義了一個包含數據項和平滑項的能量函數並通過最小化能量函數來求得視差,數據項一般爲所有像素的代價和,平滑項一般爲對鄰域像素視差差異的懲罰,部分方法還添加更多的項,比如對遮擋區域的懲罰、左右一致性或對稱性約束,或者根據分割區域對平滑項進行加權等。根據所使用的優化方法,全局算法主要有Dynamic programming、Graph Cut、Belief Propogation等。

​  全局算法由於非常高的運算量或內存消耗,在大多數場合都無法應用,而局部算法雖然速度很快,但是魯棒性差,匹配質量比較低。2005年,Heiko Hirschmuller提出了一種半全局的立體匹配算法,叫做SGM,該算法建議採用單像素互信息(HMI)作爲匹配代價,沿着多個方向進行一維能量最小化來近似替代二維全局能量最小化,因此被稱爲半全局算法。SGM的運算速度遠遠快於大多數全局算法,同時精度也比較高,除了深度學習的方法外,SGM在各種公開數據集的雙目匹配任務的排行榜上一直都位列前排,證明了SGM算法的強大。在OpenCV中高度優化的SGBM算法對於1920*1080分辨率的圖像,其運行時間可以低至300ms以內(當然這還取決於機器性能)。

二、SGM

1.pixelwise匹配代價計算:HMI

​  互信息(Mutual Information)用於表徵兩幅圖像共有信息量的大小,可作爲兩幅圖像相似性的度量,然而MI是針對整張圖像而言的,Junhwan Kim通過對MI進行泰勒展開得到單像素的互信息HMI的計算方法,該方法作爲像素相似性度量對光照變化較爲魯棒,是一種優秀的代價函數。關於如何求解單像素互信息,限於篇幅這裏就不敘述了,詳情可以查看作者論文。

2.動態規劃

2.1一些基本概念

  動態規劃(dynamic programming)是一種求解多階段決策過程(decision process)最優化的數學方法,即利用各階段之間的關係,逐個求解。下面介紹一些動態規劃算法的基本概念。
(1)階段:階段是整個過程的自然劃分,通常按時間順序或空間特徵劃分階段,表示階段序號的變量稱爲階段變覺,一般用字母kk表示。
(2)狀態:在整個過程中,每個階段開始所處的自然狀況或客觀條件稱爲狀態,是不可控因素。狀態變量常用sks_{k}表示。
(3)決策:一個階段的狀態確定後,可以作出不同的選擇,從而演變到下一階段的某個狀態,這種選擇叫做決策,常用uku_{k}表示。
(4)策略:由決策組成的序列稱爲策略。
(5)狀態轉移方程:給定第k階段的狀態和決策,則第k+1k+1階段的狀態由狀態轉移方程決定。
(6)指標函數:指標函數是衡量過程優劣的數量指標,它是定義在全過程和所有後部子過程上的數量函數,對於給定的狀態,指標函數值 隨策略改變,採用不同的策略可以得出不同的指標函數值。
(7)最優策略和最優軌線:使指標函數達到最優值(最大值或最小值)的策略稱爲最優策略,按最優策略和狀態轉移方程得出的狀態序列爲最優軌線。

2.2基於動態規劃的立體匹配

  動態規劃立體匹配是建立在極線約束的基礎上的,其大致思想就是在每條對極線上尋找最優路徑,使得能量函數在每條對極線上達到最低。經過立體校正以後,對極線對應的則是圖像中的每一行。

在沿着對極線進行動態規劃時通常要遵循以下幾個約束:
 (1) 視差範圍約束:即視差的搜索範圍是有限的,不能在一個無限大的區間內去搜索視差;
 (2) 唯一性約束:給定左圖中的一個像素點,它在右圖中最多隻能有一個對應點;
 (3) 可見性約束:當某點處於遮擋區域時,它在另一幅圖中將無法找到對應點,遮擋區域一般出現在由背景進入前景或者由前景進入背景的邊界地帶;
 (4) 順序性約束:假如在左圖中的兩個點的橫座標爲x1,x2x1,x2,在右圖中的對應點橫座標爲y1,y2y1,y2,若x1<x2x1<x2,則y1<y2y1<y2
 (5) 連續性約束或平滑性約束:由於現實世界物體是連續的,因此在圖像中的視差也應當是均勻平滑變化的,但是在物體的邊緣處視差是有可能發生大的跳變。

動態規劃算法一般分爲以下幾個步驟:

(1) 階段劃分

  由於通過極線校正的圖像只在水平方向尋找掃描點,所以算法是在水平掃描線的視差空間切面上尋找最優路徑的過程,如下圖 所示,以像素點的行方向爲橫座標,視差值d 爲縱座標,依次將整個過程分爲 1、2、3、…、k 共k個階段。
在這裏插入圖片描述
(2) 確定狀態

  將上述各個階段所處的匹配階段用不同的狀態表示。如下圖所示,每一個階段的狀態就是對應像素點的匹配情況,共有三種狀態:相互匹配記爲 M、左可見右遮擋爲 L、右可見左遮擋爲 R,狀態的選擇滿足無後效性。
在這裏插入圖片描述
(3) 狀態轉移方程

  所謂狀態轉移方程就是根據前一階段的狀態確定當前階段的狀態,根據順序性的約束,允許的狀態轉移的形式共有 7 種(用小寫字母表示前一階段的狀態,寫字母表示當前階段的狀態),如下圖所示,其中 0 表示正確匹配,1、2 表示匹配產生左圖像遮擋點,4、5 表示產生右圖像遮擋點,3、6 表示圖像由背景進入前景,視差跳變產生並不連續點。
在這裏插入圖片描述
(4) 求取最優解

  根據以上的理論分析,動態規劃就是在校正圖像上的每一行,尋找一條使得全局能量函數最小的最優匹配路徑。能量函數一般定義如下:
能量函數
其中 E(data)爲圖像數據項,用於判斷匹配像素點之間的相似性, E(smooth)爲像素點與鄰域像素的平滑約束項, 用於保證視差的連續性。使用不同的能量函數優化得到的最終結果也會不同,因此構造能量函數也是十分重要的。在論文中,作者提出了一個具體的能量函數:
在這裏插入圖片描述
其中第一項爲所有像素在視差圖D下的匹配代價之和,第二項爲當像素p和鄰域像素q的視差差異爲1時添加的常數懲罰值P1,第三項則添加了更大的懲罰值P2用於更大的視差差異。小的懲罰值能夠適應傾斜表面和曲面,大的懲罰值能夠適應深度不連續區域,由於深度不連續性一般出現在灰度發生跳變的地方,因此P2一般根據灰度梯度自適應的決定:
在這裏插入圖片描述
爲了方便求解,不考慮順序性約束和可見性約束,則求解過程如下:
在這裏插入圖片描述
按照上述過程,只要依次求解每個階段的最優值minfk(d)min f_{k}(d),該行像素的視差也就求出來了。從這個過程中可以發現,該計算流程實際上就是接下來所要講解的SGM在水平方向上的代價聚合。

3.代價聚合

  全局立體匹配的過程可以認爲是通過最小化全局能量函數來求得視差圖,然而不幸的是,最小化這樣一個2D全局能量函數是一個NP hard問題。在上一小節中介紹了在一維對極線上使用動態規劃進行立體匹配的方法,該方法可以在多項式時間內完成能量最小化過程,然而算法最終得到的視差圖中卻會有明顯的水平條紋,這是因爲一維動態規劃僅考慮了對極線上的約束,而對極線之間的約束卻沒有考慮。一些改進算法如行列雙通道動態規劃、基於垂直一致性加強約束的動態規劃、基於樹結構的動態規劃可以有效改善這種問題,但這些算法都大大增加了運算複雜度。以上這些想法推動Hirschmuller提出了semi-global matching方法,如下圖所示,其思想是通過在多個方向1維路徑上平等地進行代價聚合,然後使用WTA求解視差,來作爲一個近似求解2維能量最小化的過程。
在這裏插入圖片描述
代價聚合按照如下公式遞歸計算:
在這裏插入圖片描述
其中rr代表一條路徑,prp-r代表沿着該路徑上位於p前面的像素,代價C(p,d)C(p,d)可以爲BT代價或者MI代價等。可以看出這種方法其實更加接近scanline optimization而非傳統的動態規劃。按照上述公式進行代價聚合,聚合值沿着路徑會不斷增加,最終將得到一個極大的數值,所以Hirschmuller建議採用如下改進的代價聚合公式:
在這裏插入圖片描述
這個改進並不影響最後的計算結果,因爲被減去的那項在像素p的不同視差下都對應一個常數,然而聚合代價的上限將會變爲:L<Cmax+P2L<C_{max}+P_{2}。代價聚合的路徑可以爲8或16個,這樣可以全面覆蓋整張圖像,最終的聚合代價是所有路徑上聚合代價的和:
在這裏插入圖片描述
於是代價聚合的上限則變爲:L<16(Cmax+P2)L<16*(C_{max}+P_{2}),可以看到代價聚合的複雜度爲O(NWHD)O(NWHD),其中N爲代價聚合的路徑數,W和H爲圖像的寬、高,D爲視差搜索範圍。由於代價聚合公式結構規整,操作簡單,僅僅涉及了加減法和求最小,所以可以很容易的使用SIMD指令實現並行操作。

4.視差計算

經過代價聚合後,可以採用winner takes all方法來計算視差:
在這裏插入圖片描述
對於亞像素視差估計,可以通過拋物線擬合來求解。

5.多基線匹配

略,後續補充。

6.視差細化—後處理

初步計算出的視差不可避免地包含一些錯誤,因此需要採用一些方法去除或修正其中的錯誤視差。

6.1peak filter

  噪聲、過飽和、大面積無紋理區域容易導致錯誤匹配,在生成的視差圖中經常以塊狀聚集。對圖像進行連通域分割,比如4連通或者8連通,然後通過一個預定義的尺寸閾值來判斷這塊連通域是否爲噪聲,若是則將其剔除。這種方法十分高效,可以在O(WH)步驟內完成。
在這裏插入圖片描述

6.2灰度一致性視差選擇

略,後續補充

6.3無效視差值填充

  無效視差被分成兩類:occlusions(遮擋)和mismatches(誤匹配),兩種情形下的視差插值需要進行不同的處理,occlusions在鄰域像素的視差中選擇最小值,因爲occlusions一般處於背景當中。mismatches一般取鄰域像素的中值:
在這裏插入圖片描述
下面是Teddy圖像的各個視差後處理的效果展示:
在這裏插入圖片描述

7.視差融合

三、OpenCV中的SGBM

​  在OpenCV中實現了SGM算法,叫做semi-global block matching,即SGBM,分爲預處理、代價計算、代價聚合、後處理這四個步驟來實現。opencv在其中增加了一些獨特的處理方法,下面分別說明一下各個步驟。
(1) 預處理
  SGBM 算法利用水平 Sobel 算子,對被測圖片進行預處理,所用的到的算法公式如下式所示:
在這裏插入圖片描述
利用上面的函數公式會對水平 Sobel 算子對圖片的所有的像素點進行處理過後,會變成一個嶄新的圖片(P的數值代表像素的像素值): PNEWP_{NEW} 表示新圖像上的像素值。映射函數公式如下式:
在這裏插入圖片描述
(2) 代價計算
  代價由兩部分組成:一是對圖像經過預處理後的梯度圖計算BT代價,二是對沒經過預處理的原圖像計算BT代價,然後將兩者簡單相加,最後將得到的代價立方體在矩形窗口內進行求和:
在這裏插入圖片描述
(3) 代價聚合
即SGM中代價聚合的那一步。

(4) 後處理

A.唯一性檢測
​  也就是常見的比率測試匹配篩選方法,即最低代價是次低代價的(1+ uniquenessRatio/100)倍的時候時,最低代價匹配的視差值才認爲是正確視差值,否則這個像素點的視差值設定爲負值。其中 uniquenessRatio 是一個常數參數,一般設置爲0.8左右。

B.亞像素插值
插值公式如下:
在這裏插入圖片描述
C.左右一致性檢測
  設左圖中像素pp的視差爲dd,右圖中對應像素的視差爲dd^{*},那麼一般認爲dd<threshold|d-d^{*}|<threshold時,dd才最有可能爲正確的視差,否則將其置爲一個無效值,即負值,threshold一般取爲1或者2。

D.連通域噪聲濾波

  連通域噪聲濾波也就是作者在論文中所講述的peak filter,這裏就不重複敘述了。peak filter可以有效剔除噪聲塊,但是也很容易剔除正確的視差,使得整張視差圖空洞比較多。

四、代碼實現

這裏採用opencv中已經封裝好的SGBM算法,具體代碼可以參考博客:雙目測距理論及其python實現!

五、效果圖

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

六、總結

  1. SGM算法由於具有很高的匹配精度,並且可以從數據層面和多線程層面高度並行化處理,因此可以達到比較高的速度,使用GPU或FPGA甚至能夠達到實時,因此SGM是至今最受歡迎的立體匹配算法,特別在商業應用中應該是使用最多的算法了。關於SGM算法的改進也非常多,除了opencv中的SGBM外,還有wSGM、rSGM、iSGM、MGM、tMGM-16、PMSGM、SGM-Forest、SGM-Net、GA-Net等等,有興趣可以查閱相關論文閱讀。
  2. OpenCV在SGBM算法的後處理步驟中只有如何剔除錯誤視差的部分,而如何填補視差圖上剔除後形成的空洞卻沒有相關的算法實現,而這一步對於後續的三維重建還是比較重要的。
  3. SGBM算法的效果還是相當不錯的,然而在實際應用當中,SGBM對於圖像噪聲、光照不均、大面積無紋理等各種情況依然不能很好的處理,真正的視差效果往往沒有middleburry中的數據那樣好,比如下圖:
    在這裏插入圖片描述
    還有的情況,SGBM算法幾乎大面積失敗了:
    在這裏插入圖片描述
    如何處理實際場景中的圖像特別是室外圖像,需要有針對性的考慮,比如代價計算部分可以考慮對光照不均容忍性較強的census變換,或者考慮代價融合,其中比較有名的改進爲ADCensus算法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章