吳藝陽,樊 凡,2,周 怡,黃 珺,2
1.武漢大學 電子信息學院,武漢430072
2.武漢大學 宇航科學與技術研究院,武漢430072
仿射變換是一種實現原始圖像旋轉、縮放與平移并最終得到目標圖像的幾何變換,是圖像融合、圖像配準、圖像矯正等應用中不容或缺的步驟之一[1]。例如,在實時視頻圖像融合系統中,仿射變換可以實現來自不同波段圖像之間的配準[2];在全景相機中,全景圖像的拼接需要通過仿射變換實現[3];在醫學圖像應用中,仿射變換可以實現計算機斷層掃描(CT)涉及的坐標配準[4]。上述應用普遍要求系統的實時性達到30 Hz 幀頻[5]。相比ARM、DSP等處理器件,FPGA的靈活性更高、性能更強,采用FPGA 實現圖像的仿射變換能夠有效地提高系統的實時性[6-7]。但仿射變換中涉及大量的矩陣運算與插值運算,需要占用較多的邏輯資源,設計難度大[8-9]。因此,研究仿射變換FPGA的高吞吐率實現具有重要意義。
目前,國內外在實時視覺系統中的仿射變換FPGA實現均以反向映射為基本原理。這類方法需要使用存儲器緩存一幀原始圖像數據,然后根據目標像素的坐標從存儲器中讀取對應的四鄰域像素灰度值,最后采用雙線性插值算法確定目標像素灰度值。因為雙線性插值模塊需要從存儲器中同步讀取四鄰域像素,所以存儲器的傳輸數據帶寬是原始圖像數據流的4 倍。為了實現存儲器的4 倍數據帶寬需求,國內外研究人員提出了不同的方法。例如,Jiang 等人以及Gribbon 等人分別采用FPGA 內部存儲資源與外部存儲器緩存4幀相同的原始圖像,從而實現雙線性插值需要的4 路圖像數據流輸入,該方法存在存儲資源消耗大的問題[10-11]。為節約存儲資源FPGA 存儲資源,Ngo 等人以及王文治采用像素時鐘的4 倍頻時鐘從DPRAM 中讀取原始圖像數據[12-13];王金輝等人采用兩個單口SRAM 實現乒乓操作,并使用像素時鐘的4 倍頻時鐘讀取原始圖像[14]。上述實現方案可歸納為以下兩種:(1)使用4 個獨立的存儲資源對原始圖像進行存取[10-11];(2)采用像素時鐘的4倍頻對存儲器內部數據進行讀取[12-14]。第一種方式需要為4 個存儲器提供更多的引腳資源與設計空間,在增加FPGA 功耗的同時,不利于實時系統的小型化實現。第二種方式需要將存儲器的讀寫頻率提高至原始圖像時鐘頻率的4倍,考慮到存儲器存在最大讀寫頻率,所以這類提升頻率的方法會將系統數據吞吐率降低至第一種方式的1/4。
綜上所述,基于反向映射的仿射變換不能同時兼顧存儲資源消耗與數據吞吐率。其根本原因在于雙線性插值模塊需要在一個像素時鐘內從存儲器中讀取原始圖像四鄰域像素點,導致存儲器的傳輸數據帶寬需求為原始圖像流的4 倍。為解決該問題,本文提出了一種插值前置的仿射變換FPGA 實現方法,該方法采用四角點映射方式將雙線性插值計算提前到存儲器緩存原始圖像之前,避免了雙線性插值模塊對存儲器的直接讀取,從而降低了存儲器的傳輸數據帶寬需求。
目前,國內外在實時視覺系統中仿射變換的FPGA實現均以反向映射為基本原理。以反向映射為基礎的仿射變換采用順序掃描的方式遍歷目標圖像中的像素點,通過反向映射在原始圖像中確定與該像素點對應的四鄰域像素,并對四鄰域像素進行雙線性插值計算,最終建立目標圖像。反向映射的數學模型為[15]:

其中,( x,y)T是原始圖像中的坐標向量,( u,v)T是目標圖像中的坐標向量,( k1,k2)是圖像的縮放系數,θ 是圖像的旋轉角度參數,( t1,t2)是圖像的橫向與縱向平移參數。上述仿射參數{k1,k2,θ,t1,t2} 為預設值。
如圖1 所示,基于反向映射的仿射變換FPGA 實現流程可歸納為:(1)地址生成模塊根據行場同步信號產生目標圖像的地址信號流;(2)該地址信號流經過反向映射得到原始圖像中對應的坐標,并依此產生雙線性插值需要的4 個像素坐標以及插值權重;(3)存儲器接口使用4 路并行的數據鏈路從外部RAM 中同時讀取這4個坐標的像素值;(4)雙線性插值模塊根據同步輸入的插值權重與4 路原始圖像數據流輸出得到目標圖像數據流[16]。

