劉自若,萬 熠+,侯嘉瑞,梁西昌,孫 堯
(1.山東大學(xué) 機(jī)械工程學(xué)院 高效潔凈機(jī)械制造教育部重點(diǎn)實(shí)驗(yàn)室,山東 濟(jì)南 250061;2.山東大學(xué) 機(jī)械工程國家級實(shí)驗(yàn)教學(xué)示范中心,山東 濟(jì)南 250061)
近年來,視覺SLAM及相關(guān)圖像處理算法受到了廣泛的關(guān)注并取得了一定的研究成果,其中,Endres等[1]提出了基于SIFT特征點(diǎn)檢測算子的地圖建立方法,但計(jì)算量較大,難以滿足實(shí)時(shí)性需求;Engel等[2]提出了一種采用直接法視覺里程計(jì)的SLAM方法,省卻了特征點(diǎn)提取的復(fù)雜運(yùn)算,可以實(shí)時(shí)運(yùn)行,但該算法在光線強(qiáng)度會發(fā)生變化的環(huán)境下穩(wěn)定性較差;Mur-Artal等[3]提出了基于單目相機(jī)的SLAM算法,使用了ORB算子進(jìn)行特征點(diǎn)的檢測和描述,該SLAM算法的運(yùn)算速度可達(dá)每秒25-30幀,能夠滿足視覺系統(tǒng)的實(shí)時(shí)性需求。但在實(shí)際應(yīng)用中,例如在霧氣遮擋、煙塵遮擋等天氣環(huán)境條件下,相機(jī)所捕獲的圖像信息將不再穩(wěn)定和可靠[4]。而不穩(wěn)定的圖像將嚴(yán)重影響視覺系統(tǒng)的工作[5],尤其在霧天條件下,由于特征稀疏[6],造成了視覺SLAM系統(tǒng)的穩(wěn)定性差,對視覺系統(tǒng)的工作精度以及工作效率造成很大影響,甚至?xí)鹫麄€(gè)視覺系統(tǒng)的癱瘓。
為解決上述問題,需研究一種適合于視覺SLAM系統(tǒng)的圖像去霧算法,使視覺SLAM系統(tǒng)在霧天環(huán)境下仍能具有較強(qiáng)的魯棒性。
本文構(gòu)建了ORBSLAM系統(tǒng)[3],并在后文使用圖像去霧算法對其進(jìn)行了改進(jìn),該系統(tǒng)主要由視覺里程計(jì)、圖優(yōu)化及閉環(huán)檢測模塊、建圖模塊組成。
視覺里程計(jì)的主要作用是建立攝像頭捕捉到的兩幀圖像之間的聯(lián)系,并由此計(jì)算相機(jī)的位姿變化和圖像中各點(diǎn)的空間位置。特征點(diǎn)法是實(shí)現(xiàn)視覺里程計(jì)的一種常用方法,通過匹配相鄰兩張圖像的共同特征點(diǎn),獲取相機(jī)的運(yùn)動(dòng)姿態(tài)以及空間位置。
ORB算子使用帶有形心向量的oFAST算法檢測圖像中的特征點(diǎn),使用對旋轉(zhuǎn)敏感的rBRIEF描述子對特征點(diǎn)進(jìn)行描述,相較于傳統(tǒng)的SIFT算子及SURF算子,計(jì)算量更低。本文所構(gòu)建的SLAM系統(tǒng)使用ORB算子進(jìn)行圖像的特征點(diǎn)檢測和描述,以提高運(yùn)算速度。
本文所構(gòu)建的SLAM系統(tǒng)使用閉環(huán)檢測算法和圖優(yōu)化算法共同保證所建地圖的有效性。
由于相機(jī)所采集的圖像中具有噪聲,SLAM系統(tǒng)在進(jìn)行建圖的過程中,不可避免會產(chǎn)生誤差,并且隨地圖的拓展不斷累積。為此,使用圖優(yōu)化算法進(jìn)行誤差抑制以提高建圖的準(zhǔn)確性。同時(shí),SLAM系統(tǒng)在運(yùn)動(dòng)到之前曾經(jīng)經(jīng)過的位置時(shí),由于存在誤差,在所建立的地圖中,系統(tǒng)的位置有時(shí)并不處于實(shí)際對應(yīng)位置。為此,引入閉環(huán)檢測模塊,在檢測到曾到達(dá)的位置時(shí),將信息輸入圖優(yōu)化模塊進(jìn)行處理,修正誤差。
拓?fù)涞貓D與度量地圖是SLAM系統(tǒng)中兩種較為常用的地圖類型。相較而言,度量地圖具有更多信息,可以表示更為復(fù)雜的地形,適合工作于未知環(huán)境下的SLAM系統(tǒng)。而點(diǎn)云地圖可直接使用特征點(diǎn)構(gòu)建地圖,是一種更為適合于視覺SLAM的地圖類型,本文使用點(diǎn)云地圖作為構(gòu)建地圖的類型。
在圖像去霧方面,Zhang等[7]對暗通道先驗(yàn)去霧算法進(jìn)行了優(yōu)化,提高了算法的運(yùn)算速度。何等[8]提出了一種快速圖像去霧算法,將算法運(yùn)行時(shí)間縮短了50%,但面對霧濃度不同的圖像時(shí),仍存在需手動(dòng)調(diào)整去霧參數(shù)的問題。針對當(dāng)前去霧算法存在的問題,本章提出了一種適用于視覺SLAM系統(tǒng)的自適應(yīng)圖像去霧算法。
基于大氣散射模型[9],可知霧天環(huán)境下圖像的退化滿足以下關(guān)系
F(x,y,z)=P(x,y,z)exp(-sh(x,y,z))+
L(1-exp(-sh(x,y,z)))
(1)
式中: exp(-sh) 代表介質(zhì)透射率,F(xiàn)為霧氣遮擋圖像,P為未受到霧氣遮擋的清晰圖像,h代表圖像的景深,s代表大氣散射系數(shù),L表示全局大氣光的值,且L=[Lo,Lo,Lo]T。
通過引入環(huán)境光N對式(1)進(jìn)行簡化表示
FL=P(L-N)+NL
(2)
因此,對一幅霧退化圖像,若求出環(huán)境光N及大氣光L,即可還原出去除霧氣遮擋的清晰圖像。
由式(1)可知
L(1-exp(-sh))≤F
(3)
求出霧氣遮擋圖像F各通道中的最小值D,則
(4)
對D進(jìn)行均值濾波,則可認(rèn)為介質(zhì)透射率的值滿足以下關(guān)系
(5)
式中:μ為偏移補(bǔ)償系數(shù),用來對介質(zhì)透射率進(jìn)行偏移補(bǔ)償,其計(jì)算公式如下
(6)
式中:γ是設(shè)定的去霧參數(shù),影響圖像的去霧程度。依據(jù)上式求出μ值后,聯(lián)立式(3)、式(4)以及式(5)估計(jì)介質(zhì)透射率的值和環(huán)境光的值
(7)
(8)
由式(5)可知,Davg≤L。 且L的值小于圖像三通道的最大值。因此可估計(jì)大氣光L的值
(9)
獲取環(huán)境光N和大氣光L的估計(jì)值之后,代入式(2)進(jìn)行運(yùn)算可還原出去霧圖像。在進(jìn)行還原運(yùn)算時(shí),參數(shù)γ越大則去霧圖像的去霧效果越強(qiáng)。
由于SLAM系統(tǒng)所處環(huán)境的霧濃度是未知的,因此在不同環(huán)境下使用固定去霧參數(shù)γ會導(dǎo)致圖像過度去霧或去霧不完全,若過度去霧會導(dǎo)致圖像失真[10],使SLAM系統(tǒng)檢測到錯(cuò)誤的特征;而去霧不完全將導(dǎo)致圖像無法滿足SLAM系統(tǒng)提取特征點(diǎn)[11]的需求。
為解決去霧算法無法根據(jù)圖像霧濃度自適應(yīng)調(diào)節(jié)去霧參數(shù)γ的問題,本文使用去霧參數(shù)的校正算法對2.1節(jié)中的去霧算法進(jìn)行了改進(jìn)。
根據(jù)式(7)和式(1),當(dāng)介質(zhì)透射率為1-D/Lo時(shí),意味著去霧圖像滿足以下條件[12]
(10)
在去霧圖像P中滿足式(10)條件的像素點(diǎn)處,RGB三通道中必有一通道取值為0,即該像素點(diǎn)的三通道之一在進(jìn)行去霧計(jì)算時(shí)受到阻塞,下文將該類像素點(diǎn)稱為阻塞點(diǎn)。阻塞點(diǎn)的去霧程度較深,易導(dǎo)致圖像失真。因此,整幅圖像阻塞點(diǎn)占比越高,則表示整幅圖像去霧程度以及圖像失真程度越高。
圖像阻塞點(diǎn)占比β的計(jì)算公式如下
(11)
式中:Z為阻塞點(diǎn)數(shù)目,N為圖像像素點(diǎn)總數(shù)。
使用2.1節(jié)中所述基于大氣散射模型的圖像去霧算法,設(shè)置了不同去霧參數(shù)γ對收集到的100張含霧圖像進(jìn)行了去霧處理。部分圖像去霧效果如圖1所示,從圖像中可以看出圖像的去霧程度越深,阻塞點(diǎn)占比β越大。
圖1 部分圖像的去霧效果
又由式(6)知,參數(shù)γ的取值可決定圖像的去霧程度。
因此,依據(jù)阻塞點(diǎn)占比β反映圖像去霧程度、去霧參數(shù)γ決定圖像去霧程度的原理,提出了一種自適應(yīng)去霧算法,算法的核心思想是:設(shè)定去霧圖像理想阻塞點(diǎn)占比βt,在對視頻前一幀圖像進(jìn)行去霧處理后,計(jì)算去霧圖像的實(shí)際阻塞點(diǎn)占比β,若β過大或過小則根據(jù)理想阻塞點(diǎn)占比與實(shí)際阻塞點(diǎn)占比之間的差值Δβ校正去霧算法中的參數(shù)γ,然后再繼續(xù)對下一幀圖像進(jìn)行處理,如此每處理一幀圖像就對去霧參數(shù)γ進(jìn)行一次校正,以保證去霧算法在未知霧濃度環(huán)境下的去霧效果,算法流程如圖2所示。
圖2 自適應(yīng)去霧算法流程
為確定理想阻塞點(diǎn)占比βt,對100張含霧圖像的去霧結(jié)果進(jìn)行了比較,得出了如下結(jié)論:當(dāng)去霧圖像的阻塞點(diǎn)占比為0.4%-4%時(shí),圖像的去霧效果較好,在檢測去霧圖像中特征點(diǎn)時(shí)不易出現(xiàn)特征點(diǎn)過少的現(xiàn)象;當(dāng)去霧圖像的β值在0.8%左右時(shí),去霧圖片不易出現(xiàn)失真現(xiàn)象,去霧效果最理想,因此,可將去霧圖像的理想阻塞點(diǎn)占比βt設(shè)為0.8%。
接下來,需設(shè)定合適的去霧參數(shù)γ初值,以縮短參數(shù)校正的過程、提高自適應(yīng)算法的效率。為此,對收集到的100張含霧圖像分別進(jìn)行去霧處理,使去霧圖像的阻塞點(diǎn)占比β=0.8%, 并記錄此時(shí)去霧參數(shù)γ的值,獲得了100張去霧圖像β=0.8%時(shí)的γ分布柱狀圖如圖3所示,圖中曲線為根據(jù)γ的平均值和標(biāo)準(zhǔn)差生成的正態(tài)分布曲線。
圖3 γ的取值分布柱狀圖
根據(jù)圖中γ的取值分布特征和正態(tài)分布曲線特征,將去霧參數(shù)γ的初值設(shè)定為1.15。
在校正去霧參數(shù)γ時(shí),自適應(yīng)算法結(jié)合了PID算法,令Δβ=βt-β, 則每次校正的校正量為
(12)
實(shí)際上對連續(xù)的圖像來說,即便使用相同的去霧參數(shù)γ,去霧圖像的阻塞點(diǎn)占比β仍會產(chǎn)生一定的波動(dòng)。在這種情況下PID算法中的微分項(xiàng)將會影響算法性能,因此將PID算法簡化為PI算法
(13)
為方便確定上式中的Kp和Ki,本文統(tǒng)計(jì)了去霧圖像不同阻塞點(diǎn)占比β與對應(yīng)去霧參數(shù)γ的數(shù)據(jù),以探究圖像阻塞點(diǎn)占比β與去霧參數(shù)γ之間的關(guān)系。結(jié)果表示:對絕大多數(shù)含霧圖像,均存在對應(yīng)的參數(shù)a,b∈[0,1], 當(dāng)參數(shù)γ的取值在 [a,b] 內(nèi)時(shí),γ和β滿足非線性正相關(guān)關(guān)系;當(dāng)參數(shù)γ取值在 [0,a] 內(nèi)時(shí),圖像不存在阻塞點(diǎn);當(dāng)參數(shù)γ取值在 [b,1] 內(nèi)時(shí),μ值不隨γ增大而增大,阻塞點(diǎn)占比β恒定不變。圖4所示為圖1中3幅含霧圖像在去霧過程中的β-γ關(guān)系曲線,從該圖中可以看出β與γ之間的關(guān)系。
圖4 去霧圖像的β -γ關(guān)系曲線
根據(jù)β-γ關(guān)系曲線特征以及阻塞點(diǎn)占比和圖像去霧效果之間的關(guān)系特征,設(shè)計(jì)校正約束條件
(14)
(15)
Δγ=0, Δβ∈(-0.001,0.001)
(16)
(17)
(18)
(19)
其中,m為算法在校正參數(shù)γ的過程中γ=0的次數(shù),Vn為校正過程中Δβ變換符號的次數(shù)。式(16)為算法在有霧環(huán)境下的校正結(jié)束條件,當(dāng)滿足該結(jié)束條件時(shí),結(jié)束校正過程,使校正算法休眠,在接下來的運(yùn)行過程中若檢測到β<4%或β>0.4%, 則重新喚醒校正算法,對去霧參數(shù)進(jìn)行調(diào)整。式(18)為算法在無霧環(huán)境下的校正結(jié)束條件,在無霧環(huán)境下將去霧參數(shù)設(shè)置為0。
在校正過程中,為保證自適應(yīng)算法的收斂性,避免發(fā)生校正失敗的情況,當(dāng)檢測到β的取值由0.8%的一側(cè)向另一側(cè)發(fā)生跳變時(shí),開始記錄算法每次迭代后γ和β的值,若繼續(xù)歷經(jīng)20次迭代后仍無法滿足算法的結(jié)束條件,則結(jié)束參數(shù)校正過程,令γ為迭代過程中使阻塞點(diǎn)占比最接近0.8%時(shí)的值
γ=γr, |βn-βt|≥|βr-βt|, (n=1.2.3…20)
(20)
自適應(yīng)算法的偽代碼如下:
adaptive-algorithm:
procedure Calm()
{01} if (β=0) m=m+1;
{02} if (m≥8) mflag=true;γ=0;
procedure Calend()
{03} if (|Δβ|≤0.001) endflag=true;sleepflag=false;m=0;num=0;
procedure Calsleep()
{04} if (preΔβ1*Δβ<0) sleepflag=true;
{05} if (sleepflag){
{06} num=num+1;
{07} if (num=1) preγ=γ;preΔβ=Δβ;
{08} |preΔβ|=fabs(preΔβ);
{09} if (|Δβ|<|preΔβ|)preγ=γ;preΔβ=Δβ;
{10} if (num≥20) totalendflag=true;γ=preγ;}
procedure Main()
{11} initialize();
{12} if ((endflag)OR(totalendflag)OR(mflag))reset=0;
{13}γ=γ+reset;
{14} P=dehaze(F,γ);
{15} Δβ=getdelta();
{16} |Δβ|=fabs(Δβ)
{17} if (reset≠0)Calm();Calsleep();Calend();
{18} if ((β>0.04)OR(β<0.004))endflag=false;
{19} reset=Calreset();
{20} preΔβ1=Δβ;
偽代碼中,F(xiàn)代表有霧圖像,P代表去霧圖像,initia-lize 函數(shù)為定義函數(shù),負(fù)責(zé)對代碼中的變量進(jìn)行定義,dehaze 函數(shù)負(fù)責(zé)對圖像進(jìn)行去霧處理,getdelta函數(shù)負(fù)責(zé)計(jì)算Δβ,Calreset函數(shù)負(fù)責(zé)根據(jù)式(13)計(jì)算校正量Δγ,代碼中去霧參數(shù)γ的初始值為1.14,reset的初始值為0.01。
使用上述算法對圖像進(jìn)行去霧處理可獲得較好的去霧效果,考慮到去霧算法的應(yīng)用場景,本文使用特征點(diǎn)數(shù)量對圖像的去霧效果進(jìn)行評價(jià),檢測到的特征點(diǎn)數(shù)量越多,則SLAM系統(tǒng)可用于建圖的信息越多、圖像去霧效果越好。
基于VisualStdio2010,驗(yàn)證本文自適應(yīng)去霧算法的去霧效果及算法與SLAM系統(tǒng)結(jié)合后的運(yùn)算速度,使用的圖像來源于網(wǎng)絡(luò),運(yùn)行環(huán)境為Intel(R) Core(TM)i7-4900CPU@3.6 GHZ,4 G物理內(nèi)存,64位win7系統(tǒng)。在運(yùn)算速度方面,本文算法處理一幅800×600圖像平均耗時(shí)0.01 ms,將本文算法作為前端與所建立的運(yùn)算速度為每秒30幀的SLAM系統(tǒng)結(jié)合后,系統(tǒng)的運(yùn)算速度可達(dá)到每秒23幀,考慮到現(xiàn)有相機(jī)的幀數(shù)一般在20幀左右,因此本文算法可以基本滿足SLAM系統(tǒng)的實(shí)時(shí)性需求。
在去霧效果方面,使用本文算法、基于大氣散射模型的快速去霧算法[13]以及HE算法[7]分別對圖像進(jìn)行了去霧處理,獲得的實(shí)驗(yàn)結(jié)果如圖5所示。在實(shí)驗(yàn)中,使用如下方式設(shè)定快速去霧算法和HE算法的去霧參數(shù):隨機(jī)選取一幅實(shí)驗(yàn)圖像,針對選定圖像設(shè)定合適的去霧參數(shù)。最終針對圖像2將快速去霧算法的去霧參數(shù)設(shè)定為1.21;針對圖像3將HE算法的去霧參數(shù)設(shè)定為0.67。對圖5(b)~圖5(d)進(jìn)行比較可以看出,快速去霧算法在處理圖像1和圖像3時(shí)去霧效果較差;HE算法在處理圖像1和圖像2時(shí)去霧效果較差。而本文算法在處理3幅圖像時(shí)均獲得了較好的去霧效果。
圖5 算法去霧后的效果
下面使用ORB算子分別對圖5中的去霧圖像進(jìn)行特征點(diǎn)檢測,特征點(diǎn)檢測結(jié)果見表1。
表1 去霧圖像有效特征點(diǎn)檢測結(jié)果
由表1和圖5可知,現(xiàn)有去霧算法一旦針對某幅圖像設(shè)置了去霧參數(shù),就會導(dǎo)致算法對其它圖像的去霧效果不佳。相較而言,本文算法在面對不同霧濃度的圖像時(shí)可以獲得更好的去霧效果。
下面檢驗(yàn)本文算法校正去霧參數(shù)的效率:使用本文算法將去霧參數(shù)γ的初值設(shè)定為0和2.5,以模擬霧濃度發(fā)生突變的情況。共對3個(gè)場景下的圖像進(jìn)行了處理,并獲取了算法校正去霧參數(shù)γ所需要的圖像幀數(shù),見表2。
表2 參數(shù)校正實(shí)驗(yàn)結(jié)果
由表2可知:在運(yùn)算速度為每秒23幀的SLAM系統(tǒng)中,本文算法平均僅需9.17幀圖像即0.398 s的時(shí)間即可完成參數(shù)γ的自適應(yīng)校正,說明本文算法可以快速適應(yīng)不同霧濃度的環(huán)境。
本章對采用了自適應(yīng)去霧前端的改進(jìn)SLAM系統(tǒng)進(jìn)行了模擬實(shí)驗(yàn),驗(yàn)證了其具有良好的魯棒性,實(shí)驗(yàn)所用視頻來源于網(wǎng)絡(luò)。
使用自適應(yīng)圖像去霧算法作為整個(gè)SLAM系統(tǒng)的前端,將霧化圖像還原為清晰圖像后再進(jìn)行特征點(diǎn)提取及匹配等運(yùn)算。SLAM系統(tǒng)框架如圖6所示。
圖6 改進(jìn)SLAM系統(tǒng)框架
基于UBUNTU16.04操作系統(tǒng),對改進(jìn)的視覺SLAM系統(tǒng)進(jìn)行了模擬實(shí)驗(yàn),使用霧天環(huán)境下汽車行車記錄儀錄制的視頻,模擬視覺SLAM系統(tǒng)在該霧天環(huán)境下的運(yùn)行,并以改進(jìn)前的視覺SLAM系統(tǒng)為對照,隨機(jī)選取視頻中的一幀繪制了特征點(diǎn)匹配效果對比和運(yùn)行結(jié)果對比,如圖7所示。
圖7 實(shí)驗(yàn)結(jié)果對比
在實(shí)驗(yàn)中,改進(jìn)前系統(tǒng)在視頻116幀時(shí)成功建立初始地圖,但隨著相機(jī)的運(yùn)動(dòng),由于無法將新的特征點(diǎn)加入到構(gòu)建的地圖中,地圖無法隨相機(jī)視角的前移而進(jìn)行拓展,SLAM系統(tǒng)無法繼續(xù)運(yùn)行。改進(jìn)的SLAM系統(tǒng)在111幀時(shí)成功建立初始地圖,由于可以連續(xù)檢測到足夠的特征點(diǎn),直至視頻結(jié)束,SLAM系統(tǒng)都可以保持正常運(yùn)行。這驗(yàn)證改進(jìn)的SLAM系統(tǒng)具有更好的魯棒性。
針對視覺SLAM算法在霧天環(huán)境下表現(xiàn)不佳的問題,本文提出了一種適用于視覺SLAM系統(tǒng)的自適應(yīng)去霧算法,該算法根據(jù)反饋的去霧效果對去霧參數(shù)進(jìn)行實(shí)時(shí)校正。相較于現(xiàn)有去霧算法,本文所提出的算法對未知霧濃度環(huán)境下的圖像具有更好的去霧效果。使用本文所提出的算法作為去霧前端后,視覺SLAM系統(tǒng)在模擬運(yùn)行實(shí)驗(yàn)中表現(xiàn)出了更好的魯棒性。