趙宇新 傅海軍 王淇櫕 耿禮陽
(1、江蘇大學京江學院,江蘇 鎮江212013 2、江蘇大學電氣學院,江蘇 鎮江212000)
在自動化技術飛速發展的現在,我們時常能在電影中看見一些諸如無人駕駛或者是能夠自動識別使用者的電腦之類的科技,而現在也有很多軟件可以通過圖像識別來完成例如登入與支付之類的功能。而在圖像識別技術日趨成熟的現在,如何更高效,更準確,且更快速地采集圖樣并進行對比,是時下非?;馃岬囊粋€研究方向。
一般情況下,軟件圖像處理的方案是在通用CPU 上使用軟件運行程序,這種方法價格低廉,運行靈活,但是由于其運行速度慢且不支持運算,故并不能滿足實時圖像處理的要求。與之對應的硬件圖像處理方式一般是選用專用的ASIC 器件實現的,它擁有優秀的處理速度與并行運行能力,但是卻擁有諸如設計和生產的費用高昂,靈活性不高的缺點。同時,伴隨著對圖像采集處理的要求逐漸嚴格,特別是對于密集圖像的采集處理上,在要求擁有高采集精度的同時還要保證足夠的處理速度,這時比較傳統的CPU 構架與ASIC 器件就略顯不足了。而FPGA 則兼具了二者的優勢。用戶可以先編輯實現圖像處理的程序,再用FPGA 實現該功能。再加上FPGA 是作為ASIC 領域中的一種半定制電路而出現的,既解決了ASIC 的不足,又克服了原有可編程器件門電路數有限的缺點。它通常具有較高的初始成本,但由于它們可以實現多個芯片組件的功能,并且還能夠節省大量板上空間,所以綜合來看其成本并不高。還有可編程的優勢,功能性與靈活性更高,風險性也是更低,而且從設計到運用的周期也較短,故FPGA 器件與ASIC 器件擁有更廣的應用范圍。根據現在的發展趨勢,如今的FPGA 器件仍然擁有十分寬廣的前景。
FPGA 的全稱為Field Programmable Gate Array(現場可編程邏輯門陣列),世界首款FPGA 是由Xilinx(賽靈思)公司發明于1984 年只包含64 個邏輯模塊的Xilinx XC2064。
FPGA 采用了邏輯單元陣列LCA(Logic Cell Array),包括可配置邏輯模塊CLB(Configurable Logic Block)、輸入輸出模塊IOB(Input Output Block)和內部連線(Interconnect)三個部分。
它是一種可重復編程的器件,與傳統的邏輯電路和門陣列相比,它具有不同的結構。FPGA 利用小型查找表(16×1RAM)來實現組合邏輯,每個查找表連接到一個D 觸發器的輸入端,觸發器再來驅動其他邏輯電路或驅動I/O,由此構成了既可實現組合邏輯功能又可實現時序邏輯功能的基本邏輯單元模塊,這些模塊間利用金屬連線互相連接或連接到I/O 模塊。FPGA 的邏輯是通過向內部靜態存儲單元加載編程數據來實現的,存儲在存儲器單元中的值決定了邏輯單元的邏輯功能以及各模塊之間或模塊與I/O 間的聯接方式,并最終決定了FPGA 所能實現的功能,FPGA 允許無限次的編程。它具有一般ASIC 芯片的優點:具有高性能、低功耗的優勢,同時還可以采取大規模并行的方式實施算法,并非常迅速和有效地處理采集到的圖像中大量數據。只需少數芯片和簡單的外圍電路,即可實現比較復雜的圖像預處理算法,若是需要對不同尺寸、不同灰度級圖像進行處理,只要改變FPGA 芯片的內部參數值就可以使其擁有一定的靈活性。加之現有的FPGA 也已經帶有DSP 核心,能夠與MATLAB 進行對接,我可以先在MATLAB 中進行算法驗證后,然后再下載到FPGA 中,這種方式也極大提高了程序的容錯性。
一般情況下,我們在使用FPGA 進行圖像采集與處理時使用的是中值濾波算法,它是在在“最小絕對誤差”準則下的最優濾波。中值濾波與一般的線性濾波方法相比,可以更好地濾除脈沖噪聲,而且在濾除噪聲的同時,還能夠保護信號的邊緣,使之不被模糊。加上中值濾波的算法比較簡單,易于硬件編程。主要工作原理是先定義一個長度為奇數的L 長窗口,L=2N+1,N為正整數。通過這個長窗口將像素灰度按等級排列和計算,再選取中間值作為輸出。計算公式大致如下:

