童陳恩,蔡柏林,2,梁 棟,2*
(1.安徽大學 互聯網學院,安徽 合肥 230039;2.農業(yè)生態(tài)大數據分析與應用技術國家地方聯合工程研究中心,安徽 合肥 230601)
基于結構光技術的物體三維形狀測量已經應用于逆向工程、生物醫(yī)學工程、在線檢測等各個領域[1-4]。在現有的結構光技術中,條紋投影輪廓術(Fringe Projection Profilometry,FPP)以其非接觸、速度快、精度高等優(yōu)點受到了研究者的廣泛關注[5]。在FPP中,相位圖主要通過相移技術[6]或基于變換的算法[7-8]恢復。但是,由于求解相位的過程中出現反正切函數,因此上述方法得到的相位被包裹在[-π,π)的范圍內,需要進行相位展開來獲取連續(xù)的相位。
現有的相位展開技術主要分為兩大類:空間相位展開法[9-12]和時間相位展開法[13-15]。空間相位展開法主要通過空間幾何關系將編碼信息蘊含于條紋圖案中,解碼時通過查找左右條紋的信息來獲取碼字,空間方法包括可靠性圖指導法[9-10]、最小范數法[11]和貝葉斯法[12]。顯然這種解碼方法在遇到表面形貌陡峭的物體時會導致誤差通過路徑傳播,從而使得最終的測量結果變得不可靠。與此相比,時間相位展開法通過投射多幅條紋圖像,逐像素地對相位信息進行展開,有效降低了表面突變導致的誤差影響。盡管時間相位展開法需要額外的條紋圖像進行相位展開,但由于其可靠的精度,在考慮測量速度和精度的實際情況中有著不錯的應用前景。目前典型的時間相位展開法主要有多頻率方法[14]、相位編碼方法[15-17]和灰度編碼方法[18-22]。
灰度編碼法由于其易于編碼和解碼,在相位展開中有著廣泛的應用。該方法通過設置條紋圖中像素的灰度值來進行編碼,例如簡單二進制編碼法[23]和格雷碼[24]。這些方法主要采用二級灰度條紋進行編碼,在生成64個碼字時至少需要lb64幅條紋圖,測量速度因此受到限制。為此,Zheng等人[25]用三級灰度編碼提出了一種三值格雷碼方法,此方法需要log364幅條紋圖來生成64個碼字。隨后,Zheng等人[26]又提出了一種四元格雷碼方法,進一步將編碼64個碼字所需要的條紋圖數量減少到log464幅。由此可見,通過增加條紋圖的灰度級可以降低編碼時所需要的條紋圖像數量,此外隨著灰度級增加的同時各灰度級之間的灰度差也在逐漸減小,這會導致解碼時容易產生灰度混淆的情況。因此在考慮灰度級數和解碼誤差的情況下Cai等人[27]提出了一種雙灰度編碼方法(PWGL)。該方法只需用兩幅四級灰度編碼圖像就可以編碼64個碼字。由于PWGL方法相較于傳統的四級灰度編碼策略在編碼相同碼字的情況下所需的條紋幅數較少,在一些時效性要求較高的場合下具有一定的應用潛力。但該方法在解碼過程中需要6個解碼掩膜,導致解碼過程的時間開銷較大,影響了測量速度,并且在條紋缺失、碼字丟失等情況時,解碼掩膜容易受到誤差影響,因此魯棒性較低。針對PWGL方法在解碼過程中的問題,本文對其解碼算法進行改進,提出一種相互交叉的二值掩膜取代原有的解碼掩膜,對同級碼字的碼區(qū)進行統一解碼,從而減少了解碼過程中的時間開銷,同時也降低了因條紋丟失或圖像噪點等誤差造成的解碼異常。實驗結果驗證了本文所提解碼算法的有效性。
N步相移算法主要是通投射多幅具有相位差的正弦條紋圖像來獲取相位信息,常見的算法有三步相移法、四步相移法和五步相移法。相移算法中使用的條紋圖案的強度可以表示為:
In(x,y)=A(x,y)+B(x,y)cos[φ(x,y)+δn],
(1)
式中,n表示相位步數,A(x,y)和B(x,y)分別表示背景和調制強度;(x,y)表示圖像的像素坐標;φ(x,y)為待求解的相位;δn是指相移圖像的相移量,可表示為:
δn=2π(n-1)/N。
(2)
結合N步相移圖像的表達式可以分別求出A(x,y),B(x,y),φ(x,y):
(3)
(4)
(5)
通過對包裹相位φ(x,y)進行相位展開以獲得絕對相位Φ(x,y)。引入條紋級次K(x,y)可將Φ(x,y)表示為:
Φ(x,y)=φ(x,y)+2πK(x,y),
(6)
所以求絕對相位的問題也就轉化為求出每個條紋的級次K(x,y)。
雙灰度編碼方法進行物體三維表面測量需要兩組條紋。一組用于包裹相位計算的,另一組則用于求條紋級次。由于三步相移算法需要最少的模式數來計算相位圖,因此選用三步相移算法來求取包裹相位。再用兩幅灰度編碼條紋圖求取條紋級次,用于確定局部順序K1(x,y)的灰度編碼條紋圖G1(x,y)為四級灰度編碼,其周期T1和相移條紋周期T相等。G1(x,y)的圖像強度可表示為式(7)。式中ceil(m)表示對m向上取整;A(x,y)和B(x,y)與式(1)中的A(x,y)和B(x,y)相同;CS(i),(i=1,2,3,4)代表四級灰度編碼。另一灰度編碼條紋圖G2(x,y)用于計算區(qū)域順序K2(x,y)。G2(x,y)的每個周期被分成兩個相等的部分CS1和CS2,并且使用不同的代碼序列對這兩個部分進行編碼。CS1和CS2都包含64個碼字,其中CS1編碼G2的第一部分,CS2編碼G2(x,y)的第二部分。使用這兩個代碼序列,G2(x,y)可以表示為式(8),式中mod(m,n)返回m除以n后的余數;CS1(i),CS2(i)表示CS1,CS2中的第i個代碼。A(x,y)和B(x,y)可以在得到S1(x,y),S2(x,y),S3(x,y)后通過式(4)計算出。CS1和CS2編碼的2位碼字C1和C2與區(qū)域順序K2(x,y)的對應關系見表1。
表1 K2與C1,C2的對應關系Tab.1 Corresponding relationship between K2 and C1, C2
M=ceil(x/T1),
(7)
(8)
(9)
由上述可知,區(qū)域順序K2(x,y)直接由G2(x,y)決定。對于G2(x,y)的每個周期,其順序可以通過組合其第一部分和第二部分的碼字來確定,K2(x,y)可以由式(9)計算獲得。圖1顯示了PWGL方法中使用的編碼策略及其相應的細節(jié)。在求得K1(x,y)和K2(x,y)后,條紋階數K(x,y)可以計算為:
圖1 PWGL方法的編碼策略Fig.1 Coding strategy of the PWGL method
K(x,y)=K1(x,y)+K2(x,y)。
(10)
最后,將K(x,y)代入式(6)即可求得絕對相位Φ(x,y)。圖2說明了整個PWGL方法求絕對相位的流程。
圖2 PWGL方法流程圖Fig.2 Flowchart of the PWGL method
1.3.1 PWGL解碼算法
為了獲得條紋階數,PWGL方法提出了一種解碼算法。該算法的主要目的是確定區(qū)域順序K2(x,y),因為局部順序K1(x,y)可以根據G1(x,y)圖像的灰度強度獲得。在獲取條紋編碼時,可以借助相位值將條紋圖像進行分割。由于包裹相位的范圍為[-π,π),因此選擇相位值0可將條紋分成兩部分,從而獲得兩個二值掩模:
(11)
(12)
掩膜maskp(x,y)和maskn(x,y)分別與G2(x,y)點乘便可以區(qū)分出C1和C2。此外為求得區(qū)域順序K2(x,y),還需要利用局部順序K1(x,y),因為K1(x,y)的周期與條紋的周期相同,可以使用它來正確地逐個匹配C1和C2。具體方法是先用K1(x,y)產生4個二值掩膜:
(13)
然后標記Bi(x,y)的連通域,逐個提取每個連通域并與C1,C2點乘。按照這個方法只要遍歷整個連通域后就可以求出C1,C2所有的編碼,然后根據式(9)求得區(qū)域順序K2(x,y)。解碼掩膜Bi(x,y),解碼細節(jié)如圖3所示。
圖3 PWGL的解碼原理Fig.3 Decoding principle of PWGL
所有解碼操作完成后,就確定了局部順序K1(x,y)和區(qū)域順序K2(x,y)。然后,可以使用式(10)計算條紋階數K(x,y)。由于在逐個求取C1,C2的編碼時使用的二值掩膜Bi(x,y)的每個連通域只包含C1,C2的一個編碼。即在大部分情況下區(qū)域順序K2(x,y)的每個條紋級次都要進行4次組合求解,時間開銷較大。另外Bi(x,y)由于其覆蓋范圍只有一個相移條紋周期,容易受到條紋丟失或圖像噪點的干擾,盡管可以通過查找左右條紋序列解決,但還是在一定程度上影響了所求條紋級次的準確度。
1.3.2 改進的解碼算法
針對所提出的問題,本文對區(qū)域順序K2(x,y)的解碼過程進行了一些改進。首先仍然是利用相位值0獲取兩個二值掩模maskp(x,y)和maskn(x,y),并用其區(qū)分出C1,C2的每個編碼。由于K2(x,y)的每個序列中的C1,C2編碼相同,所以實際上可以對相同碼區(qū)的碼字進行統一求解,而不必逐一對每個編碼進行求解,也就不需要為每個碼字都設置一個掩膜。根據連通域劃分的原理,本文提出的方法只需設置兩個解碼掩膜便可以求出C1,C2的所有碼字。這兩個掩模mask1(x,y)和mask2(x,y)利用局部順序K1(x,y)的值可以表示為:
(14)
(15)
改進的解碼掩膜覆蓋了3個相移條紋周期,通過對mask1(x,y)和mask2(x,y)進行連通域標記逐一求解每個連通域的編碼。為了方便說明,以圖4中的區(qū)域j1和h1的解碼過程為例。首先根據連通域L1的值篩選出mask1(x,y)的連通域L1,將其命名為maskj,然后將maskj分別與C1,C2點乘并用結果矩陣中的唯一非零眾位數覆蓋整個區(qū)域j1的編碼,區(qū)域h1的編碼也可以用同樣的方法得出。最后組合兩部分的編碼就可以還原出區(qū)域j1和h1的區(qū)域順序K2(x,y)。同理j2和h2區(qū)域的編碼也可如此求出。K2(x,y)的解碼細節(jié)如圖4所示。求得K1(x,y),K2(x,y)后,同樣使用式(10)計算出條紋階數K(x,y)。最后將K(x,y)代入式(6)求得絕對相位Φ(x,y)。
圖4 改進的PWGL解碼原理Fig.4 Decoding principle of improved PWGL
首先,為驗證本文方法的有效性,對一個平面進行仿真,并用兩種解碼算法分別對其進行三維測量,比較二者的測量誤差。另外對條紋圖像添加了高斯噪聲,從而模擬真實測量環(huán)境中的系統誤差,圖5為添加高斯噪聲后的條紋圖像。圖6(a)為本文方法的測量結果,圖6(b)為傳統方法的測量結果,對兩個測量結果進行誤差分析得到圖6(c)和圖6(d)。由誤差分析的結果可以看出傳統解碼算法對圖像噪點更加敏感,因此測量結果中的誤差更大。
圖5 仿真條紋圖Fig.5 Simulation of fringe pattern
(a) 本文方法
(c) 本文方法的誤差分析
(d) 傳統方法的誤差分析
為了測試改進的解碼算法在實際測量中的性能,建立了一個FPP系統,該系統由一個攝像頭(Point Grey Chameleon3)和一個投影儀(DLP Light Crafter 4500)組成。相機和投影儀的分辨率分別為1280×1024 px和912×1140 px。
第一個實驗,對一個石膏球分別用本文的解碼算法和傳統的解碼算法進行測量。圖7(a)為被測物體,圖7(b)~(d)為三步相移條紋圖,圖7(e)和圖7(f)分別為兩幅四級灰度圖。首先通過三步相移圖像獲得包裹相位,然后利用相位值精準分割獲得兩個掩膜maskn(x,y),maskp(x,y)。有了這兩個掩膜后便可將圖7(f)中G2(x,y)的編碼C1,C2區(qū)分開,同時maskn(x,y),maskp(x,y)結合圖7(e)中的G1(x,y)也可求出圖7(i)中的K1(x,y)。利用K1(x,y)的值可以得出兩種解碼算法所需的二值掩膜,圖7(g)和圖7(h)分別為本文方法的解碼掩膜mask1(x,y)和mask2(x,y)。mask1(x,y)和mask2(x,y)與C1,C2相結合便可求出圖7(j)中的K2(x,y),進而求出圖7(k)中的K(x,y)。最后進行相位展開獲得圖7(l)中的絕對相位,并繪制三維形貌。圖8(a)為本文方法的測量結果,圖8(b)為傳統方法的測量結果。由結果可見,本文方法進行三維表面測量時對物體表面形貌恢復得更加精確,特別是物體邊緣處的測量結果更完整。
(a) 被測物體
(b) 三步相移圖像I1(x,y)
(c) 三步相移圖像I2(x,y)
(d) 三步相移圖像I3(x,y)
(e) 灰度圖G1(x,y)
(f) 灰度圖G2(x,y)
(g) 掩膜maskp(x,y)
(h) 掩膜maskn(x,y)
(i) 局部順序K1(x,y)
(j) 區(qū)域順序K2(x,y)
(k) 條紋級次K(x,y)
(l) 絕對相位
為了進一步驗證改進解碼算法的有效性,進行了第二個實驗,對一個雕像進行測量。圖9(a)為相移圖像,圖9(b)、圖9(c)分別為灰度圖G1(x,y)、G2(x,y)。首先通過三步相移算法獲得包裹相位圖9(a),接著由解碼算法分別求出圖9(d)中的K1(x,y)和圖9(e)中的K2(x,y),并根據式(10)求出圖9(f)中的K(x,y)。最后再將K(x,y)代入式(6)求得圖9(e)中的絕對相位Φ(x,y)。圖10對比了兩種解碼算法的三維測量結果,其中圖10(a)為本文改進的解碼算法,圖10(b)為傳統的解碼算法。由結果可以看出,在測量復雜物體表面三維形貌時本文解碼算法對物體表面細節(jié)的還原度較高,另外由圖10的放大對比處可反映出改進的解碼算法對物體邊緣處的還原程度更高。
(a) 本文方法
(b) 傳統方法
(a) 三步相移條紋圖
(b) 灰度圖G1(x,y)
(c) 灰度圖G2(x,y)
(d) 局部順序K1(x,y)
(e) 區(qū)域順序K2(x,y)
(f) 條紋級次K(x,y)
(a) 本文方法測量結果
(b) 傳統方法測量結果
本文改進的算法中所用到的掩模mask1(x,y)和mask2(x,y)相較于原PWGL算法的解碼掩膜Bi(x,y)覆蓋范圍更廣,因此對圖像噪點等異常值的魯棒性更高。此外,由于只需要兩幅mask1(x,y)和mask2(x,y)求解C1,C2所有的編碼,而原算法需要四幅解碼掩膜,因此算法的時間復雜度也相對減少,有效地提升了測量速度。
用本文改進解碼算法可以使PWGL作為一種快速三維重建方法在實際測量過程中有著更好的時效性,同時也可以獲取更加精準的物體表面三維形貌信息。