王 鵬,向厚振,張志杰
(中北大學信息與通信工程學院,山西 太原 030051)
通常情況下,對圖像的數字處理算法都是建立在馮諾依曼結構的通用處理器的軟件上進行,如果將其移植到幾十兆赫茲的微控制器運行時,運行效果會非常不理想,根本無法達到實時處理的要求。隨著科技的發展,FPGA由于其高度的靈活性、現場可編程優點以及高度的并行運算能力,成為了工程師們設計的首選。利用FPGA的流水線操作可以解決數字信號處理時數據傳輸需要的高帶寬,利用其并行運算提高運算速度,尤其是其靈活性特點使得硬件實現的算法能夠支持大范圍數字信號處理應用成為可能。
邊緣檢測在圖像處理領域有廣泛的應用,Sobel算子屬于傳統邊緣檢測算子,對噪聲比較敏感,在硬件實現時,效果并不理想,而高通濾波可以抑制低頻分量,凸顯邊緣,降低噪聲,因此,先對圖像進行高通處理再進行邊緣檢測,可以獲得較好的效果。但缺點是兩種算法計算量都較大,消耗較多的硬件邏輯資源,造成浪費。考慮到FPGA內部構造出的時序邏輯系統,并非每個模塊都時刻在工作,而是依據邏輯功能要求,輪流工作[1],因此利用可重構計算技術可以解決這樣的問題。
依據以上論述而設計的邊緣檢測系統,不僅提高芯片利用率,并且使得該算法系統易于擴展,易于移植,擁有較好的性能效果。
早在20世紀60年代,可重構計算技術已經出現,雖然比較粗糙,但為之后的研究奠定了基礎。基于SRAM的FPGA的出現,使得可重構計算技術得到更好的發展和應用,并且使得傳統設計方法中隨著數字系統規模增大,單片FPGA資源利用率下降的問題得到較好解決。
部分可重構允許在不破壞FPGA其他資源繼續運行的情況下聯機重配置FPGA的一部分,通過刪除在那一刻FPGA中沒有有效執行的功能來提高有效的邏輯密度。
盡管基于SRAM的FPGA均可實現重構功能,但是并非都可以實現動態可重構功能。Xilinx公司的Virtex-4系列芯片基于SRAM結構,且具有動態重構性能。本文使用該系列的SC4VSX25芯片,它內部擁有1片32位MicroBlaze,4 個 DCM 模塊,128 個 Xtreme DSP Slice,9 個Bank,128個18 kbyte的Block RAM,23040個Logic Cells,10240個 Slice,64 ×40 Array。
本文使用的CCD攝像機采集的視頻輸出信號是模擬信號,要進行進一步處理,需要首先進行A/D轉換。使用EDK工具中I2C核對TVP5150芯片配置,當芯片上電工作時,輸出的是 BT.656格式的視頻數據,此時利用TVP5150的AVID管腳為高電平且VBLK管腳為低電平時輸出的視頻數據為有效數據的特點,將1幀的576×720個有效灰度數據存入外部存儲器中。
Sobel算子的邊緣檢測程序比特流和高通濾波程序比特流分別存放在外部存儲器的的不同位置中,在嵌入式32位MicroBlaze控制下,從片外存儲器讀取配置數據寫入內部配置端口(ICAP),可以完成芯片的動態重構[2]。FPGA的系統架構如圖1所示。

圖1 FPGA的系統架構
在這個架構中,硬件資源可分為兩部分:
1)動態可重構區域。高通濾波和邊緣檢測算法可以自動在這里按照應用要求重新配置。
2)靜態區域。包括32位的MicroBlaze,可重構控制器,還有系統的其他部分。
其中,MicroBlaze充當CPU,用于決定何時使用何種算法。可以利用Xilinx公司的EDK工具,生成MicroBlaze以及DDR控制器、DMA等資源,它們均通過OPB總線連接在一起,之后將EDK作為子模塊添加到ISE工程中[3]。DMA的作用是解放CPU,使得存儲在DDR中的圖像數據,直接與動態可重構區域交互,以提高傳輸速度。可重構控制器主要負責將存儲在外部的比特流通過ICAP接口讀入內部配置存儲單元。
對于動態可重構的模塊法和差別設計法,模塊法可以充分利用并行性特點,且各模塊相互獨立便于優化,提高整體性能和設計效率,因此選用模塊方法。需要注意的是,靜態模塊和動態模塊之間不是相互獨立的,而是需要使用總線宏來進行連接,以便各子模塊通信。
配置的流程如圖2所示。