其中x(i)為位于窗口中心的信號樣本值。我們需要對這L份信號樣本值按從小到大的順序排列后,取其中值,也就是在i處的樣值,并將其定義為中值濾波的輸出值。
具體流程如圖1 所示。
由圖中我們可以看出,在處理一個3×3 的像素矩陣時,我們需要先將在矩陣中的9 個數值按照一定規律進行排序,接著取出它們的中值,替代其他數值。
這個方法與均值濾波相比可以更加簡單的處理脈沖干擾級的椒鹽噪音,在抑制隨 機噪音的同時更好的保證圖像邊緣不被模糊,具體效果如圖2 所示。
從圖中我們可以看出,經過中值濾波處理過的圖像比起均值濾波處理過的圖像邊緣更加柔和,同時留下的椒鹽噪聲也越少。

圖1 中值濾波流程演示
在執行中值濾波時,排序是相當重要的一個過程。而在排序時,最簡單的方法應該是冒泡算法,它的過程簡答,易于理解與實現。但由于冒泡算法的排序方法單一,致使它在運算的過程中,需要重復地走訪過要排序的元素列,依次比較兩個相鄰的元素,在遇上順序錯誤時將兩個元素進行交換。并一直重復地進行直到沒有相鄰元素需要交換,最后才算完成了該元素列的排序。例如在對一個3×3 的像素區域進行比較時,冒泡算法最多需要36 次比較才能完成運算,并且有時還存在著大量重復同樣的計算與比較的問題。這就導致該排序方式多余的比較次數過多,而多次的重復計算又將導致較低的運算效率,最終影響到圖像的實時處理,增加大量運算負擔,雖然這個方法簡單且通用,但是復雜的運算步驟與龐大的運算量,使得該方法并不適用于圖像處理發展的趨勢。
所以,為了改變冒泡算法的不足,中值濾波并行算法應運而生。在它的運算過程中,首先會對于所選區域進行排序,再按照一定的規律進行比較,從而得出中值。這種算法減少了大量重復運算的步驟,很好地縮短了運算時間,提高了運算速度。例如,同樣是對一個3×3 的像素區域進行比較時,我們僅需要19次比較計算就能完成運算,這比冒泡算法減少了將近一半的運算次數,在成功地減少運算負擔的同時,還能更加有效提高了圖像處理的速度,故在進行運算時,我們將該方法作為首選方法。
中值濾波并行算法在本質上算是冒泡算法的衍生算法,但是通過分割以及并行和流水線的處理方法,對圖像數據進行多點的批量處理,從而一次對多組像素點進行排序與比較。這樣很好地減少了比較運算的次數,避免花費多余時間在相同的運算上,很好的提高了運算的效率。
具體計算原理如下:
在對一個3×3 的像素區域進行比較時,我們首先要對該區域進行分類(如表1 所示)。

表1 分組方式
分組完成后,分別對A 組、B 組、C 組進行比較排序并分組為T1、T2、T3 三組,并通過冒泡算法分別比較得出三組的最大值,最小值與中值,并將它們重新分組,分別得到最大值組M1、中值組M2 與最小值組M3。具體計算公式如下

接著對于M1、M2、M3 三組再次進行冒泡排序,從中取出最大值組M1 的最小值Min、中值組的中值Mid 以及最小值組的最大值Max,并對這三個數字進行比較,最終獲得輸出中值result,具體公式如下:

具體流程圖如圖3 所示。

圖2 中值濾波與均值濾波的對比

圖3 中值濾波并行算法示意圖
如圖所示,為得出T1、T2、T3 組中值的排序,需要9 次冒泡比較,之后再對M1、M2、M3 三組進行排序,得出最小值組的最大值MAX、中值組的中值MID、最大值組的最小值MIN,這一步同樣也需要9 次冒泡比較,最后,對于得出的MAX、MID、MIN三個值并不需要再次進行冒泡比較,通過MAX 與MID 比較取出其中的最小值,再用該值與MIN 比較,直接輸出最大值,即可得到一個3×3 像素區域的中值Result。
綜上所述可以看出:該算法只需要19 步即可快速得出一個3×3 像素區域的中值,比冒泡式算法相比,比較的次數減少了47.2%左右,在增加計算速度同時也減少了硬件的運算量,更好地契合了現在實時處理的要求。
本文簡單介紹了FPGA 圖像處理方法,同時將該方式與其他傳統的圖像處理方式相比較,得出了基于FPGA 的圖像處理技術所擁有的優點。在那之后,又介紹了兩種傳統的FPGA 圖像處理算法,并且對兩種不同的中值濾波算法進行了對比和分析。大體得出了中值濾波并行算法的優勢,并且舉例論證了該算法在圖像處理速度上優于冒泡法,其效率高,運算量小的優點,可以更好地適應現在實時圖像處理的要求。