甘振華,應(yīng) 駿
(上海師范大學(xué) 信息與機(jī)電工程學(xué)院,上海 200234)
Sobel邊緣檢測(cè)算法是分析視頻圖像場(chǎng)景的常用算法,應(yīng)用于諸多領(lǐng)域,如安全監(jiān)控、人工智能和計(jì)算機(jī)圖形學(xué)等。數(shù)字圖像處理常用的硬件平臺(tái)是嵌入式DSP系統(tǒng)和專用集成電路(ASIC)。隨著網(wǎng)絡(luò)多媒體和通信技術(shù)的發(fā)展,數(shù)字圖像攜帶的信息量也在不斷增加,傳統(tǒng)的DSP技術(shù)難以滿足圖像處理的實(shí)時(shí)性要求,而ASIC由于不夠靈活,在圖像處理領(lǐng)域的運(yùn)用也比較少。近年來(lái),F(xiàn)PGA技術(shù)快速發(fā)展,具有高效的并行處理能力,可采用流水線技術(shù)來(lái)設(shè)計(jì),處理速度與DSP系統(tǒng)相比可提高100倍以上,因此采用FPGA來(lái)搭建數(shù)字圖像處理平臺(tái)有其獨(dú)特的優(yōu)越性[1]。鑒于此,筆者提出用FPGA設(shè)計(jì)嵌入式圖像邊緣檢測(cè)系統(tǒng)。
圖像 g(x,y)的梯度定義為
梯度的模為
Sobel算子對(duì)圖像的每個(gè)像素以檢測(cè)像素點(diǎn)為中心,使用如圖1所示的卷積模板來(lái)計(jì)算導(dǎo)數(shù)值Gx和Gy。當(dāng)ΔG≥T時(shí),在該位置的像素是一個(gè)邊緣像素,其中T是一個(gè)指定的閾值。Sobel算子的本質(zhì)是一種改進(jìn)的梯度算法,相當(dāng)于進(jìn)行一次平滑濾波處理,實(shí)現(xiàn)了除噪。
圖1 x方向和y方向的卷積模板
系統(tǒng)基于Altera公司的Cyclone系列芯片中的EP1C12Q240C8型FPGA和TMS320C55x系列DSP處理器,設(shè)計(jì)采用OpenCores制定的Wishbone總線,其位寬為32 bit,時(shí)鐘頻率為100 MHz。加速器是嵌入式系統(tǒng)中為高速執(zhí)行某些操作而設(shè)計(jì)的專用定制硬件,它可以進(jìn)行直接內(nèi)存訪問(wèn)(Direct Memory Access,DMA),也就是在內(nèi)存中自主存取數(shù)據(jù),不需要處理器來(lái)發(fā)起內(nèi)存訪問(wèn),從而大大提高了傳輸速度。加速器既可以作為主模塊向CPU發(fā)起訪問(wèn)總線的請(qǐng)求信號(hào),也可以作為從模塊來(lái)響應(yīng)處理器對(duì)其進(jìn)行的操作。為了能與嵌入式軟件互動(dòng),加速器應(yīng)自帶控制寄存器,處理器只需給控制寄存器提供起始內(nèi)存地址,加速器便能自動(dòng)執(zhí)行任務(wù)。由于加速器和處理器共享對(duì)內(nèi)存的訪問(wèn)通路,而內(nèi)存同一時(shí)刻只能執(zhí)行一次訪問(wèn),因此需在系統(tǒng)中設(shè)置一個(gè)仲裁器(arbiter)來(lái)確保子系統(tǒng)能夠輪流訪問(wèn)內(nèi)存[2]。嵌入式Sobel邊緣檢測(cè)系統(tǒng)的總體框圖如圖2所示[3-4]。
圖2 系統(tǒng)總體框圖
其工作過(guò)程如下:存儲(chǔ)在主機(jī)中的原始圖像信號(hào)通過(guò)總線傳輸?shù)教幚砥?,處理器在接收到?lái)的圖像信號(hào)時(shí),并不對(duì)圖像進(jìn)行處理,而是給Sobel加速器的控制寄存器提供起始內(nèi)存地址。與此同時(shí),加速器向仲裁器發(fā)起訪問(wèn)總線的請(qǐng)求信號(hào)(request),當(dāng)處理器向加速器寫(xiě)完基地址后,仲裁器便給加速器發(fā)出準(zhǔn)許信號(hào)(grant),此時(shí)加速器則占有總線使用權(quán),便可以按照DMA的方式在內(nèi)存中讀寫(xiě)數(shù)據(jù)。根據(jù)處理器放入加速器控制寄存器的地址,用加速器本身攜帶的計(jì)數(shù)器可以產(chǎn)生DMA所需的后續(xù)地址電路。圖像數(shù)據(jù)經(jīng)過(guò)輸入FIFO緩存,然后經(jīng)過(guò)Sobel加速器處理,產(chǎn)生的導(dǎo)數(shù)數(shù)據(jù),經(jīng)過(guò)輸出FIFO緩存,以DMA的方式把導(dǎo)數(shù)數(shù)據(jù)寫(xiě)入內(nèi)存。與此同時(shí),處理器向仲裁器發(fā)起訪問(wèn)總線的請(qǐng)求信號(hào),當(dāng)加速器處理完一幅圖像數(shù)據(jù)后,仲裁器便給處理器發(fā)出準(zhǔn)許信號(hào),此時(shí)處理器則占有總線使用權(quán),等待下一次處理。
加速器是嵌入式系統(tǒng)中的一部分,如何最大限度地減少其占用的內(nèi)存帶寬,提高與系統(tǒng)的互動(dòng)性,是需要考慮的問(wèn)題。本設(shè)計(jì)處理的圖像的分辨力為640×480,圖像每像素到達(dá)需要100 ns,存儲(chǔ)原始圖像和導(dǎo)數(shù)圖像的內(nèi)存位寬為32 bit,內(nèi)存每次讀寫(xiě)需花費(fèi)20 ns,則讀寫(xiě)每個(gè)像素并存儲(chǔ)到內(nèi)存中,會(huì)消耗可用內(nèi)存帶寬的20%。若把4個(gè)像素值合起來(lái),用一次讀寫(xiě)操作來(lái)存儲(chǔ)這些像素,消耗的可用內(nèi)存帶寬減少到5%[2]。由Sobel邊緣檢測(cè)算法可知,原始圖像的像素一旦被讀取,就可以用來(lái)計(jì)算像素相鄰域的導(dǎo)數(shù)值,為使每計(jì)算4個(gè)像素只讀取1次,可在數(shù)據(jù)輸入端設(shè)置1個(gè)4×8寄存器組和2個(gè)FIFO來(lái)存儲(chǔ)從主存中讀取的前2行像素,并設(shè)計(jì)一個(gè)地址產(chǎn)生電路來(lái)更新圖像數(shù)據(jù)。Sobel算子并行處理框圖如圖3所示。其中乘法器用加法、減法和移位代替,Ai,j為要計(jì)算的像素點(diǎn)[5]。
圖3 Sobel算子并行處理框圖
Sobel算子流水線過(guò)程如下:首先將圖像數(shù)據(jù)的第1行,第2行分別讀入2個(gè)FIFO中,然后從內(nèi)存中逐次讀取圖像第3行的4個(gè)像素點(diǎn)到起始寄存器組中,并行輸出3行圖像數(shù)據(jù),由9個(gè)D觸發(fā)器進(jìn)行時(shí)延,形成3×3像素窗口數(shù)據(jù)。由于FIFO可同時(shí)進(jìn)行讀寫(xiě),F(xiàn)IFO1和FIFO2在讀出數(shù)據(jù)時(shí),將分別寫(xiě)入起始寄存器組讀進(jìn)的數(shù)據(jù)和FIFO1讀進(jìn)的數(shù)據(jù),以便重復(fù)利用內(nèi)存讀入的數(shù)據(jù)。根據(jù)并行處理的特點(diǎn),起始寄存器讀取數(shù)據(jù)的同時(shí),邊緣值計(jì)算模塊也開(kāi)始工作,計(jì)算輸入的窗口數(shù)據(jù),產(chǎn)生結(jié)果像素值,送入4×8結(jié)果寄存器組,經(jīng)4個(gè)計(jì)算周期,結(jié)果寄存器組中4個(gè)像素值都準(zhǔn)備好后,隨即被寫(xiě)到內(nèi)存中。當(dāng)計(jì)算到一行的結(jié)尾時(shí),流水線中有3個(gè)像素值,結(jié)果寄存器組中有4個(gè)像素值,此時(shí)應(yīng)把4個(gè)結(jié)果像素值寫(xiě)入內(nèi)存,忽略起始寄存器組讀操作,執(zhí)行4個(gè)計(jì)算周期排出流水線中的3個(gè)像素值,并利用嵌入式軟件將最后排出流水線的結(jié)果像素值清0。同理,由于一行最左邊位置的像素也沒(méi)有一組完整的相鄰像素點(diǎn),所以也用嵌入式軟件對(duì)其清0。
在電路設(shè)計(jì)中,為使嵌入式軟件控制加速器提供同步,需在加速器的設(shè)計(jì)中添加控制寄存器和狀態(tài)寄存器,為簡(jiǎn)化總線接口,把這些寄存器映射到32位地址總線的相鄰地址,其寄存器地址映射如表1所示。當(dāng)處理器把啟動(dòng)偏移地址寫(xiě)入啟動(dòng)寄存器時(shí),加速器便開(kāi)始工作,狀態(tài)寄存器的第0位是完成標(biāo)志位,當(dāng)處理器處理完一幅圖像時(shí),將該位設(shè)置為1,其他位讀為0。如果此時(shí)中斷使能位也為1,加速器便發(fā)出中斷請(qǐng)求。
表1 Sobel加速器的寄存器地址映射表
本文用Verilog HDL語(yǔ)言編寫(xiě)程序,在Quartus II 9.0中進(jìn)行編譯,在ModelSim SE 6.1f平臺(tái)下進(jìn)行仿真,結(jié)果如圖4所示。原始圖像和導(dǎo)數(shù)圖像存儲(chǔ)地址分別為0000600016和0005000016,Sobel加速器寄存器基地址為20000016。系統(tǒng)復(fù)位后,處理器執(zhí)行總線寫(xiě)操作,對(duì)加速器進(jìn)行初始化,將地址、數(shù)據(jù)和控制信號(hào)分別從cpu_adr_o和cpu_dat_o寫(xiě)到sob_adr_i和 sob_dat_i。完成初始化后,處理器讓出總線使用權(quán)給加速器,啟動(dòng)加速器,其對(duì)應(yīng)地址為20000416。在光標(biāo)處,開(kāi)始讀取原始圖像數(shù)據(jù),每次讀取4個(gè)像素點(diǎn)值,每隔32 bit讀取1次,由總線bus_dat_o寫(xiě)到sobel_dat_i,再由sobel_dat_i傳輸給寄存器組curr_dat_o,計(jì)算當(dāng)前讀出的數(shù)據(jù)與FIFO1和FIFO2中開(kāi)始存儲(chǔ)的數(shù)據(jù),計(jì)算結(jié)果寫(xiě)到result_dat_i,閾值門(mén)限為110。從仿真結(jié)果中可以看出,設(shè)計(jì)達(dá)到了所需的要求。
FPGA與嵌入式技術(shù)相結(jié)合,已經(jīng)在很多工程領(lǐng)域得到了廣泛應(yīng)用,目前嵌入式圖像處理正向著高速、微型化方向發(fā)展[6]。鑒于此,筆者設(shè)計(jì)了基于FPGA的嵌入式邊緣檢測(cè)系統(tǒng),并成功地進(jìn)行了仿真。結(jié)果表明,該嵌入式Sobel邊緣檢測(cè)系統(tǒng)對(duì)圖像進(jìn)行邊緣檢測(cè)速度非常快,在100MHz的時(shí)鐘頻率下,計(jì)算1個(gè)像素點(diǎn)只需40ns,計(jì)算1幅640×480×8 bit的圖像只需12.8 ms,其處理速度比DSP提高了2個(gè)數(shù)量級(jí)以上,完全可以滿足圖像實(shí)時(shí)性的要求,具有一定的實(shí)用價(jià)值。
[1] HUSSMANN S,THIAN H H.A high-speed subpixel edge detector implementation inside a FPGA[J].Real-Time Imaging,2003(5):361-368.
[2] ASHENDEN P J.Digital design:an embedded systems approach using verilog[M].[S.l.]:Morgan Kaufmann,2007.
[3] KALOMIROS J A,LYGOURAS J.Design and evaluation of a hardware/software FPGA-based system for fast image processing[J].Microprocessors and Microsystems,2008,32(2):95-106.
[4] 初秀琴,曾祥永.一種新型的實(shí)時(shí)圖像處理機(jī)結(jié)構(gòu)及Sobel電路設(shè)計(jì)[J].儀器儀表學(xué)報(bào),2003,24(5):508-511.
[5] KORNAROS G.A softmulti-corearchitecture for edge detection and data analysis of microarray images[J].Journal of Systems Architecture:the EUROMICRO Journal,2010,56(1):48-62.
[6]BOURIDANE A,CROOKES D,DONACHY P,et al.A high level FPGA-based abstract machine for image processing[J].Journal of Systems Architecture,2007,31(8):809-824.
甘振華(1987-),碩士生,主研嵌入式系統(tǒng),視頻處理;
應(yīng) 駿(1973-),博士,碩士生導(dǎo)師,主要研究方向?yàn)榍度胧较到y(tǒng)、視頻處理。