圖1 反向映射FPGA實現原理設計框圖
從圖1 可以看出,基于反向映射的仿射變換FPGA實現方法需要從RAM 中同時讀取4 路原始圖像數據,該操作只能通過兩種方式實現:(1)使用4 個獨立的存儲器對原始圖像進行存取;(2)采用像素時鐘的4 倍頻對存儲器內部數據進行讀取。第一種方式需要為4 個存儲器提供更多的引腳資源與設計空間,同時增加了FPGA 的功耗,不利于實時系統的小型化實現。第二種方式需要將RAM 的讀寫頻率提高至原始圖像時鐘的4倍,考慮到RAM 存在最大讀寫頻率,所以該方法會將數據吞吐率降低至第一種方式的1/4。綜上所述,基于反向映射的仿射變換FPGA 實現方法不能同時兼顧存儲資源與數據吞吐率。
針對基于反向映射的仿射變換FPGA 實現方法存在的缺點,本文提出了一種基于前置插值的仿射變換理論,并詳細介紹該仿射變換的FPGA 實現方法,并對實現方法中涉及的簡化運算與相關的校驗運算進行了分析。
本文的想法是將雙線性插值的計算提前到存儲器緩存原始圖像數據流之前,即在原始圖像數據流輸入的同時便實現雙線性插值計算,從而避免存儲器讀寫圖像數據時所需的4 倍數據帶寬。為實現插值前置,本文提出一種基于四角點映射的數學模型,該模型采用滑動窗遍歷原始圖像坐標,并在滑動窗中通過前向映射與反向映射的結合建立原始圖像與目標圖像的映射關系。滑動窗的大小選取與仿射變換中應用的具體插值算法相關,滑動窗內應包含插值運算中所需的所有原始圖像坐標。因為本文提出的仿射變換方法中采用的是雙線性插值算法,所以選取2×2 大小的窗口作為滑動窗。基于前置插值的仿射變換具體實現原理描述如下:
(1)如圖2 所示,首先根據串行輸入的圖像數據流生成一個2×2 的滑動窗,即四角點對應的滑動窗,該滑動窗可以實現原始圖像坐標與像素值的同步傳輸,為后續的映射關系計算與雙線性插值計算提供時序上的同步。定義該窗口為四角點ABCD,ABCD 坐標即為四角點坐標。

圖2 四角點映射原理圖
(2)在已獲得四角點滑動窗的基礎上,需要建立原始圖像與目標圖像的映射關系,考慮到前向映射可在已知原始圖像坐標與仿射參數的基礎上實現映射關系的建立,本文采用前向映射將四角點滑動窗ABCD 的坐標映射到目標圖像,得到映射窗口A′B′C′D′,并在接下來 的 步 驟 中 從 映 射 窗 口A′B′C′D′中 獲 取ABCD 與A′B′C′D′之間像素的插值關系。其中,前向映射的數學模型為:

式(2)與式(1)互為反函數。
(3)通常情況下,映射后四角點A′B′C′D′的坐標包含小數部分,但是在基于FPGA 的數字圖像處理中,必須對目標圖像的整數坐標進行賦值才有意義。因此必須在A′B′C′D′內找到其內部的整數坐標( )u′,v′,并對其進行賦值。本文計算( )u′,v′的方式為:

