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