毛昕蓉,劉鎧銘,汪樂意,韓曉冰
(西安科技大學(xué) 通信與信息工程學(xué)院,陜西 西安 710054)
當(dāng)具有理想形狀的透鏡與圖像傳感器保持嚴(yán)格平行時(shí),攝像頭采集的圖像不存在任何非線性畸變。但由于制造工藝、安裝誤差等原因,現(xiàn)實(shí)中不存在理想的透鏡,而且將透鏡和圖像傳感器平面保持嚴(yán)格平行是非常困難的[1]。因此,攝像頭真實(shí)的成像效果往往會(huì)存在一定程度的非線性畸變[2]。含有非線性畸變的圖像在一些定量分析,圖像測(cè)量領(lǐng)域中會(huì)降低圖像中物體的幾何位置精度[3],所以,在進(jìn)行相關(guān)圖像處理之前,需要完成畸變矯正這一預(yù)處理?;趥鹘y(tǒng)的串行處理器實(shí)現(xiàn)圖像畸變矯正的實(shí)時(shí)性會(huì)隨著圖像分辨率的提升而變差,不適合應(yīng)用在實(shí)時(shí)性要求高的場(chǎng)景。相比之下,融合了ASIC 和基于處理器系統(tǒng)的最大優(yōu)勢(shì)的FPGA,既能提供硬件定時(shí)的速度與穩(wěn)定性,其靈活性也與基于處理器系統(tǒng)上運(yùn)行的軟件相當(dāng)[4],非常適合實(shí)現(xiàn)圖像的實(shí)時(shí)畸變矯正。因此,本文針對(duì)FPGA 實(shí)現(xiàn)圖像畸變矯正算法做了相關(guān)的理論研究。
基于圖像映射的畸變矯正算法由兩個(gè)基本操作組成:一是對(duì)圖像平面上的像素點(diǎn)按照畸變模型進(jìn)行重新排列;二是對(duì)空間變換后的像素點(diǎn)的灰度值重新賦值[5]。根據(jù)處理數(shù)據(jù)流向的不同,重新排列的方式可分為兩種[6]:一是計(jì)算源圖像任意像素點(diǎn)經(jīng)映射后在目標(biāo)圖像中的坐標(biāo)位置,即前向映射;二是計(jì)算目標(biāo)圖像任意像素點(diǎn)經(jīng)映射后在源圖像中的坐標(biāo)位置,即逆向映射。前向映射和逆向映射的關(guān)系如(1)式所示:
式中:(u,v)是目標(biāo)圖像像素坐標(biāo);(x,y)是源圖像像素坐標(biāo)。相比前向映射,遍歷目標(biāo)圖像的像素點(diǎn)的逆向映射不會(huì)出現(xiàn)空點(diǎn)像素問題,因此像素點(diǎn)的重新排列方式常選用逆向映射。逆向映射坐標(biāo)的獲取可利用相機(jī)的內(nèi)參數(shù)矩陣H、畸變系數(shù)ki(i=1,2,3)和pi(i=1,2)來計(jì)算。假設(shè)(xp,yp)是目標(biāo)圖像上的像素點(diǎn),(xs,ys)為像素點(diǎn)(xp,yp)對(duì)應(yīng)的逆向映射坐標(biāo),則逆向映射坐標(biāo)(xs,ys)計(jì)算如(2)式和(3)式所示[7]:
由于經(jīng)逆向映射得到的坐標(biāo)一般是非整數(shù),即計(jì)算出的像素坐標(biāo)不落在原圖像的像素點(diǎn)上而是在其附近,故需要進(jìn)行插值處理??紤]到不同插值算法的插值效果和硬件實(shí)現(xiàn)成本[8],本文利用雙線性內(nèi)插值對(duì)空間變換后像素點(diǎn)的灰度值重新賦值,如圖1 所示。
雙線性內(nèi)插值計(jì)算過程如(4)式所示,在兩個(gè)方向分別進(jìn)行一次線性插值后,可得到目標(biāo)像素的灰度值I[9]。
從(2)式和(3)式中可以看出,逆向映射坐標(biāo)(xs,ys)的計(jì)算需要經(jīng)過非常復(fù)雜的運(yùn)算,主要包括多階矩陣求逆,矩陣與坐標(biāo)相乘,各種參數(shù)(浮點(diǎn)數(shù))與坐標(biāo)相乘等運(yùn)算。若是直接利用FPGA 在線計(jì)算逆向映射坐標(biāo),將會(huì)耗費(fèi)大量的乘法器等資源[10],而FPGA 芯片上如乘法器之類的資源是有限的,F(xiàn)PGA 芯片越低端,數(shù)量越少,因此乘法器等資源需要節(jié)約使用。而且FPGA 本身也并不適合實(shí)現(xiàn)太復(fù)雜的運(yùn)算,因此利用FPGA 進(jìn)行在線計(jì)算逆向映射坐標(biāo)是不可取的。
由于相機(jī)的內(nèi)參數(shù)矩陣、畸變系數(shù)是固定不變的[11],即目標(biāo)圖像到源圖像的坐標(biāo)映射是固定不變的,因此可先將目標(biāo)圖像的像素點(diǎn)遍歷一遍,計(jì)算出各像素點(diǎn)的逆向映射坐標(biāo)(xs,ys),形成一個(gè)逆向映射表,然后將逆向映射表存入FPGA 的片上ROM 中。在進(jìn)行逆向映射時(shí),只需通過查找片上ROM 中的逆向映射表就可以獲得較高精度的逆向映射坐標(biāo),這比計(jì)算一個(gè)參數(shù)模型快得多,避免了在FPGA 上耗費(fèi)大量的邏輯資源去實(shí)現(xiàn)復(fù)雜的在線計(jì)算。該過程如圖2 所示。
得到逆向映射坐標(biāo)后,F(xiàn)PGA 還需實(shí)現(xiàn)目標(biāo)像素點(diǎn)的重新賦值。此時(shí)可憑逆向映射坐標(biāo)從幀緩存中獲得對(duì)應(yīng)的插值窗口的4 個(gè)角點(diǎn)的灰度值進(jìn)行雙線性內(nèi)插值計(jì)算,并將計(jì)算得到的灰度值賦給目標(biāo)圖像的像素點(diǎn)即可。由(4)式可知,雙線性內(nèi)插值計(jì)算主要是小數(shù)與整數(shù)的乘法運(yùn)算和加法運(yùn)算[12],因此FPGA 可以較小的邏輯資源直接實(shí)現(xiàn)雙線性內(nèi)插值計(jì)算。
圖1 雙線性插值Fig.1 Bilinear interpolation
圖2 基于逆向映射表的逆向映射Fig.2 Reverse mapping based on reverse mapping table
綜上所述,利用FPGA 實(shí)現(xiàn)矯正圖像畸變算法的過程如圖3 所示。
圖3 矯正圖像畸變算法的FPGA 實(shí)現(xiàn)Fig.3 Implementation of image distortion correction algorithms based on FPGA
圖3 中,圖像畸變矯正算法的FPGA 實(shí)現(xiàn)過程為:
步驟1:從逆向映射表(存儲(chǔ)于片上ROM)中查找出與目標(biāo)圖像(經(jīng)矯正的圖像)當(dāng)前像素點(diǎn)對(duì)應(yīng)的逆向映射坐標(biāo) (xs,ys);
步驟2:憑逆向映射坐標(biāo)(xs,ys)從幀緩存中獲取對(duì)應(yīng)的插值窗口的4 個(gè)角點(diǎn)的灰度值并進(jìn)行雙線性內(nèi)插值計(jì)算,將計(jì)算得到的灰度值賦給當(dāng)前像素點(diǎn);
步驟3:跳到目標(biāo)圖像的下一個(gè)像素點(diǎn),重復(fù)步驟1 和步驟2,直到遍歷完一幀圖像中的所有像素點(diǎn)。
常見的FPGA 芯片的片上內(nèi)存容量普遍較小,如型號(hào)為Cyclone IV EP4CE115F29 的FPGA 芯片有432 個(gè)M9K 內(nèi)存模塊,總大小約為3.79 Mb。而需要進(jìn)行畸變矯正圖像尺寸越大,則對(duì)片上內(nèi)存的容量需求越大。以分辨率為640×480 像素的圖像為例,其逆向映射坐標(biāo)(xs,ys)中的xs(表示列)可由10 位整數(shù)位,7 位小數(shù)位的二進(jìn)制表示;ys(表示行)由9 位整數(shù)位,7 位小數(shù)位的二進(jìn)制表示,此時(shí)逆向映射表的大小如(5)式所示:
由(5)式可知,片上ROM 無法存儲(chǔ)未經(jīng)壓縮的逆向映射表,針對(duì)這個(gè)問題,Akin 提出了將逆向映射表存進(jìn)DRAM 中,而鄭永瑞則將其固化在ROM 芯片中,開始矯正時(shí)緩存到DDR2 芯片中[13]。但這些方法會(huì)增加設(shè)計(jì)的復(fù)雜度并降低處理速度,為了發(fā)揮片上ROM 的硬件加速功能,需將逆向映射表壓縮至合適的大小。映射坐標(biāo) (xs,ys)的獲取方式如圖4 所示。
圖4 逆向映射坐標(biāo)(xs,ys)的獲取Fig.4 Acquisition of inverse mapping coordinates (xs,ys)
由于攝像頭采集的圖像因非線性畸變?cè)斐傻淖冃未嬖谥B續(xù)性,即目標(biāo)圖像中毗鄰像素點(diǎn)的逆向映射坐標(biāo)是平滑的且變化緩慢,因此可仿效圖像縮放的原理[14],對(duì)逆向映射表進(jìn)行壓縮。從計(jì)算的角度來看,最簡單的壓縮方式就是對(duì)逆向映射表進(jìn)行降采樣[15],從而降低逆向映射表的分辨率,使其能夠存進(jìn)片上ROM,然后在FPGA 上通過插值來重建期望的逆向映射表。此時(shí),圖3 中逆向
1)基于降采樣壓縮逆向映射表
以分辨率為640×480 像素的圖像為例,未經(jīng)壓縮的逆向映射表分辨率為640×480 像素。圖5 所示為逆向映射表的一部分(n+1 行641 列,第641列為重建需要增加的一列)。
圖5 中,k=640/n,增加的第641 列是為了保證第k個(gè)窗口在重建時(shí)有一個(gè)完整的插值窗口,第641 列復(fù)制了第640 列的數(shù)值(同理增加第481 行)。對(duì)逆向映射表進(jìn)行降采樣時(shí),可在水平和垂直方向上每隔n-1 個(gè)存儲(chǔ)單元采樣一個(gè)存儲(chǔ)單元存入新的逆向映射表,此時(shí)經(jīng)過壓縮的逆向映射表分辨率rcomp如(6)式所示,經(jīng)壓縮的逆向映射表分辨率rcomp與未壓縮的逆向映射表分辨率rori的比例因子S如(7)式所示。
圖5 逆向映射表的壓縮Fig.5 Compression of reverse mapping table
從(7)式可以看出,當(dāng)n越大,比例因子S越大,則壓縮程度越大,逆向映射表對(duì)存儲(chǔ)空間的需求越低。
2)基于插值法重建逆向映射表
不同的插值算法重建降采樣后的逆向映射表,所需的采樣點(diǎn)數(shù)量,消耗的邏輯資源也不同。3 次內(nèi)插法所需的采樣點(diǎn)數(shù)量較少,但算法復(fù)雜度高,在計(jì)算給定位置的映射時(shí)所需的邏輯資源較多,計(jì)算速度慢;雙線性內(nèi)插法所需的采樣點(diǎn)數(shù)量雖然要多于3 次內(nèi)插法,但由于雙線性內(nèi)插法較簡單,在計(jì)算給定位置的映射時(shí)所需的邏輯資源較少,計(jì)算速度快。因此,本文采用雙線性內(nèi)插法來重建期望的逆向映射表,其原理如圖6 所示。
由于逆向映射表中的一個(gè)存儲(chǔ)單元同時(shí)存儲(chǔ)了xs和ys,故xs和ys的值需分別計(jì)算。以計(jì)算xs為例,圖6 中黑色的點(diǎn)I1、I2、I3和I4為降采樣后的逆向映射表中的4 個(gè)xs,灰色點(diǎn)I和空心點(diǎn)都為重建逆向映射表時(shí)數(shù)值未知的xs。設(shè)點(diǎn)I1、I2、I3和I4之間的水平和垂直距離都為n,Δx為點(diǎn)I的水平方向權(quán)值,Δy為點(diǎn)I的垂直方向權(quán)值,利用雙線性內(nèi)插法去擬合4 個(gè)點(diǎn)I1、I2、I3和I4之間的(n+1)2-4 個(gè)xs的數(shù)值,以圖中的點(diǎn)I為例,其計(jì)算過程如(8)式所示:
從(8)式可以看出,當(dāng)在FPGA 上利用雙線性內(nèi)插法在線重建逆向映射表時(shí),需要實(shí)現(xiàn)除數(shù)為n的除法運(yùn)算。在FPGA 上實(shí)現(xiàn)除數(shù)不等于2i(i=1,2,3···)的除法會(huì)耗費(fèi)較多的邏輯資源,但如果除數(shù)為 2i(i=1,2,3···)時(shí),硬件實(shí)現(xiàn)上只需要做右移i位的操作便可實(shí)現(xiàn)除法,因此當(dāng)n等于2i(i=1,2,3···)時(shí),硬件實(shí)現(xiàn)雙線性內(nèi)插法計(jì)算的成本最小。而經(jīng)降采樣后逆向映射表的大小為原來的1/S。
3)優(yōu)化后算法的分析
基于坐標(biāo)映射的圖像畸變矯正算法是目前最為成熟和有效的畸變矯正方法。但基于不同插值方法的映射算法在圖像質(zhì)量,資源消耗等方面都存在一定差[16],這些差異會(huì)影響最終在FPGA 上實(shí)現(xiàn)的效果。常用的插值方法有最鄰近元法和3 次內(nèi)插值方法。最鄰近元法雖然速度快,資源使用量小,但是矯正后的圖像質(zhì)量不佳,易產(chǎn)生鋸齒失真。3 次內(nèi)插值法能夠得到較好的圖像質(zhì)量,但是算法代價(jià)過大,會(huì)消耗大量的加法器和乘法器資源,十分不適于在FPGA上進(jìn)行實(shí)現(xiàn)。本文所采用的雙線性內(nèi)插方法結(jié)合了兩者的優(yōu)點(diǎn),在保證圖像質(zhì)量的同時(shí),有效降低了算法開銷和邏輯資源占用,使之能更好地在FPGA 平臺(tái)上進(jìn)行實(shí)現(xiàn)。表1 給出了基于幾種不同插值算法的畸變矯正算法的比較。
表1 3 種畸變矯正算法的比較Table 1 Comparison of three distortion correction algorithms
圖6 雙線性內(nèi)插法實(shí)現(xiàn)逆向映射表的重建Fig.6 Reconstruction of reverse mapping table by bilinear interpolation
為了驗(yàn)證本文提出方法的有效性,采用了一個(gè)含有枕型畸變的正交網(wǎng)格圖作為待矯正圖像,采用本文的方法對(duì)其進(jìn)行矯正,其結(jié)果如圖7 所示。從結(jié)果可以看出,相較于圖7(a)中含有枕型畸變的正交網(wǎng)格線,經(jīng)過本文方法矯正后的圖像效果改善明顯,說明了本文提出的方法能夠很好地對(duì)圖像畸變進(jìn)行矯正。
為了進(jìn)一步說明通過壓縮逆向映射表來提高算法性能后對(duì)矯正結(jié)果的影響,本文在MATLAB上實(shí)現(xiàn)了逆向映射表(分辨率為640×480 像素)的壓縮,n的值取4、8、16 和32,然后利用經(jīng)雙線性內(nèi)插法在線重建的逆向映射表對(duì)一幅含桶型畸變的圖像進(jìn)行矯正,矯正效果如圖8 所示。
圖7 帶有枕型畸變的正交網(wǎng)格圖矯正結(jié)果Fig.7 Correction result of orthogonal grids with pillowtype of distortion
圖8 矯正效果對(duì)比Fig.8 Comparison of correction effect
圖8(a)的圖像是一幅由攝像頭采集的含有桶型畸變的原始圖像。圖8(b)中圖像為使用不經(jīng)壓縮的逆向映射表進(jìn)行矯正后所得的圖像。對(duì)比8(a)和8(b)可以明顯觀察到經(jīng)過矯正后圖形中的桶型畸變已經(jīng)消失,標(biāo)定板的邊緣已經(jīng)由外凸變?yōu)樗?,說明該矯正算法能夠很好地對(duì)畸變圖像進(jìn)行矯正。
另外,對(duì)比圖8(a)、8(c)、8(d)、8(e)幾幅圖片可以發(fā)現(xiàn),當(dāng)通過對(duì)參數(shù)n分別取n=4、n=8、n=16 時(shí)對(duì)逆向映射表進(jìn)行壓縮之后,使用本文中的算法對(duì)圖像畸變進(jìn)行矯正,其結(jié)果也較為理想。在圖8(c)、8(d)、8(e)中桶形畸變都被明顯矯正,且矯正后的圖像效果清晰,證明了可以通過壓縮逆向映射表的方式在得到清晰圖像的同時(shí)節(jié)省FPGA 的硬件資源,并減小算法復(fù)雜度。
圖9 灰度直方圖Fig.9 Gray histogram
值得注意的是,在圖8(f)中,當(dāng)n=32 時(shí)圖像出現(xiàn)了嚴(yán)重的失真。為了對(duì)該結(jié)果進(jìn)行分析,繪制了圖8 中圖像的灰度直方圖,如圖9 所示。通過觀察圖9 中的直方圖可以發(fā)現(xiàn),由于畸變矯正只是矯正了圖像的部分信息,矯正前后圖像的基本特征是一致的。因此,畸變圖像與經(jīng)過有效矯正后的圖像擁有近似的灰度直方圖分布。但是當(dāng)n=32時(shí),矯正后圖像的像素分布已經(jīng)嚴(yán)重偏離原始圖像,出現(xiàn)了馬賽克現(xiàn)象,細(xì)節(jié)嚴(yán)重丟失。
為了分析壓縮圖像映射表對(duì)于矯正后圖像的影響情況,以圖8(b)中的圖像作為標(biāo)準(zhǔn)圖像,分別計(jì)算8(c)、8(d)、8(e)、8(f)中圖像與8(b)中圖像的PSNR 與SSIM。以此來衡量圖像質(zhì)量的變化情況,結(jié)果如表2 所示。
表2 中,當(dāng)PSNR 高于40 dB 時(shí),說明圖像非常接近標(biāo)準(zhǔn)矯正圖像,質(zhì)量非常好;低于20 dB 時(shí),說明圖像質(zhì)量很差,已不可接受。而SSIM 值越高,則表明圖像失真越小。
由上述的仿真結(jié)果可知,適當(dāng)降采樣后的逆向映射表可以很好地實(shí)現(xiàn)圖像畸變矯正,能夠在保證圖像清晰度的情況下將逆向映射表壓縮為原來的1/16。但通過對(duì)逆向映射表進(jìn)行降采樣再利用插值重建并不能無限制地減小其分辨率,其分辨率的大小取決于逆向映射的平滑度和重建所需的精度。
表2 利用經(jīng)壓縮的逆向映射表矯正畸變圖像的PSNR 和SSIMTable 2 Correction of PSNR and SSIM of distorted image using compressed reverse mapping table
通過搭建FPGA 雙目視覺采集系統(tǒng),驗(yàn)證本文算法的硬件可實(shí)現(xiàn)性。選用Intel FPGA Cyclone IV 系列EP4CE115F29C7 芯片作為圖像采集及預(yù)處理系統(tǒng)的核心,如圖10 所示。使用兩顆CMOS 圖像傳感器進(jìn)行采集,并在板上通過本文算法進(jìn)行處理。輸出結(jié)果顯示,采用本文算法后,能夠使得圖像畸變得到矯正,提高圖像質(zhì)量以滿足后續(xù)圖像處理的需求,如圖11所示。
圖10 FPGA 雙目視覺采集系統(tǒng)Fig.10 Binocular vision acquisition system based on FPGA
圖11 雙目視覺采集系統(tǒng)效果圖Fig.11 Effect diagram of binocular visual acquisition system
為了提高矯正含畸變圖像的實(shí)時(shí)性,本文研究了如何在FPGA 上實(shí)現(xiàn)畸變矯正算法。針對(duì)FPGA 實(shí)現(xiàn)圖像畸變矯正算法時(shí),存在在線計(jì)算逆向映射坐標(biāo)復(fù)雜和片上ROM 容量不夠的問題,對(duì)圖像畸變矯正算法進(jìn)行了優(yōu)化,即通過查找逆向映射表和對(duì)逆向映射表進(jìn)行降采樣再利用插值重建,降低了在線計(jì)算量和片上ROM 的容量需求。實(shí)驗(yàn)結(jié)果表明,在合適的分辨率下,優(yōu)化后的畸變矯正算法具有良好的矯正效果,并具有廣泛的實(shí)際應(yīng)用價(jià)值。