其中( u1,v1)、( u2,v2)、( u3,v3)、( u4,v4)為映 射后 四角 點A′B′C′D′的坐標。為簡化FPGA 的計算復雜度,( u′,v′)分別由( u1, u2,u3,u4)與( v1, v2,v3,v4)中的最大值并向下取整得到。
(4)在坐標( u′,v′)確定之后,需要對( u′,v′)的灰度值進行賦值。考慮到從映射后四角點A′B′C′D′直接計算( u′,v′)的灰度值計算復雜度較高,從四角點ABCD 確定坐標( u′,v′)灰度值計算復雜度較低,所以本文采用反向映射原理將目標圖像中的( u′,v′)映射到原始圖像得到坐標( x′,y′),并通過雙線性插值算法確定( x′,y′)的灰度值。
(5)雙線性插值根據同步輸入的插值權重與4 路原始圖像數據確定目標像素的灰度值,并將該數據存儲到RAM 中。最后,在一幀原始圖像數據進行四角點映射處理之后,從RAM 中順序讀出數據,便可得到仿射變換后的圖像。
理論上講,數字圖像仿射變換的實現原理為:在仿射參數已知的情況下,通過某種映射計算方式建立原始圖像與目標圖像之間全部坐標及像素灰度值的映射關系。傳統的反向映射采用點對點映射方式遍歷目標圖像坐標,并確定該坐標在原始圖像中對應的四鄰域像素,最終對四鄰域像素進行插值計算。本文提出的基于前置插值的仿射變換方法根據反向映射的對稱性,通過四角點窗口遍歷原始圖像獲取目標圖像中所有與當前窗口存在映射關系的像素坐標,然后通過反向映射確定當前像素坐標的像素灰度值,最終實現目標圖像的建立。本文提出的基于前置插值的仿射變換方法需要實現四路并行的前向映射計算與一路的反向映射計算,實現難度與計算復雜度高于傳統的反向映射方法。考慮到FPGA 具有邏輯資源豐富,支持并行運算的特點,本文提出的基于前置插值的仿射變換方法在FPGA 實現中設計與實現難度較低,之后將介紹該方法的FPGA 實現架構。
根據3.1 節中介紹的基于前置插值的仿射變換原理,其FPGA 實現方法需要分別實現四角點坐標生成、四角點前向映射、坐標選取、反向映射、滑動窗并行輸出以及雙線性插值模塊6 個處理模塊,如圖3 所示。下面將分別介紹這6個部分的FPGA實現方法。
(1)四角點坐標生成模塊根據輸入的行場同步信號生成4路并行的原始圖像四角點坐標( xi,yi)T( i= 1,2,3,4)。
(2)四角點前向映射模塊對輸入的4 路坐標信號進行并行的前向映射計算得到4 路目標圖像坐標信號( ui,vi)T( i= 1,2,3,4)。前向模塊的FPGA 實現原理圖如圖4(a)所示,輸入的x 坐標與y 坐標通過乘法器與加法器實現與仿射參數的乘加運算,得到目標圖像坐標( u,v)。

圖3 基于前置插值的FPGA實現方法設計框圖

圖4 前向映射與反向映射FPGA實現原理圖
(3)坐標選取模塊根據映射窗坐標( ui,vi)T(i=1,2, 3,4 )選取當前窗口的插值坐標( u′,v′),其RTL級電路如圖5。坐標選取模塊由數據比較器組與數據選擇器組構成。數據比較器與數據選擇器的作用是得到映射坐標( ui,vi)T( i= 1,2,3,4 )中的最大值與最小值。當且僅當umax-umin=1 與vmax-vmin=1 兩個條件均成立時,坐標選取模塊輸出( umax,vmax)作為插值坐標( u′,v′)。當條件不成立時,意味著當前窗口不包含插值坐標,坐標選取模塊在當前時刻將輸出坐標(0,0)。

圖5 坐標選取部分RTL級電路
(4)反向映射實現對輸入的插值坐標( u′,v′)進行反向映射計算,得到對應的原始圖像坐標( x′,y′),并通過( x′,y′)與四角點坐標( xi,yi)T( i= 1,2,3,4 )的位置關系確定插值權重。如圖4(b)所示,反向映射的FPGA 實現也是通過乘法器與加法器對輸入坐標( u′,v′)與相關仿射參數的運算,得到原始圖像坐標( x′,y′)。
(5)滑動窗并行輸出模塊實現了原始圖像數據的串并轉換,其時序圖如圖6 所示。方法采用兩個串行的FIFO 緩存圖像數據,每個FIFO 內緩存圖像的一行數據。寄存器Reg1、Reg2、Reg3 與Reg4 對FIFO 輸出的數據進行流水緩存操作,從而實現圖像數據的并行輸出。其中,Reg1 與Rge3 內緩存的數據為同一列像素,Reg2與Reg4 內緩存的數據為同一列像素。當FIFO1 與FIFO2 均存滿一行數據時,寄存器組將會并行輸出當前2×2 窗口的像素值。該滑動窗結構實現了像素時鐘下雙線性插值模塊所需的4倍數據帶寬輸入。

