趙宇新 傅海軍 王淇櫕 耿禮陽
(1、江蘇大學(xué)京江學(xué)院,江蘇 鎮(zhèn)江212013 2、江蘇大學(xué)電氣學(xué)院,江蘇 鎮(zhèn)江212000)
在自動(dòng)化技術(shù)飛速發(fā)展的現(xiàn)在,我們時(shí)常能在電影中看見一些諸如無人駕駛或者是能夠自動(dòng)識(shí)別使用者的電腦之類的科技,而現(xiàn)在也有很多軟件可以通過圖像識(shí)別來完成例如登入與支付之類的功能。而在圖像識(shí)別技術(shù)日趨成熟的現(xiàn)在,如何更高效,更準(zhǔn)確,且更快速地采集圖樣并進(jìn)行對(duì)比,是時(shí)下非常火熱的一個(gè)研究方向。
一般情況下,軟件圖像處理的方案是在通用CPU 上使用軟件運(yùn)行程序,這種方法價(jià)格低廉,運(yùn)行靈活,但是由于其運(yùn)行速度慢且不支持運(yùn)算,故并不能滿足實(shí)時(shí)圖像處理的要求。與之對(duì)應(yīng)的硬件圖像處理方式一般是選用專用的ASIC 器件實(shí)現(xiàn)的,它擁有優(yōu)秀的處理速度與并行運(yùn)行能力,但是卻擁有諸如設(shè)計(jì)和生產(chǎn)的費(fèi)用高昂,靈活性不高的缺點(diǎn)。同時(shí),伴隨著對(duì)圖像采集處理的要求逐漸嚴(yán)格,特別是對(duì)于密集圖像的采集處理上,在要求擁有高采集精度的同時(shí)還要保證足夠的處理速度,這時(shí)比較傳統(tǒng)的CPU 構(gòu)架與ASIC 器件就略顯不足了。而FPGA 則兼具了二者的優(yōu)勢(shì)。用戶可以先編輯實(shí)現(xiàn)圖像處理的程序,再用FPGA 實(shí)現(xiàn)該功能。再加上FPGA 是作為ASIC 領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了ASIC 的不足,又克服了原有可編程器件門電路數(shù)有限的缺點(diǎn)。它通常具有較高的初始成本,但由于它們可以實(shí)現(xiàn)多個(gè)芯片組件的功能,并且還能夠節(jié)省大量板上空間,所以綜合來看其成本并不高。還有可編程的優(yōu)勢(shì),功能性與靈活性更高,風(fēng)險(xiǎn)性也是更低,而且從設(shè)計(jì)到運(yùn)用的周期也較短,故FPGA 器件與ASIC 器件擁有更廣的應(yīng)用范圍。根據(jù)現(xiàn)在的發(fā)展趨勢(shì),如今的FPGA 器件仍然擁有十分寬廣的前景。
FPGA 的全稱為Field Programmable Gate Array(現(xiàn)場(chǎng)可編程邏輯門陣列),世界首款FPGA 是由Xilinx(賽靈思)公司發(fā)明于1984 年只包含64 個(gè)邏輯模塊的Xilinx XC2064。
FPGA 采用了邏輯單元陣列LCA(Logic Cell Array),包括可配置邏輯模塊CLB(Configurable Logic Block)、輸入輸出模塊IOB(Input Output Block)和內(nèi)部連線(Interconnect)三個(gè)部分。
它是一種可重復(fù)編程的器件,與傳統(tǒng)的邏輯電路和門陣列相比,它具有不同的結(jié)構(gòu)。FPGA 利用小型查找表(16×1RAM)來實(shí)現(xiàn)組合邏輯,每個(gè)查找表連接到一個(gè)D 觸發(fā)器的輸入端,觸發(fā)器再來驅(qū)動(dòng)其他邏輯電路或驅(qū)動(dòng)I/O,由此構(gòu)成了既可實(shí)現(xiàn)組合邏輯功能又可實(shí)現(xiàn)時(shí)序邏輯功能的基本邏輯單元模塊,這些模塊間利用金屬連線互相連接或連接到I/O 模塊。FPGA 的邏輯是通過向內(nèi)部靜態(tài)存儲(chǔ)單元加載編程數(shù)據(jù)來實(shí)現(xiàn)的,存儲(chǔ)在存儲(chǔ)器單元中的值決定了邏輯單元的邏輯功能以及各模塊之間或模塊與I/O 間的聯(lián)接方式,并最終決定了FPGA 所能實(shí)現(xiàn)的功能,F(xiàn)PGA 允許無限次的編程。它具有一般ASIC 芯片的優(yōu)點(diǎn):具有高性能、低功耗的優(yōu)勢(shì),同時(shí)還可以采取大規(guī)模并行的方式實(shí)施算法,并非常迅速和有效地處理采集到的圖像中大量數(shù)據(jù)。只需少數(shù)芯片和簡(jiǎn)單的外圍電路,即可實(shí)現(xiàn)比較復(fù)雜的圖像預(yù)處理算法,若是需要對(duì)不同尺寸、不同灰度級(jí)圖像進(jìn)行處理,只要改變FPGA 芯片的內(nèi)部參數(shù)值就可以使其擁有一定的靈活性。加之現(xiàn)有的FPGA 也已經(jīng)帶有DSP 核心,能夠與MATLAB 進(jìn)行對(duì)接,我可以先在MATLAB 中進(jìn)行算法驗(yàn)證后,然后再下載到FPGA 中,這種方式也極大提高了程序的容錯(cuò)性。
一般情況下,我們?cè)谑褂肍PGA 進(jìn)行圖像采集與處理時(shí)使用的是中值濾波算法,它是在在“最小絕對(duì)誤差”準(zhǔn)則下的最優(yōu)濾波。中值濾波與一般的線性濾波方法相比,可以更好地濾除脈沖噪聲,而且在濾除噪聲的同時(shí),還能夠保護(hù)信號(hào)的邊緣,使之不被模糊。加上中值濾波的算法比較簡(jiǎn)單,易于硬件編程。主要工作原理是先定義一個(gè)長(zhǎng)度為奇數(shù)的L 長(zhǎng)窗口,L=2N+1,N為正整數(shù)。通過這個(gè)長(zhǎng)窗口將像素灰度按等級(jí)排列和計(jì)算,再選取中間值作為輸出。計(jì)算公式大致如下:
其中x(i)為位于窗口中心的信號(hào)樣本值。我們需要對(duì)這L份信號(hào)樣本值按從小到大的順序排列后,取其中值,也就是在i處的樣值,并將其定義為中值濾波的輸出值。
具體流程如圖1 所示。
由圖中我們可以看出,在處理一個(gè)3×3 的像素矩陣時(shí),我們需要先將在矩陣中的9 個(gè)數(shù)值按照一定規(guī)律進(jìn)行排序,接著取出它們的中值,替代其他數(shù)值。
這個(gè)方法與均值濾波相比可以更加簡(jiǎn)單的處理脈沖干擾級(jí)的椒鹽噪音,在抑制隨 機(jī)噪音的同時(shí)更好的保證圖像邊緣不被模糊,具體效果如圖2 所示。
從圖中我們可以看出,經(jīng)過中值濾波處理過的圖像比起均值濾波處理過的圖像邊緣更加柔和,同時(shí)留下的椒鹽噪聲也越少。
圖1 中值濾波流程演示
在執(zhí)行中值濾波時(shí),排序是相當(dāng)重要的一個(gè)過程。而在排序時(shí),最簡(jiǎn)單的方法應(yīng)該是冒泡算法,它的過程簡(jiǎn)答,易于理解與實(shí)現(xiàn)。但由于冒泡算法的排序方法單一,致使它在運(yùn)算的過程中,需要重復(fù)地走訪過要排序的元素列,依次比較兩個(gè)相鄰的元素,在遇上順序錯(cuò)誤時(shí)將兩個(gè)元素進(jìn)行交換。并一直重復(fù)地進(jìn)行直到?jīng)]有相鄰元素需要交換,最后才算完成了該元素列的排序。例如在對(duì)一個(gè)3×3 的像素區(qū)域進(jìn)行比較時(shí),冒泡算法最多需要36 次比較才能完成運(yùn)算,并且有時(shí)還存在著大量重復(fù)同樣的計(jì)算與比較的問題。這就導(dǎo)致該排序方式多余的比較次數(shù)過多,而多次的重復(fù)計(jì)算又將導(dǎo)致較低的運(yùn)算效率,最終影響到圖像的實(shí)時(shí)處理,增加大量運(yùn)算負(fù)擔(dān),雖然這個(gè)方法簡(jiǎn)單且通用,但是復(fù)雜的運(yùn)算步驟與龐大的運(yùn)算量,使得該方法并不適用于圖像處理發(fā)展的趨勢(shì)。
所以,為了改變冒泡算法的不足,中值濾波并行算法應(yīng)運(yùn)而生。在它的運(yùn)算過程中,首先會(huì)對(duì)于所選區(qū)域進(jìn)行排序,再按照一定的規(guī)律進(jìn)行比較,從而得出中值。這種算法減少了大量重復(fù)運(yùn)算的步驟,很好地縮短了運(yùn)算時(shí)間,提高了運(yùn)算速度。例如,同樣是對(duì)一個(gè)3×3 的像素區(qū)域進(jìn)行比較時(shí),我們僅需要19次比較計(jì)算就能完成運(yùn)算,這比冒泡算法減少了將近一半的運(yùn)算次數(shù),在成功地減少運(yùn)算負(fù)擔(dān)的同時(shí),還能更加有效提高了圖像處理的速度,故在進(jìn)行運(yùn)算時(shí),我們將該方法作為首選方法。
中值濾波并行算法在本質(zhì)上算是冒泡算法的衍生算法,但是通過分割以及并行和流水線的處理方法,對(duì)圖像數(shù)據(jù)進(jìn)行多點(diǎn)的批量處理,從而一次對(duì)多組像素點(diǎn)進(jìn)行排序與比較。這樣很好地減少了比較運(yùn)算的次數(shù),避免花費(fèi)多余時(shí)間在相同的運(yùn)算上,很好的提高了運(yùn)算的效率。
具體計(jì)算原理如下:
在對(duì)一個(gè)3×3 的像素區(qū)域進(jìn)行比較時(shí),我們首先要對(duì)該區(qū)域進(jìn)行分類(如表1 所示)。
表1 分組方式
分組完成后,分別對(duì)A 組、B 組、C 組進(jìn)行比較排序并分組為T1、T2、T3 三組,并通過冒泡算法分別比較得出三組的最大值,最小值與中值,并將它們重新分組,分別得到最大值組M1、中值組M2 與最小值組M3。具體計(jì)算公式如下
接著對(duì)于M1、M2、M3 三組再次進(jìn)行冒泡排序,從中取出最大值組M1 的最小值Min、中值組的中值Mid 以及最小值組的最大值Max,并對(duì)這三個(gè)數(shù)字進(jìn)行比較,最終獲得輸出中值result,具體公式如下:
具體流程圖如圖3 所示。
圖2 中值濾波與均值濾波的對(duì)比
圖3 中值濾波并行算法示意圖
如圖所示,為得出T1、T2、T3 組中值的排序,需要9 次冒泡比較,之后再對(duì)M1、M2、M3 三組進(jìn)行排序,得出最小值組的最大值MAX、中值組的中值MID、最大值組的最小值MIN,這一步同樣也需要9 次冒泡比較,最后,對(duì)于得出的MAX、MID、MIN三個(gè)值并不需要再次進(jìn)行冒泡比較,通過MAX 與MID 比較取出其中的最小值,再用該值與MIN 比較,直接輸出最大值,即可得到一個(gè)3×3 像素區(qū)域的中值Result。
綜上所述可以看出:該算法只需要19 步即可快速得出一個(gè)3×3 像素區(qū)域的中值,比冒泡式算法相比,比較的次數(shù)減少了47.2%左右,在增加計(jì)算速度同時(shí)也減少了硬件的運(yùn)算量,更好地契合了現(xiàn)在實(shí)時(shí)處理的要求。
本文簡(jiǎn)單介紹了FPGA 圖像處理方法,同時(shí)將該方式與其他傳統(tǒng)的圖像處理方式相比較,得出了基于FPGA 的圖像處理技術(shù)所擁有的優(yōu)點(diǎn)。在那之后,又介紹了兩種傳統(tǒng)的FPGA 圖像處理算法,并且對(duì)兩種不同的中值濾波算法進(jìn)行了對(duì)比和分析。大體得出了中值濾波并行算法的優(yōu)勢(shì),并且舉例論證了該算法在圖像處理速度上優(yōu)于冒泡法,其效率高,運(yùn)算量小的優(yōu)點(diǎn),可以更好地適應(yīng)現(xiàn)在實(shí)時(shí)圖像處理的要求。