圖2 配置的流程
CCD攝像機采集的數據,通常情況有很多噪聲,而Sobel算子對噪聲比較敏感,如果不首先將這些噪聲濾除掉,勢必影響之后的檢測效果。雖然Sobel算子也具有一定的噪聲平滑作用,但是精度不高。
濾波算法一般都是用模板來進行,而模板的尺寸均為奇數,通常采用的是3×3,5×5,7×7。這里采用空間域3×3模板。所謂空間域濾波,就是將模板在待處理的原始圖像中逐點的滑動,預先定義的濾波器系數與濾波模板對應的像素進行特定的計算得出該點所需的響應[4]。實現的步驟如圖3所示。

圖3 濾波算法實現步驟
這里所采用的高通濾波模板如圖4所示。

圖4 高通濾波模板
為了可以同時提取模板中的9個像素,本文采用了圖5所示的結構。其中,每個FIFO使用的是片內的BRAM,用CoreGenerator生成,容量為1 k×8 bit,存儲1行720個灰度數據,SRi為8位的移位寄存器,用VHDL語言描述,這樣在FIFO和SR的輸出端口恰好構成1個3×3的模板。值得注意的是,為了保證能夠有較穩定的數據,設置FIFO的讀時鐘較寫時鐘晚半個周期。以上模板中的負數,采用補碼方式進行計算,并且預留進位。經過圖3的計算步驟,邊緣頻率分量得以保存[5]。

圖5 模板結構
Sobel算子是通常用于水平和垂直邊緣的一個簡單檢測子[6],能夠很好地處理灰度漸變且噪聲多的圖像。水平梯度Gx和垂直梯度Gy可以由下面公式計算得出

式中:S為強度,θ為方向。但在這里,只使用強度S。與高通部分相同的是,仍然要構建3×3模板,只是模板內系數不同,并且需要水平和垂直方向兩個模板分別對Gx和Gy進行計算。詳細的構建流程如圖6所示。

圖6 構建流程圖
正如圖6所示,來自高通濾波器的數據流分別同時使用2個3×3模板進行卷積處理,其中,Gx的模板如圖7所示,Gy的模板如圖8所示。

圖7 Gx的模板

圖8 Gy的模板
經過運算后的9個數據需要再經過加法器(見圖9)求和,將和值送出,與Gy求得的和值進行均方運算。

圖9 加法器
對2個矩陣對應像素求均方根,得到的數據即為該點的像素梯度強度值,最后判斷其與閾值的關系,滿足T1≤S≤T2,輸出235,否則輸出16。因為在BT.656格式中,色度信號被填充為128,代表無色度信號,灰度信號被填充為16或235,分別代表黑色和白色。可以使用VHDL來構造狀態機,實現BT.656視頻格式,完成圖像在LCD上的顯示,亦可利用TVP5150的視頻輸出信號,填充有效數據,但需要注意時序問題,否則會造成顯示的不同步。而閾值的選擇,需要根據不同背景不同光照來選擇。在這里,模板中的負數,仍然采用補碼方式進行計算,并且預留進位。乘法器可以使用VHDL語言進行編寫,也可以使用Xilinx自帶的CoreGenerator來生成,這里選擇后者。
當然,由于Gx與Gy的計算方式僅僅是模板內部系數不同,所以,可以在完成Gx結構之后,將其復制并修改模板系數就可以完成Gy結構。
本文采用合眾達公司的SEED-XDTK FPGA教學實驗平臺,截取視頻中一幅圖片,在LCD顯示器上顯示,實驗結果如圖10所示。由圖10可見,本文的設計初步達到要求,但與軟件處理的效果仍稍有差距。

本文首先利用Xilinx公司的EDK嵌入式開發軟件完成了硬件平臺搭建,并將其作為子模塊嵌入到ISE工程中,之后,在ISE中完成算法模塊搭建,由于使用了大量FPGA自帶的硬件資源,避免了編寫大量程序代碼,利用硬件平臺完成了高通濾波和Sobel算法的動態重構,有效提高了硬件資源利用率并且方便算法擴展,有較強的通用性和移植性。
[1]朱明程.FPGA動態可重構技術及其應用[J].電子產品世界,2000(6):13-14.
[2]覃祥菊,朱明程,張太鎰.FPGA動態可重構技術原理及實現方法分析[J]. 電子器件,2004,27(2):277-282.
[3]田耘,徐文波.Xilinx FPGA開發實用教程[M].北京:清華大學出版社,2011.
[4]趙磊.基于FPGA圖像增強技術的實現[D].昆明:昆明理工大學,2008.
[5]王德勝,康令州.基于FPGA的實時圖像采集與預處理[J].電視技術,2011,35(3):32-35.
[6]SONKA M,HLAVAC V,BOYLE R.圖像處理、分析與機器視覺[M].3版.艾海舟,蘇延超,等,譯.北京:清華大學出版社,2011.