圖6 滑動窗原理框圖及時序圖
(6)雙線性插值部分根據輸入的4 路原始圖像數據流與插值權重,得到仿射變換圖像數據流,并將其存入到外部存儲器中。當滑動窗遍歷原始圖像中所有的像素坐標之后,順序讀出外部存儲器中的數據流,即可得到最終的仿射變換圖像數據。
插值前置的仿射變換FPGA 實現方法實現了雙線性插值的前置計算,避免雙線性插值模塊對存儲器的直接讀取,降低存儲器的傳輸帶寬需求。
如上所述,為降低FPGA 的計算復雜度,本文提出的插值前置的仿射變換FPGA 實現方法在坐標選取部分中進行了簡化計算,具體的簡化過程為:坐標選取部分需要從映射窗口A′B′C′D′中選取插值坐標( u′,v′),通常情況下,A′B′C′D′的邊與圖像坐標軸為非平行關系,在A′B′C′D′中直接選取插值坐標( u′,v′)需要計算坐標( u′,v′)與A′B′C′D′形成的向量與映射窗口向量之間的內積,通過內積的取值判斷當前坐標是否在映射窗口A′B′C′D′內部。上述操作需要使用大量的乘法器資源,降低FPGA 處理圖像數據的實時性。因此,本文采用一種簡化計算的坐標選取方法,將選取的矩形窗擴大為映射窗口A′B′C′D′的外接矩形EFGH,并通過對EFGH坐標最大值向下取整遍歷的方式快速定位矩形窗內包含的整數坐標點。上述方法雖然降低了FPGA 的計算復雜度,但是矩形窗的外擴會在當前滑動窗中引入其余四角點滑動窗需要計算的插值坐標,如圖7 所示,映射窗口A′B′C′D′中的有效插值點為I,但矩形窗的外擴導致無效插值點K 的引入。從而造成K 點雙線性插值的重復計算,降低仿射圖像的插值精度。
針對上述問題,本文在反向映射部分中添加校驗計算模塊實現無效坐標點的剔除。其中,無效坐標點的定義為非當前滑動窗內的插值坐標點。根據前向映射與反向映射的對稱關系可知,當映射窗口中的插值坐標( u′,v′)為有效插值坐標時,該坐標通過反向映射計算后仍然在四角點ABCD 構成的滑動窗內,反之則會落于滑動窗外。根據上述性質,校驗模塊對選取到的插值坐標( u′,v′)進行反向映射計算得到坐標( x′,y′),判斷( x′,y′)是否在當前四角點的滑動窗內。若當前坐標( x′,y′)在四角點ABCD 構成的滑動窗內,則該坐標為有效坐標,并對該坐標進行后續的插值計算;若當前坐標不在滑動窗內,則判定該坐標為無效坐標,并進行舍棄。
校驗計算實現了在當前時刻僅對四角點滑動窗內的坐標進行插值計算,剔除由于插值坐標選取的FPGA簡化計算帶來的無效坐標點,避免對無效坐標點重復進行插值計算所導致的仿射圖像插值精度下降的問題。
為驗證本文提出的基于前置插值的仿射變換算法的可行性,本文在Matlab中對本文提出的方法進行了仿真,仿真實驗結果圖如圖8、圖9 與圖10 所示。圖8、圖9與圖10 中的圖(a)為原圖,圖(b)~圖(e)為不同仿射參數下的仿射變換圖像,其中實驗中的k 為縮放參數,θ 為旋轉參數,實驗中橫向與縱向縮放參數取值均為k。從實驗結果可以看出本文提出的基于前置插值的仿射變換算法可以實現不同參數下的仿射變換。

圖8 Venice基于前置插值的仿射變換Matlab仿真實驗圖

圖9 Office基于前置插值的仿射變換Matlab仿真實驗圖

圖10 Penguins基于前置插值的仿射變換Matlab仿真實驗圖
為驗證本文提出算法的插值精度,采用峰值信噪比(PSNR)衡量仿射圖像與原始圖像相符合程度。首先對原始圖像采用反向映射的方式對圖像進行旋轉得到兩幅相同的旋轉圖像,然后分別通過反向映射的方式與本文算法對旋轉圖像進行仿射變換得到仿射圖像,并與原始圖像進行比較得到PSNR。表1 給出了通過反向映射與無校驗的本文算法以及本文算法在不同圖像中的PSNR 指標表現,從表1 可以看出本文算法的插值精度與基于反向映射的仿射變換的插值精度基本一致,這是因為本文提出的算法與基于反向映射的仿射變換均采用雙線性插值實現插值計算,因此插值精度基本一致。與此同時,當本文算法缺少校驗算法時,PSNR指標將會出現下降,這是因為校驗模塊的缺少會使得本文算法對部分坐標進行重復插值,從而降低了插值精度。

