趙亮,劉鵬,王曉曼,劉美
(長(zhǎng)春理工大學(xué) 電子信息工程學(xué)院,長(zhǎng)春 130022)
圖像采集處理系統(tǒng)大部分均采用實(shí)時(shí)圖像采集技術(shù),圖像采集的速度、質(zhì)量直接影響到產(chǎn)品的整體效果[1]。圖像信號(hào)處理類的低層信號(hào)處理運(yùn)算主要面對(duì)圖像像素操作[2],此類運(yùn)算的特點(diǎn)是數(shù)據(jù)量大但運(yùn)算簡(jiǎn)單。計(jì)算機(jī)很難實(shí)時(shí)處理視頻圖像數(shù)字化后帶來(lái)的龐大數(shù)據(jù)量,然而FPGA技術(shù)因其眾多的優(yōu)點(diǎn)在圖像處理方面有廣泛的應(yīng)用[3]。
中值濾波基于排序統(tǒng)計(jì)理論,其核心運(yùn)算是以模板中的數(shù)據(jù)進(jìn)行大小排序,利用亮點(diǎn)(暗點(diǎn))的數(shù)值一般偏大(偏?。┦沟媚硞€(gè)亮點(diǎn)(暗點(diǎn))噪聲經(jīng)過(guò)排序后處在數(shù)據(jù)序列的兩側(cè),從而達(dá)到濾除脈沖噪聲的目的。傳統(tǒng)的算法是對(duì)像素值進(jìn)行比較和交換,經(jīng)過(guò)幾次比較和交換后求出中值,典型的算法有冒泡排序、插入排序等。但此類算法有個(gè)共同的缺點(diǎn),就是當(dāng)前的比較必須基于上一次比較的結(jié)果。如果使用通用的軟件方法處理這種算法則需要大量的時(shí)間,特別是對(duì)于大窗口的中值濾波算法。對(duì)此,李軼博等人提出了一種基于FPGA的快速中值濾波器設(shè)計(jì)方法,利用行緩沖的方式實(shí)現(xiàn)了3×3模板矩陣,并采用3級(jí)流水操作提高了圖像處理的速率和單位時(shí)間內(nèi)處理數(shù)據(jù)量的吞吐能力[4]。侯法柱等人提出了基于FPGA的改進(jìn)算法,其先對(duì)每行進(jìn)行了排序并根據(jù)排序后的大小特點(diǎn)去除不可能的值,然后再對(duì)少量的值進(jìn)行排序。最終需要16次比較可以找到9個(gè)元素的中值。其設(shè)計(jì)在剛開(kāi)始時(shí)需要9個(gè)時(shí)鐘生成3×3的濾波窗口,之后會(huì)每相隔3個(gè)時(shí)鐘周期就會(huì)產(chǎn)生一個(gè)新的窗口[5]。韓團(tuán)軍提出了一種快速中值濾波算法,其對(duì)圖像的二維陣列,先進(jìn)行一次列排序運(yùn)算,再進(jìn)行一次行排序運(yùn)算,最后再將對(duì)角線的像素去中值輸出[6]。
本文提出了一種基于FPGA的快速中值濾波器設(shè)計(jì)方法。設(shè)計(jì)將窗口中每個(gè)數(shù)據(jù)獨(dú)立運(yùn)算,分別求出每個(gè)數(shù)的情況,結(jié)合中值在有序序列中處于中間位置這一特殊性,只需1個(gè)時(shí)鐘周期便可以輸出3×3窗口的中值。該設(shè)計(jì)提高了圖像處理的效率和單位時(shí)間內(nèi)的處理數(shù)據(jù)量的吞吐能力。設(shè)計(jì)方案已經(jīng)成功應(yīng)用于某新型零飛儀的視頻采集系統(tǒng),使用效果很好。
本系統(tǒng)利用CMOS相機(jī)采集圖像,并通過(guò)Camlink接口與采集板相連。由DS90CR288將LVDS信號(hào)轉(zhuǎn)換為FPGA支持的TTL信號(hào)。經(jīng)過(guò)中值濾波等預(yù)處理后送至DSP進(jìn)行高層算法處理。為了觀察實(shí)驗(yàn)結(jié)果,直接將數(shù)據(jù)送出顯示。該系統(tǒng)主要分為三個(gè)部分:圖像采集、圖像處理、圖像顯示。系統(tǒng)整體框架如圖1所示。
圖1 系統(tǒng)整體框架
本系統(tǒng)通過(guò)mega128單片機(jī)配置相機(jī),其主要需要配置的寄存器為通用模式寄存器和觸發(fā)模式配置寄存器。配置成功的相機(jī)便可開(kāi)始正常工作,相機(jī)的輸出視頻時(shí)序信號(hào)如圖2所示。
圖2 數(shù)字視頻時(shí)序信號(hào)
相機(jī)的輸出信號(hào)主要分成3類,像素時(shí)鐘CLK、數(shù)據(jù)信號(hào)DATA以及控制信號(hào)FVAL、LVAL、DVAL。場(chǎng)有效信號(hào)FVAL在一幀圖像數(shù)據(jù)傳送期間為高電平,并且先于有效數(shù)據(jù)4個(gè)時(shí)鐘周期到來(lái)。行有效信號(hào)LVAL為高后數(shù)據(jù)開(kāi)始傳送,并且數(shù)據(jù)在CLK上升沿到來(lái)時(shí)最穩(wěn)定。其中FVAL、LVAL是設(shè)計(jì)3x3窗口模塊、中值模塊以及輸出模塊主要的時(shí)序參考。但相機(jī)采用的Camlink接口輸出的信號(hào)均為差分信號(hào),所以系統(tǒng)采用DS90CR287以及DS90LV019將LVDS信號(hào)轉(zhuǎn)換為FPGA和單片機(jī)支持的TTL信號(hào)。
行列計(jì)數(shù)器模塊的功能在于記錄當(dāng)前所在的行和列,以便各個(gè)模塊區(qū)分邊界非邊界。
行列計(jì)數(shù)器的工作情況如下:
(1)在場(chǎng)有效信號(hào)FVAL上升沿到來(lái)時(shí),行列計(jì)數(shù)器同時(shí)清零,準(zhǔn)備接收下一幀圖像的數(shù)據(jù);
(2)行有效信號(hào)LVAL上升沿到來(lái)表示下一行數(shù)據(jù)到來(lái),行計(jì)數(shù)器加1;
(3)當(dāng)行有效信號(hào)LVAL為高時(shí),每一個(gè)像素時(shí)鐘CLK上升沿的到來(lái),列計(jì)數(shù)器都會(huì)加1。直到LVAL為低時(shí),列計(jì)數(shù)器被清零,以準(zhǔn)備接收下一行的數(shù)據(jù)。
3x3的窗口用于產(chǎn)生濾波模塊所需的9個(gè)數(shù)據(jù)。窗口由兩個(gè)FIFO、7個(gè)移位寄存器以及兩個(gè)2選 1多路選擇器組成,分別是 fifo1、fifo2,reg33、reg32、reg32、reg22、reg21、reg12、reg11 以及兩個(gè)Mux2,如圖3所示。
圖3 3x3濾波窗口的實(shí)現(xiàn)
圖3中的R33、R32、R31、R23、R22、R21、R13、R12、R11則是3x3窗口的9個(gè)8位輸出數(shù)據(jù),用于送給中值模塊求出中值。使用嵌入式存儲(chǔ)器FIFO來(lái)實(shí)現(xiàn)移位寄存器塊,它能節(jié)省邏輯單元LE和布線資源,提供了更加有效的實(shí)現(xiàn)方法[7]。由于圖像數(shù)據(jù)data_in是以數(shù)據(jù)流的形式依次進(jìn)入的,使用圖3的結(jié)構(gòu)就可以方便地取得9個(gè)窗口數(shù)據(jù)。同時(shí),行有效期間,每個(gè)FIFO讀出數(shù)據(jù)的同時(shí)下一行數(shù)據(jù)會(huì)更新此FIFO中的數(shù)據(jù)。每個(gè)FIFO中緩存一行圖像數(shù)據(jù)。下面以30x10的分辨率為例分析。
窗口數(shù)據(jù)產(chǎn)生步驟如下:
(1)將第一行、第二行的數(shù)據(jù)直接存入FIFO。
當(dāng)Row_cnt的值為1且FVAL、LVAL均為高時(shí),fifo2的寫(xiě)使能,第一行數(shù)據(jù)直接存入fifo2。當(dāng)Row_cnt的值為2且FVAL、LVAL均為高時(shí),fifo1的寫(xiě)使能,第二行數(shù)據(jù)直接存入fifo1。即除第一二行是直接存入FIFO外,其余有效數(shù)據(jù)均是先經(jīng)過(guò)FIFO前的移位寄存器緩存后進(jìn)入FIFO的。
(2)第三行及以后每行的數(shù)據(jù)經(jīng)過(guò)reg33、reg32、reg31后打拍后再存入fifo1。同時(shí)fifo1的數(shù)據(jù)經(jīng)過(guò)reg22、reg21打拍后存入fifo2。
(3)通過(guò)圖3的R33、R32...R11便可以產(chǎn)生9個(gè)窗口數(shù)據(jù)。
3x3窗口的設(shè)計(jì)重點(diǎn)在于對(duì)兩個(gè)FIFO讀寫(xiě)時(shí)序的控制,從而使得有效的圖像數(shù)據(jù)存入FIFO中。同時(shí),還需要將三行數(shù)據(jù)對(duì)齊,否則產(chǎn)生的窗口數(shù)據(jù)是無(wú)效的。
FIFO讀寫(xiě)控制如下:
(1)FIFO讀使能
本文在行有效信號(hào)LVAL到來(lái)的同時(shí)將FIFO讀使能。這樣,第一個(gè)時(shí)鐘到來(lái)時(shí)reg33端口的值即為每行的第一個(gè)數(shù)據(jù),兩個(gè)FIFO的輸出端口也是每行的第一個(gè)數(shù)據(jù),這樣三行數(shù)據(jù)便可對(duì)齊。
(2)FIFO寫(xiě)使能
什么時(shí)刻使能FIFO的寫(xiě)信號(hào)才能避免無(wú)效的數(shù)據(jù)寫(xiě)入FIFO。本文在行有效信號(hào)LVAL有效后的第三個(gè)時(shí)鐘上升沿將兩個(gè)FIFO的寫(xiě)使能,每行的第一個(gè)數(shù)據(jù)在下一個(gè)時(shí)鐘就會(huì)存進(jìn)FIFO,并且避免了無(wú)效的數(shù)據(jù)寫(xiě)入FIFO中。通過(guò)FIFO的epmty和wrusedw可以觀察FIFO是否已經(jīng)讀寫(xiě)的情況。在FIFO寫(xiě)使能的下一個(gè)時(shí)鐘,empty將會(huì)由高變低,同時(shí)wrusedw會(huì)由0變成1,說(shuō)明已經(jīng)寫(xiě)進(jìn)一個(gè)數(shù)據(jù)。在寫(xiě)有效而讀無(wú)效的情況下,每一個(gè)像素時(shí)鐘的到來(lái)都會(huì)使wrusedw加1,直到寫(xiě)無(wú)效其值保持不變。通過(guò)觀察wrusedw的值是否30而來(lái)判斷是否成功將一行數(shù)據(jù)寫(xiě)入FIFO中。在讀寫(xiě)同時(shí)使能時(shí),3x3窗口數(shù)據(jù)生成并開(kāi)始移動(dòng)時(shí),不斷生成新的窗口數(shù)據(jù)。此時(shí)wrusedw的值會(huì)一直保持在27。
(3)關(guān)閉FIFO的讀使能
在每行數(shù)據(jù)的末端,即FIFO讀出每行的最后一個(gè)數(shù)據(jù)后,關(guān)閉讀使能,窗口停止工作,不再移動(dòng)。
(4)關(guān)閉FIFO的寫(xiě)使能
在關(guān)閉FIFO讀使能后由于每行的最后兩個(gè)數(shù)據(jù)還沒(méi)有寫(xiě)進(jìn)FIFO,所以wrreq在LVAL為低后的第三個(gè)像素時(shí)鐘上升沿關(guān)閉,觀察wrusedw會(huì)發(fā)現(xiàn),值變?yōu)?0,并且在行消隱期間值保持不變。即FIFO中存入了每行的30個(gè)有效數(shù)據(jù)。3×3窗口仿真的時(shí)序圖如4所示。
圖4 3x3窗口仿真圖
中值模塊采用并行的9個(gè)模塊將3x3窗口送來(lái)的9個(gè)數(shù)值比較求出中值,并在下一個(gè)像素時(shí)鐘CLK的上升沿將中值輸出。由排序理論可知,經(jīng)過(guò)排序后的中值必然處在序列的中間位置。也就是說(shuō)有序序列中間位置上的值必然為中值,如圖5所示。
圖5 中值位置顯示
有序序列中值的幾種不同情況:
(1)如果小于該數(shù)的數(shù)有4個(gè),那么大于等于它的必然也是4個(gè),此值為中間值;
(2)如果小于該數(shù)的數(shù)少于4個(gè),但是加上等于此數(shù)的數(shù)后大于等于4個(gè),此值為中間值。
所以只需知道小于該數(shù)和等于該數(shù)的數(shù)有幾個(gè)即可判斷此數(shù)是否為中間值。并且在所有的9個(gè)數(shù)中,必然有且只有一個(gè)數(shù)滿足上述兩種情況的一種,即必定會(huì)通過(guò)計(jì)算出的值找出9個(gè)數(shù)中的中值。以3x3的窗口為例,首先將3x3窗口內(nèi)各像素分別定義為 R1C1、R1C2、R1C3、R2C1、R2C2、R2C3、R3C1、R3C2、R3C3。各定義在窗口中的位置如表1所示。
設(shè)置less_than_data1、equal_to_data1兩個(gè)寄存器存儲(chǔ)小于和等于該數(shù)的個(gè)數(shù),計(jì)算公式如下:
表1 3×3窗口像素位置定義
式(1)中,ltdn(1<=n<=8)表示該數(shù)是否大于另外8個(gè)數(shù),如果R1C1代表的值大,則ltd1為1,否則為0。式(2)中etdn(1<=n<=8)表示該數(shù)與另外8個(gè)數(shù)是否相等,如果相等,則etd1為1,否則為0。如果less_than_data1為4,表示有且只有4個(gè)數(shù)比它小,即R1C1代表的值為中值;如果less_than_data1的值小于4,但less_than_data1與equal_to_data1之和大于等于4,那么R1C1代表的值也為中值。設(shè)計(jì)采用了組合邏輯實(shí)現(xiàn)less_than_data1和equal_to_data1的計(jì)算。但是為了避免組合邏輯以及走線帶來(lái)的延遲的不同而導(dǎo)致錯(cuò)誤中值的輸出,在下一個(gè)時(shí)鐘周期的上升沿時(shí)將穩(wěn)定的中值輸出。對(duì)于窗口中其他的8個(gè)數(shù)均可以采用相同的方式計(jì)算出less_than_datan(2<=n<=9)和 equal_to_datan(2<=n<=9)。由于窗口中9個(gè)數(shù)的計(jì)算相互之間不存在依賴關(guān)系,所以可以并行執(zhí)行。而之前論文實(shí)現(xiàn)中值濾波方式的2級(jí)比較會(huì)依賴于1級(jí)比較的結(jié)果,3級(jí)比較會(huì)依賴于2級(jí)比較的結(jié)果,必然會(huì)增加所需的時(shí)鐘周期數(shù)。所以此方法可以快速計(jì)算出中值,在下一個(gè)時(shí)鐘將中值輸出,如圖6所示。在此仿真中第一個(gè)有效的中值為32,而31將會(huì)在輸出時(shí)使用原值。并且輸出時(shí)鐘的上升沿均是數(shù)據(jù)的中心位置,保證采樣時(shí)數(shù)據(jù)的穩(wěn)定性。
圖6 中值輸出仿真圖
模擬輸入數(shù)據(jù)的時(shí)序?qū)V波后的數(shù)據(jù)輸出。行列計(jì)數(shù)器的值作為2選1多路選擇器的通道選擇控制信號(hào),當(dāng)行列計(jì)數(shù)器的值為邊界時(shí)直接將像素點(diǎn)的原值輸出,否則多路選擇器選擇中值輸出。調(diào)用pll將像素時(shí)鐘的相位延時(shí)180度,使輸出時(shí)鐘上升沿在輸出數(shù)據(jù)中心位置出現(xiàn)。
實(shí)驗(yàn)終端調(diào)試及測(cè)試。采用文本的算法可以減少計(jì)算中值的時(shí)鐘周期數(shù),將時(shí)鐘周期數(shù)由多個(gè)[4-8]縮減至1個(gè)時(shí)鐘周期。本文設(shè)計(jì)的快速中值濾波器不需要先用SDRAM等外設(shè)來(lái)緩存一整幅圖像,而是采用兩個(gè)FIFO緩存兩行數(shù)據(jù),利用不斷的更新FIFO中數(shù)據(jù)來(lái)完成對(duì)一幅圖像的濾波處理。而此種方式可以實(shí)現(xiàn)的原因在于中值的連續(xù)輸出(如圖6)使得可以直接模擬相機(jī)的輸出時(shí)序?qū)⑻幚硗甑臄?shù)據(jù)直接送給終端顯示并觀察實(shí)驗(yàn)結(jié)果。系統(tǒng)在第三行數(shù)據(jù)到來(lái)時(shí)開(kāi)始輸出中值,并在每個(gè)行有效結(jié)束后,每個(gè)FIFO中的數(shù)據(jù)均被更新為下一行的數(shù)據(jù),直到一幅圖像處理結(jié)束。最后,對(duì)于先將圖像存儲(chǔ)到SDRAM的方式,例如系統(tǒng)時(shí)鐘為65M,像素為720×576的圖像,采用原來(lái)的中值濾波算法處理一整幅圖像大概需要18ms,但采用本文的算法大概只需要三分之一的時(shí)間,即6ms。通常的視頻幀頻為25幀/秒,即一幀視頻所需的時(shí)間為40ms,因此對(duì)于先緩存一整幅圖像再處理的方式此中值濾波器設(shè)計(jì)方法也是完全能夠滿足實(shí)時(shí)性的要求的。
從實(shí)驗(yàn)結(jié)果可以看出,有噪聲的圖像通過(guò)此中值濾波系統(tǒng)后圖像中的噪聲得到了有效的濾除,測(cè)試結(jié)果如圖7所示。
圖7 濾波前后效果比較
本文充分利用FPGA并行性的特點(diǎn),采用了獨(dú)立計(jì)算每個(gè)數(shù)據(jù)位置的方法,根據(jù)中值在有序序列中處于中間位置這一特性,以EP4CE55F23I7為核心處理器,搭建了中值濾波系統(tǒng)。該系統(tǒng)有效地實(shí)現(xiàn)了圖像的去噪并且將計(jì)算中值所需的時(shí)鐘周期數(shù)降至1個(gè)。設(shè)計(jì)采取了時(shí)序電路與組合電路相結(jié)合的方法,不僅避免了組合電路毛刺等問(wèn)題,還可以快速的在像素到來(lái)的下一個(gè)時(shí)鐘將上一行對(duì)應(yīng)位置的中值穩(wěn)定輸出,達(dá)到了快速抑制噪聲的目的。該設(shè)計(jì)對(duì)于的實(shí)時(shí)圖像預(yù)處理具有一定的應(yīng)用價(jià)值。