趙亮,劉鵬,王曉曼,劉美
(長春理工大學 電子信息工程學院,長春 130022)
圖像采集處理系統大部分均采用實時圖像采集技術,圖像采集的速度、質量直接影響到產品的整體效果[1]。圖像信號處理類的低層信號處理運算主要面對圖像像素操作[2],此類運算的特點是數據量大但運算簡單。計算機很難實時處理視頻圖像數字化后帶來的龐大數據量,然而FPGA技術因其眾多的優點在圖像處理方面有廣泛的應用[3]。
中值濾波基于排序統計理論,其核心運算是以模板中的數據進行大小排序,利用亮點(暗點)的數值一般偏大(偏?。┦沟媚硞€亮點(暗點)噪聲經過排序后處在數據序列的兩側,從而達到濾除脈沖噪聲的目的。傳統的算法是對像素值進行比較和交換,經過幾次比較和交換后求出中值,典型的算法有冒泡排序、插入排序等。但此類算法有個共同的缺點,就是當前的比較必須基于上一次比較的結果。如果使用通用的軟件方法處理這種算法則需要大量的時間,特別是對于大窗口的中值濾波算法。對此,李軼博等人提出了一種基于FPGA的快速中值濾波器設計方法,利用行緩沖的方式實現了3×3模板矩陣,并采用3級流水操作提高了圖像處理的速率和單位時間內處理數據量的吞吐能力[4]。侯法柱等人提出了基于FPGA的改進算法,其先對每行進行了排序并根據排序后的大小特點去除不可能的值,然后再對少量的值進行排序。最終需要16次比較可以找到9個元素的中值。其設計在剛開始時需要9個時鐘生成3×3的濾波窗口,之后會每相隔3個時鐘周期就會產生一個新的窗口[5]。韓團軍提出了一種快速中值濾波算法,其對圖像的二維陣列,先進行一次列排序運算,再進行一次行排序運算,最后再將對角線的像素去中值輸出[6]。
本文提出了一種基于FPGA的快速中值濾波器設計方法。設計將窗口中每個數據獨立運算,分別求出每個數的情況,結合中值在有序序列中處于中間位置這一特殊性,只需1個時鐘周期便可以輸出3×3窗口的中值。該設計提高了圖像處理的效率和單位時間內的處理數據量的吞吐能力。設計方案已經成功應用于某新型零飛儀的視頻采集系統,使用效果很好。
本系統利用CMOS相機采集圖像,并通過Camlink接口與采集板相連。由DS90CR288將LVDS信號轉換為FPGA支持的TTL信號。經過中值濾波等預處理后送至DSP進行高層算法處理。為了觀察實驗結果,直接將數據送出顯示。該系統主要分為三個部分:圖像采集、圖像處理、圖像顯示。系統整體框架如圖1所示。

圖1 系統整體框架
本系統通過mega128單片機配置相機,其主要需要配置的寄存器為通用模式寄存器和觸發模式配置寄存器。配置成功的相機便可開始正常工作,相機的輸出視頻時序信號如圖2所示。

圖2 數字視頻時序信號
相機的輸出信號主要分成3類,像素時鐘CLK、數據信號DATA以及控制信號FVAL、LVAL、DVAL。場有效信號FVAL在一幀圖像數據傳送期間為高電平,并且先于有效數據4個時鐘周期到來。行有效信號LVAL為高后數據開始傳送,并且數據在CLK上升沿到來時最穩定。其中FVAL、LVAL是設計3x3窗口模塊、中值模塊以及輸出模塊主要的時序參考。但相機采用的Camlink接口輸出的信號均為差分信號,所以系統采用DS90CR287以及DS90LV019將LVDS信號轉換為FPGA和單片機支持的TTL信號。
行列計數器模塊的功能在于記錄當前所在的行和列,以便各個模塊區分邊界非邊界。
行列計數器的工作情況如下:
(1)在場有效信號FVAL上升沿到來時,行列計數器同時清零,準備接收下一幀圖像的數據;
(2)行有效信號LVAL上升沿到來表示下一行數據到來,行計數器加1;
(3)當行有效信號LVAL為高時,每一個像素時鐘CLK上升沿的到來,列計數器都會加1。直到LVAL為低時,列計數器被清零,以準備接收下一行的數據。
3x3的窗口用于產生濾波模塊所需的9個數據。窗口由兩個FIFO、7個移位寄存器以及兩個2選 1多路選擇器組成,分別是 fifo1、fifo2,reg33、reg32、reg32、reg22、reg21、reg12、reg11 以及兩個Mux2,如圖3所示。

圖3 3x3濾波窗口的實現
圖3中的R33、R32、R31、R23、R22、R21、R13、R12、R11則是3x3窗口的9個8位輸出數據,用于送給中值模塊求出中值。使用嵌入式存儲器FIFO來實現移位寄存器塊,它能節省邏輯單元LE和布線資源,提供了更加有效的實現方法[7]。由于圖像數據data_in是以數據流的形式依次進入的,使用圖3的結構就可以方便地取得9個窗口數據。同時,行有效期間,每個FIFO讀出數據的同時下一行數據會更新此FIFO中的數據。每個FIFO中緩存一行圖像數據。下面以30x10的分辨率為例分析。
窗口數據產生步驟如下:
(1)將第一行、第二行的數據直接存入FIFO。
當Row_cnt的值為1且FVAL、LVAL均為高時,fifo2的寫使能,第一行數據直接存入fifo2。當Row_cnt的值為2且FVAL、LVAL均為高時,fifo1的寫使能,第二行數據直接存入fifo1。即除第一二行是直接存入FIFO外,其余有效數據均是先經過FIFO前的移位寄存器緩存后進入FIFO的。
(2)第三行及以后每行的數據經過reg33、reg32、reg31后打拍后再存入fifo1。同時fifo1的數據經過reg22、reg21打拍后存入fifo2。
(3)通過圖3的R33、R32...R11便可以產生9個窗口數據。
3x3窗口的設計重點在于對兩個FIFO讀寫時序的控制,從而使得有效的圖像數據存入FIFO中。同時,還需要將三行數據對齊,否則產生的窗口數據是無效的。
FIFO讀寫控制如下:
(1)FIFO讀使能
本文在行有效信號LVAL到來的同時將FIFO讀使能。這樣,第一個時鐘到來時reg33端口的值即為每行的第一個數據,兩個FIFO的輸出端口也是每行的第一個數據,這樣三行數據便可對齊。
(2)FIFO寫使能
什么時刻使能FIFO的寫信號才能避免無效的數據寫入FIFO。本文在行有效信號LVAL有效后的第三個時鐘上升沿將兩個FIFO的寫使能,每行的第一個數據在下一個時鐘就會存進FIFO,并且避免了無效的數據寫入FIFO中。通過FIFO的epmty和wrusedw可以觀察FIFO是否已經讀寫的情況。在FIFO寫使能的下一個時鐘,empty將會由高變低,同時wrusedw會由0變成1,說明已經寫進一個數據。在寫有效而讀無效的情況下,每一個像素時鐘的到來都會使wrusedw加1,直到寫無效其值保持不變。通過觀察wrusedw的值是否30而來判斷是否成功將一行數據寫入FIFO中。在讀寫同時使能時,3x3窗口數據生成并開始移動時,不斷生成新的窗口數據。此時wrusedw的值會一直保持在27。
(3)關閉FIFO的讀使能
在每行數據的末端,即FIFO讀出每行的最后一個數據后,關閉讀使能,窗口停止工作,不再移動。
(4)關閉FIFO的寫使能
在關閉FIFO讀使能后由于每行的最后兩個數據還沒有寫進FIFO,所以wrreq在LVAL為低后的第三個像素時鐘上升沿關閉,觀察wrusedw會發現,值變為30,并且在行消隱期間值保持不變。即FIFO中存入了每行的30個有效數據。3×3窗口仿真的時序圖如4所示。

圖4 3x3窗口仿真圖
中值模塊采用并行的9個模塊將3x3窗口送來的9個數值比較求出中值,并在下一個像素時鐘CLK的上升沿將中值輸出。由排序理論可知,經過排序后的中值必然處在序列的中間位置。也就是說有序序列中間位置上的值必然為中值,如圖5所示。

圖5 中值位置顯示
有序序列中值的幾種不同情況:
(1)如果小于該數的數有4個,那么大于等于它的必然也是4個,此值為中間值;
(2)如果小于該數的數少于4個,但是加上等于此數的數后大于等于4個,此值為中間值。
所以只需知道小于該數和等于該數的數有幾個即可判斷此數是否為中間值。并且在所有的9個數中,必然有且只有一個數滿足上述兩種情況的一種,即必定會通過計算出的值找出9個數中的中值。以3x3的窗口為例,首先將3x3窗口內各像素分別定義為 R1C1、R1C2、R1C3、R2C1、R2C2、R2C3、R3C1、R3C2、R3C3。各定義在窗口中的位置如表1所示。
設置less_than_data1、equal_to_data1兩個寄存器存儲小于和等于該數的個數,計算公式如下:



表1 3×3窗口像素位置定義
式(1)中,ltdn(1<=n<=8)表示該數是否大于另外8個數,如果R1C1代表的值大,則ltd1為1,否則為0。式(2)中etdn(1<=n<=8)表示該數與另外8個數是否相等,如果相等,則etd1為1,否則為0。如果less_than_data1為4,表示有且只有4個數比它小,即R1C1代表的值為中值;如果less_than_data1的值小于4,但less_than_data1與equal_to_data1之和大于等于4,那么R1C1代表的值也為中值。設計采用了組合邏輯實現less_than_data1和equal_to_data1的計算。但是為了避免組合邏輯以及走線帶來的延遲的不同而導致錯誤中值的輸出,在下一個時鐘周期的上升沿時將穩定的中值輸出。對于窗口中其他的8個數均可以采用相同的方式計算出less_than_datan(2<=n<=9)和 equal_to_datan(2<=n<=9)。由于窗口中9個數的計算相互之間不存在依賴關系,所以可以并行執行。而之前論文實現中值濾波方式的2級比較會依賴于1級比較的結果,3級比較會依賴于2級比較的結果,必然會增加所需的時鐘周期數。所以此方法可以快速計算出中值,在下一個時鐘將中值輸出,如圖6所示。在此仿真中第一個有效的中值為32,而31將會在輸出時使用原值。并且輸出時鐘的上升沿均是數據的中心位置,保證采樣時數據的穩定性。

圖6 中值輸出仿真圖
模擬輸入數據的時序將濾波后的數據輸出。行列計數器的值作為2選1多路選擇器的通道選擇控制信號,當行列計數器的值為邊界時直接將像素點的原值輸出,否則多路選擇器選擇中值輸出。調用pll將像素時鐘的相位延時180度,使輸出時鐘上升沿在輸出數據中心位置出現。
實驗終端調試及測試。采用文本的算法可以減少計算中值的時鐘周期數,將時鐘周期數由多個[4-8]縮減至1個時鐘周期。本文設計的快速中值濾波器不需要先用SDRAM等外設來緩存一整幅圖像,而是采用兩個FIFO緩存兩行數據,利用不斷的更新FIFO中數據來完成對一幅圖像的濾波處理。而此種方式可以實現的原因在于中值的連續輸出(如圖6)使得可以直接模擬相機的輸出時序將處理完的數據直接送給終端顯示并觀察實驗結果。系統在第三行數據到來時開始輸出中值,并在每個行有效結束后,每個FIFO中的數據均被更新為下一行的數據,直到一幅圖像處理結束。最后,對于先將圖像存儲到SDRAM的方式,例如系統時鐘為65M,像素為720×576的圖像,采用原來的中值濾波算法處理一整幅圖像大概需要18ms,但采用本文的算法大概只需要三分之一的時間,即6ms。通常的視頻幀頻為25幀/秒,即一幀視頻所需的時間為40ms,因此對于先緩存一整幅圖像再處理的方式此中值濾波器設計方法也是完全能夠滿足實時性的要求的。
從實驗結果可以看出,有噪聲的圖像通過此中值濾波系統后圖像中的噪聲得到了有效的濾除,測試結果如圖7所示。

圖7 濾波前后效果比較
本文充分利用FPGA并行性的特點,采用了獨立計算每個數據位置的方法,根據中值在有序序列中處于中間位置這一特性,以EP4CE55F23I7為核心處理器,搭建了中值濾波系統。該系統有效地實現了圖像的去噪并且將計算中值所需的時鐘周期數降至1個。設計采取了時序電路與組合電路相結合的方法,不僅避免了組合電路毛刺等問題,還可以快速的在像素到來的下一個時鐘將上一行對應位置的中值穩定輸出,達到了快速抑制噪聲的目的。該設計對于的實時圖像預處理具有一定的應用價值。