表1 PSNR指標實驗對比數據 dB
為驗證本文提出的插值前置的仿射變換FPGA 實現方法在數據傳輸帶寬、存儲資源與數據吞吐率中的表現,本文采用Altera 公司的Cyclone V 5CEFA7U19C8N芯片,在Quartus II 14.1 的綜合編譯平臺上進行進一步驗證。在驗證實驗中,原始圖像數據流的輸入時鐘為6.75 MHz,幀頻為50 Hz。
表1 給出了本文提出的實現方法與其他文獻提出的方法在存儲器傳輸帶寬需求、外部存儲器個數、內部存儲器資源占用率、存儲器讀寫頻率與極限數據吞吐率的綜合比較情況。其中,存儲器傳輸帶寬需求為成像系統工作時存儲器在單位時間內的數據吞吐率。高存儲器傳輸帶寬需要通過消耗更多的存儲資源或者降低極限數據吞吐率實現。存儲器傳輸帶寬需求越低,系統的資源消耗與極限數據吞吐率綜合表現越好。fpixel為原始圖像的像素時鐘頻率,在輸入始終頻率相同的情況下,存儲器的讀寫頻率越高,則存儲器越容易到達讀寫頻率上限,系統的極限數據吞吐率越低。由表2 可得,文獻[10]雖然在不使用外部存儲器的情況下達到了最高的數據吞吐率,但片上存儲資源占用率高達80%,系統可擴展性差。文獻[11]所需的外部存儲器個數則高達4 個。文獻[12]與文獻[14]的存儲器讀寫頻率為像素頻率fpixel的4 倍,導致系統極限數據吞吐率僅為其他方法的1/4。本文的存儲器傳輸帶寬需求為其他方法的1/4,避免了反向映射方法中為實現4 倍傳輸數據帶寬而存在的存儲資源消耗高與降低數據吞吐率的問題。最終在使用1 個外部存儲資源并且內部存儲資源占用率僅為0.48%的情況下,達到最大的極限數據吞吐率,在存儲資源與數據吞吐率方面擁有最好的綜合表現。

表2 不同方法的指標對比(fpixel為原始圖像的像素時鐘頻率)
為說明本文提出的基于前置插值的仿射變換在FPGA實現中資源占用率情況,表3給出了Quartus II 14.1的綜合編譯資源報告。從表3 可以得到以下結論:本文提出的方法的ALM(算術邏輯資源),Registers(寄存器)與LUTs(查找表)的占用率均小于3%。與此同時,方法僅占用0.48%的Block Memory(片上存儲資源)與14.1%乘法器資源。總體上說,本文提出的插值前置的仿射變換FPGA 實現方法仍然剩余充足的邏輯資源用于其余圖像預處理算法中。

表3 AlteraCycloneV芯片資源占用表
本文將提出的基于前置插值的FPGA 實現方法應用于可見光與紅外圖像的實時融合系統之中,融合相機的實物圖如圖11 所示。其中,紅外相機得到的紅外圖像分辨率為400×300。可見光相機的型號為MT9M034,最高可輸出分辨率為1 280×960的可見光圖像。該相機可通過簡單的寄存器配置實現分辨率、幀頻等圖像參數的調節。因此,在實時相機融合系統中,本文提出的基于前置插值映射的仿射變換方法用于可見光相機的輸出端,對可見光圖像進行旋轉,縮放與平移,從而達到紅外圖像與可見光圖像像素間的對齊。首先,對紅外圖像進行圖像預處理,得到清晰的紅外圖像信息,并將紅外圖像數據傳輸到可見光相機所在的FPGA 芯片。與此同時,對可見光圖像進行仿射變換,實現紅外圖像與可見光圖像的像素對齊。其中,仿射參數由Matlab仿真獲得,并在系統初始化時便設置成固定參數。最后,對紅外圖像與可見光圖像進行同步處理之后,對同步的紅外圖像與可見光圖像進行融合處理。

圖11 融合相機實物圖
融合相機的實驗結果圖如圖12 所示。由實驗結果可得,本文提出的插值前置的仿射變換FPGA 實現方法可實現紅外圖像與可見光圖像像素間的對齊。

圖12 融合相機實驗結果
針對基于反向映射的仿射變換在FPGA 實現中遇到的存儲資源消耗高與數據吞吐率問題,本文提出了一種基于前置插值的仿射變換數學模型,實現了雙線性插值的前置計算,避免雙線性插值對存儲器的直接讀寫,降低存儲器的傳輸帶寬需求。實驗結果表明,本文提出的插值前置的仿射變換方法在實現實時仿射變換的同時,降低了存儲器的傳輸帶寬需求,擁有更好的存儲器占用率與數據吞吐率綜合表現。與此同時,本文提出的仿射變換方法成功實現紅外圖像與可見光圖像的像素間的對齊。