王 玨,李智偉,陳 松
(中國(guó)科學(xué)技術(shù)大學(xué) 信息科學(xué)技術(shù)學(xué)院,安徽 合肥 230026)
圖像在采集、傳輸、處理、接收及成像過程中會(huì)因各種干擾而引入椒鹽噪聲。椒鹽噪聲是由圖像傳感器、傳輸信道、解碼處理等產(chǎn)生的黑白相間的亮暗點(diǎn)噪聲,是一種因?yàn)樾盘?hào)脈沖強(qiáng)度引起的噪聲。這種噪聲的存在惡化了圖像的質(zhì)量,影響了圖像本身的特征,妨礙了對(duì)圖像的研究,所以如何實(shí)現(xiàn)更好的圖像去噪是一個(gè)很值得研究的問題[1]。
目前,去除脈沖干擾及椒鹽噪聲最常用的算法是中值濾波,它可以很好地抑制脈沖噪聲提高信噪比,同時(shí)還能保護(hù)圖像的邊緣[2]。中值濾波的基本原理是把數(shù)字圖像中一點(diǎn)的值用該點(diǎn)鄰域內(nèi)的各個(gè)點(diǎn)值的中值來代替。一般的排序算法思想就是對(duì)像素的值進(jìn)行比較和交換,典型的有冒泡排序、插入排序。這些算法和當(dāng)前的比較操作必須基于上一次的比較操作結(jié)果,所以對(duì)于大窗口的中值濾波,軟件運(yùn)行需要很長(zhǎng)時(shí)間,而硬件計(jì)算起來就需要大量的硬件邏輯資源。目前大部分使用的是3×3的中值濾波算法,但是在較為復(fù)雜的圖像中,濾波效果不是很好。所以本文采用了5×5的窗口設(shè)計(jì)。但是基于一般的排序中值濾波算法硬件實(shí)施起來會(huì)消耗較多的邏輯資源,因此本文設(shè)計(jì)了一種基于位級(jí)中值濾波算法的硬件架構(gòu)[3],減少了比較的次數(shù)和進(jìn)行數(shù)據(jù)計(jì)算操作的位寬,從而實(shí)現(xiàn)了節(jié)約硬件邏輯資源,且易于FPGA的實(shí)現(xiàn)。
整個(gè)位級(jí)中值濾波算法的原理是基于不斷找到所有排序的數(shù)中較大的數(shù)并淘汰的這個(gè)原理來實(shí)現(xiàn)的。
圖像數(shù)據(jù)要求以二進(jìn)制形式進(jìn)行計(jì)算,從最高位到最低位,依次對(duì)窗口內(nèi)所有數(shù)據(jù)在相同位上的數(shù)值進(jìn)行操作。假設(shè)當(dāng)前窗口內(nèi)有N個(gè)非0數(shù)據(jù)需要排序,則窗口內(nèi)非0數(shù)據(jù)的一半為M(向下取整)。從最高位開始,統(tǒng)計(jì)在當(dāng)前位有效數(shù)據(jù)中所有數(shù)值為1的數(shù)據(jù)個(gè)數(shù)。最高位計(jì)算時(shí),數(shù)據(jù)非0即為有效數(shù)據(jù)。再將數(shù)值為1的個(gè)數(shù)與被淘汰的較大的數(shù)累加,累加的和與M進(jìn)行比較,若大于M,則在下一位的計(jì)算中,當(dāng)前計(jì)算位值為1所對(duì)應(yīng)的數(shù)據(jù)為有效數(shù)據(jù);否則,在下一位的計(jì)算中,當(dāng)前計(jì)算位值為0所對(duì)應(yīng)的數(shù)值為有效數(shù)據(jù)。
對(duì)于被淘汰的較大的數(shù)據(jù)個(gè)數(shù)的計(jì)算,在每一位的計(jì)算中,如果在當(dāng)前位值為1的數(shù)據(jù)集合沒有進(jìn)入下一位的計(jì)算,則說明在當(dāng)前計(jì)算位值為1的數(shù)據(jù)被淘汰,將這個(gè)在當(dāng)前位淘汰的數(shù)據(jù)個(gè)數(shù)與在前面的位計(jì)算中淘汰的數(shù)據(jù)個(gè)數(shù)累加,即為總的被淘汰的數(shù)據(jù)個(gè)數(shù)。
從最高位到最低位,依次進(jìn)行上述的位操作,直到最后一位計(jì)算完之后,留下的仍然有效的數(shù)據(jù)就是所需要找到的中值。
本次硬件架構(gòu)主要由兩個(gè)部分組成:數(shù)據(jù)緩存模塊和位計(jì)算單元模塊,圖1展示了總體的一個(gè)硬件架構(gòu)圖。
圖1 總體設(shè)計(jì)硬件架構(gòu)圖
圖2 位計(jì)算單元結(jié)構(gòu)圖
對(duì)于數(shù)據(jù)緩存模塊,由于本次設(shè)計(jì)使用了5×5的中值濾波窗口,且為了提高處理速度要求整個(gè)硬件設(shè)計(jì)是一個(gè)流水線結(jié)構(gòu),也就是窗口內(nèi)25個(gè)數(shù)據(jù)會(huì)同時(shí)送入到下一個(gè)計(jì)算模塊中,因此需要4個(gè)RAM來緩存每一行的數(shù)據(jù),和5×5的寄存器陣列來緩存窗口內(nèi)的數(shù)據(jù)。RAM是調(diào)用FPGA的IP核來實(shí)現(xiàn)的。4個(gè)RAM的連接關(guān)系和數(shù)據(jù)流走向如圖1中虛線所示,d_1~d_5口同時(shí)輸出相鄰的5行在同一列下的數(shù)據(jù)到寄存器陣列中。
由數(shù)據(jù)輸入端逐行輸入圖像數(shù)據(jù),并按照虛線的箭頭方向依次送入RAM1~RAM4中。每一個(gè)周期從輸入端送入一個(gè)新的圖像數(shù)據(jù),所以d_1~d_5口每個(gè)周期都會(huì)輸出一組新的列數(shù)據(jù),再送入后面的窗口寄存器中。這樣就可以實(shí)現(xiàn)采樣窗口在每個(gè)時(shí)鐘的控制下可以沿被處理圖像數(shù)據(jù)的行方向逐個(gè)像素滑動(dòng)[4]。對(duì)于邊界處的像素?cái)?shù)據(jù),只考慮在圖像內(nèi)的窗口數(shù)據(jù)參與后續(xù)的計(jì)算單元。當(dāng)RAM3和RAM4緩存滿時(shí),即可以將窗口寄存器內(nèi)的數(shù)據(jù)送入后續(xù)的位計(jì)算單元來實(shí)現(xiàn)流水線的結(jié)構(gòu)設(shè)計(jì)。
這個(gè)寄存器陣列中的25個(gè)數(shù)據(jù)需要同時(shí)送入到下一個(gè)計(jì)算單元中,每個(gè)數(shù)據(jù)都是8 bit的,所有的25個(gè)數(shù)據(jù)都需要從最高位bit_7依次運(yùn)算到最低位bit_0。所以一共需要進(jìn)行8次相同的位計(jì)算,也就是需要8個(gè)位計(jì)算單元(bit Operation Unit,BOU)。
對(duì)于每一個(gè)位計(jì)算單元,結(jié)構(gòu)如圖2所示:假設(shè)25個(gè)窗口數(shù)據(jù)在同一位的值為d0,d1,…,d24,它們對(duì)應(yīng)的使能信號(hào)是d0_en,d1_en,…,d24_en。最高位每個(gè)非0數(shù)據(jù)的使能信號(hào)都為1,否則為0。
將每一個(gè)數(shù)據(jù)在當(dāng)前位的值di及其使能信號(hào)di_en相與,然后通過累加這25個(gè)數(shù)得到sum_c,這個(gè)值代表了當(dāng)前位有效數(shù)據(jù)中值為1的數(shù)據(jù)個(gè)數(shù)。再將sum_c和sum_pre這個(gè)值累加起來的值sum與窗口內(nèi)非0數(shù)據(jù)總數(shù)的一半M進(jìn)行比較,來計(jì)算標(biāo)志位flag。若大于M,則flag為1,否則flag為0;當(dāng)flag為1,則在下一個(gè)位計(jì)算單元中,當(dāng)前位的有效數(shù)據(jù)中,值為1的數(shù)據(jù)的使能信號(hào)為1,且傳遞到下一個(gè)位計(jì)算單元中的淘汰的較大值個(gè)數(shù)為sum_pre_o;flag為0時(shí),下一個(gè)位計(jì)算單元中,當(dāng)前位的有效數(shù)據(jù)中,值為0的數(shù)據(jù)的使能信號(hào)為1,且傳遞到下一個(gè)位計(jì)算單元中的淘汰的較大值個(gè)數(shù)為sum_pre_o。上述等價(jià)為邏輯計(jì)算就是,在下一個(gè)位計(jì)算單元中,每個(gè)數(shù)據(jù)的使能信號(hào):di_en_o=di ⊙ flag。
每個(gè)位計(jì)算單元在一個(gè)周期內(nèi)完成,因?yàn)槊總€(gè)像素是8 bit的數(shù)據(jù),所以需要8個(gè)周期才能完成一個(gè)窗口內(nèi)的中值排序輸出結(jié)果。位計(jì)算單元仍是流水線結(jié)構(gòu)。
根據(jù)上述的硬件架構(gòu)設(shè)計(jì)可知,每個(gè)位計(jì)算單元僅為1 bit的邏輯操作,位計(jì)算單元的個(gè)數(shù)等于數(shù)據(jù)的位寬,所以本文設(shè)計(jì)的中值濾波的硬件設(shè)計(jì)的一個(gè)重要優(yōu)點(diǎn)就是硬件資源的消耗和窗口模板大小以及數(shù)據(jù)的二進(jìn)制表示位寬呈線性關(guān)系,這在中值濾波窗口較大的情況下有利于節(jié)約資源。
本次實(shí)驗(yàn)使用了Xilinx公司下的硬件開發(fā)工具Vivado平臺(tái)來進(jìn)行開發(fā),完成了架構(gòu)設(shè)計(jì)、代碼撰寫、功能仿真、綜合實(shí)現(xiàn)等一系列的開發(fā)流程。首先將一幅加了高斯噪聲的256×256分辨率大小的圖像通過MATLAB轉(zhuǎn)化為數(shù)據(jù)文件,來作為硬件設(shè)計(jì)的激勵(lì)文件,再經(jīng)過Vivado Simulator進(jìn)行仿真來得到中值濾波后的數(shù)據(jù)結(jié)果,將仿真得到的數(shù)據(jù)再寫入.txt文件中,再用MATLAB來處理這個(gè)文件并顯示數(shù)據(jù)。所得到的結(jié)果如圖3所示,其中圖gray-img表示原圖,圖noise-img為加了高斯噪聲后的圖像,圖med-img為通過仿真得到的5×5窗口大小下的中值濾波的效果。
圖3 實(shí)驗(yàn)結(jié)果圖
表1對(duì)比了一些常規(guī)的中值濾波算法和本文的設(shè)計(jì)在硬件實(shí)現(xiàn)時(shí),所消耗的LUT(Look Up Table)硬件資源。從表中可見,在5×5窗口下的,本設(shè)計(jì)中的硬件資源LUT消耗遠(yuǎn)低于一些傳統(tǒng)的中值濾波算法。
表1 中值濾波器硬件LUT資源使用情況對(duì)比
本文的硬件設(shè)計(jì)中,對(duì)于從第一個(gè)數(shù)據(jù)串行輸入到第一個(gè)有效中值輸出總共間隔了2×256+16=528個(gè)周期,所以對(duì)于處理一幅分辨率大小為256×256的圖像,采用本文的設(shè)計(jì),在100 MHZ的處理頻率下,所花費(fèi)時(shí)間為:(528+256×256)=0.66 ms,完全滿足實(shí)時(shí)性處理的要求。
為了解決數(shù)字圖像中常遇見的噪聲問題,本文從去噪性能、資源消耗、運(yùn)算速度等方面綜合考慮,設(shè)計(jì)了一種基于位比較算法的中值濾波器的硬件架構(gòu),選擇了5×5大小的窗口,相對(duì)于一些常規(guī)的中值濾波算法,本文的設(shè)計(jì)大大地減小了硬件資源的消耗。本文所設(shè)計(jì)的結(jié)構(gòu)簡(jiǎn)單,系統(tǒng)實(shí)時(shí)性高,硬件資源消耗較小,易于在FPGA上實(shí)現(xiàn),為高效率、低資源的中值濾波硬件設(shè)計(jì)提供了進(jìn)一步的參考。