方惠蓉
(漳州職業(yè)技術(shù)學(xué)院)
現(xiàn)實(shí)生活中,在照片、刊物、航空測(cè)量、衛(wèi)星遙感等領(lǐng)域,數(shù)字圖像處理技術(shù)是必不可少的,圖像的邊緣是圖像最基本的特征,圖像的邊緣檢測(cè)在數(shù)字圖像處理中顯得非常重要,這也使圖像的邊緣檢測(cè)成為國(guó)內(nèi)外研究的一個(gè)非常活躍的領(lǐng)域[3].邊緣包含了圖像豐富的信息,它是完實(shí)現(xiàn)圖像分割、圖像配準(zhǔn)、圖像分類以及圖像識(shí)別的重要保障,如果邊緣檢測(cè)能夠成功,那么圖像分析就會(huì)變得很方便很簡(jiǎn)單,并且其精度也會(huì)得到相應(yīng)的提高[4].邊緣檢測(cè)算子分為一階微分算子和二階微分算子.常見的一階微分算子有Prewitt算子,Canny算子、Sobel算子、Roberts Cross算子,Kirsch算子,羅盤算子等等.二階微分算子包括Laplacian算子和LOG算子等等[1].該文主要介紹了Prewitt邊緣檢測(cè)算子的原理以及基于FPGA的Prewitt邊緣檢測(cè)算法的實(shí)現(xiàn).
Prewitt算子是一種邊緣模板算子,這種算法是利用局部差分平均方法來尋找邊緣的,該算法體現(xiàn)了三對(duì)像素點(diǎn)像素值之差的平均概念.首先這些算子的模板是由理想的邊緣算子圖像構(gòu)成的,然后依次用邊緣模板去檢測(cè)待檢測(cè)的圖像,再由與被檢測(cè)區(qū)域最為相似的模板給出檢測(cè)的最大值,并且用這個(gè)最大值代替算子的輸出值,這樣邊緣像素就被檢測(cè)出來了[7].
在這里假設(shè)在圖像平面上有一個(gè)9個(gè)點(diǎn)的小區(qū)域:

Prewitt算子是通過對(duì)平面上9個(gè)點(diǎn)進(jìn)行曲面擬合進(jìn)而求擬合曲面偏導(dǎo)數(shù),最后再計(jì)算梯度的幅值.根據(jù)Prewitt的定義可以得到Prewitt算子:

其中兩個(gè)卷積為:

主要思路是,通過matlab軟件采集圖片的各個(gè)像素點(diǎn),將灰度值寫進(jìn)image.txt文件里,然后通過quartusII軟件進(jìn)行編程,生成3*3的窗口,進(jìn)行加法、減法以及絕對(duì)值計(jì)算操作,再通過testbench.v仿真文件對(duì)數(shù)據(jù)進(jìn)行處理,經(jīng)過modelsim軟件仿真,將數(shù)據(jù)寫進(jìn) image_process.txt里,由于簡(jiǎn)單的波形仿真無法看出具體的效果,所以最后通過matlab軟件對(duì)image.txt和image_process.txt文件進(jìn)行處理,輸出處理圖像.Prewitt邊緣檢測(cè)算子的原理如圖1所示.

圖1 Prewitt邊緣檢測(cè)算法原理圖
首先分別計(jì)算水平梯度和垂直梯度,然后將兩個(gè)方向的梯度值結(jié)合起來,接著通過一個(gè)門限值后,最后輸出二值圖像.通過前面的分析可知,假設(shè)輸入的像素點(diǎn)分別為 a11,a12,a13,a21,a22,a23,a31,a32,a33.那么 x 方向的梯度和 y 方向的梯度分別為:

梯度結(jié)合后的梯度值G為:

門限處理函數(shù):

在式(6)中GT是門限處理的閾值.根據(jù)以上分析,可以比較清晰地知道在空間域上實(shí)現(xiàn)Prewitt算子比較容易,并且采用這種方法可以比較有效地處理噪聲的影響.
Prewitt算法的關(guān)鍵在于計(jì)算梯度值G.由前面分析可知

上述方法具體的算法實(shí)現(xiàn)框圖如圖2所示[2]:

圖2 Prewitt算法實(shí)現(xiàn)框圖
在框圖 2 中 a11,a12,a13,a21,a22,a23,a31,a32,a33表示對(duì)應(yīng)的像素點(diǎn).在上述實(shí)現(xiàn)過程中進(jìn)行的主要是加法操作和減法操作,框圖中的abs框表示的是取絕對(duì)值操作.通過編譯綜合,最后生成的是RTL級(jí)框圖,如圖3所示,在圖3中最左側(cè)的模塊所實(shí)現(xiàn)的功能是生成3*3窗口,接下來左邊第二個(gè)模塊的功能是計(jì)算水平梯度和垂直梯度,下一個(gè)模塊的功能是計(jì)算絕對(duì)值,最后一個(gè)模塊的功能是整合梯度以及計(jì)算閾值[2].
由圖3能清晰地看出Prewitt的內(nèi)部結(jié)構(gòu)設(shè)計(jì),而從圖4這個(gè)Prewitt端口圖則能清楚的看出這個(gè)模塊部分的輸入輸出關(guān)系.
圖4中的clk為時(shí)鐘信號(hào),rst是復(fù)位信號(hào).median_out_flag是輸出使能信號(hào)的輸出端口,median_data_in是像素灰度信息的輸入端口,它們是8位無符號(hào)數(shù),取值范圍是0~255.輸出信號(hào)包括:輸出結(jié)果sobel_data.已開始輸出指示信號(hào)sobel_en.x和y是從內(nèi)部行計(jì)數(shù)器輸出的像素點(diǎn)的 x,y 坐標(biāo)[2].
閾值修改邊緣檢測(cè)的閾值是在頂層文件Grads.v的下面這個(gè)語句中:

設(shè)定閾值,此時(shí)為675,修改(abs_data>=675)的數(shù)據(jù)就是更改閾值.算子的實(shí)現(xiàn)部分是在data_grads.v文件中實(shí)現(xiàn)的,具體代碼如下所示://產(chǎn)生Gx橫向梯度

圖3 Prewitt算法的RTL級(jí)原理圖

圖4 Prewitt算法模塊的端口


在quartus II創(chuàng)建的仿真工程中包括的文件主要有 abs.v、data_grads.v、fe_data3by3.v、fe_fifol.v、fe_fifo2.v、fe_generater_mode3by3d.v、Grads.v、Gx_grad.v、Gy_grad.vtestbench.v.其中Grads.v 是頂層文件,fe_generater_mode3by3.v 用于生成3*3的窗口,以串行的圖像數(shù)據(jù)作為輸入.fe_generater_mode3by3.v 調(diào)用有 fe_fifo1、fe_fifo2以及 data3by3,fe_fifo1、fe_fifo2 是 quartus II的IP核,data3by3文件最終生成3*3的窗口.data_grads.v作用是算子實(shí)現(xiàn)和計(jì)算,其輸入為3*3的圖像,輸出是圖像中心像素點(diǎn)的x方向和y方向的梯度.abs.v是計(jì)算絕對(duì)值得,testbench.v是仿真測(cè)試文件.仿真的時(shí)候?qū)estbench.v設(shè)置為仿真測(cè)試文件,仿真結(jié)果如圖5、圖6.

圖5 Prewitt算法的仿真結(jié)果

圖6 Prewitt算法的仿真結(jié)果細(xì)節(jié)
圖5是仿真的整體圖,可以看到在這個(gè)圖中clk時(shí)鐘信號(hào)已經(jīng)看不清楚,圖6能清楚的看到sobel_data(Prewitt邊緣檢測(cè)結(jié)果數(shù)據(jù))的輸出變化.圖6是將仿真圖放大之后的效果,在這個(gè)圖中能看出clk時(shí)鐘信號(hào)和圖像信息輸入數(shù)據(jù)median_data_in的變化.可以看到出sobel_data只有兩種狀態(tài)0x00和0xff.當(dāng)前點(diǎn)如果是在邊緣上則通過系統(tǒng)之后該點(diǎn)的數(shù)值變?yōu)?xff,如果當(dāng)前點(diǎn)不是在邊緣上則該點(diǎn)輸出為0x00.
需要說明的是仿真是通過以下程序進(jìn)行讀寫操作的:
讀程序initial

寫程序integer w_file;

主要是寫到 image_process.txt文件中去,所以quartussimulationmodelsim路徑下有image_process.txt這個(gè)文件,當(dāng)當(dāng)然,此路徑下 image.txt也是很重要的,在讀程序中主要是讀其中的數(shù)據(jù),其中存放的主要是一些數(shù),也就是灰度值,而image_process.txt是經(jīng)過處理之后生成的文件,存放的主要是一些十六進(jìn)制數(shù).下面介紹MATLAB軟件處理.在MATLAB中有一個(gè)文件image_write.m,用于讀取圖片信息,然后將數(shù)據(jù)寫進(jìn)image.txt中,這也是上述仿真中 image.txt文件的來源.另外一個(gè)就image_read.m,主要程序?yàn)?/p>

其主要功能為讀取image.txt和image_process.txt中的數(shù)據(jù),然后進(jìn)行處理,輸出如圖7.
如圖7(1)是處理前的圖片,圖7(2)是處理后的圖片,處理后的圖片將邊緣亮點(diǎn)都標(biāo)記出來了.這就實(shí)現(xiàn)了基于FPGA的Prewitt邊緣檢測(cè).Prewitt算子具有平滑作用,能濾除一些噪聲,去掉部分偽邊緣,邊緣性也比較完整,但同時(shí)也平滑了真正的邊緣,但是定位精度不高.

圖7 Prewitt邊緣檢測(cè)算子的仿真結(jié)果(閾值為675)
首先簡(jiǎn)單介紹了Prewitt邊緣檢測(cè)算子,分析了Prewitt算子的基本原理,然后結(jié)合理論分析闡述了基于FPGA的Prewitt邊緣檢測(cè)算子的設(shè)計(jì)思路,利用FPGA平臺(tái)對(duì)各個(gè)模塊進(jìn)行了仿真,并利用MATLAB軟件中的imshow函數(shù)實(shí)現(xiàn)了圖像數(shù)據(jù)的顯示,對(duì)實(shí)驗(yàn)數(shù)據(jù)進(jìn)行了分析,分析得出Prewitt邊緣檢測(cè)具有平滑噪聲的作用,邊緣性也比較完整,但其定位精度有待提高,這是今后需要努力的地方.
[1]張亶,陳剛編.基于偏微分方程的圖像處理.北京:高等教育出版社,2004.20–61
[2]范培培.基于FPGA的圖像處理方法研究與實(shí)現(xiàn)[D].天津:河北工業(yè)大學(xué),2010.
[3]張永軍.基于FPGA的圖像處理系統(tǒng)設(shè)計(jì)與算法實(shí)現(xiàn)研究[D].重慶:重慶大學(xué),2006.
[4]付麥霞,張?jiān)w宇.基于CPLD的圖像邊緣檢測(cè)器的研究[J].通信技術(shù),2009,42(11):36-41.
[5]云霄.可配置FFT/IFFT處理器的設(shè)計(jì)及其FPGA構(gòu)造[D].西安:西安電子科技大學(xué),2009
[6]鄭文明.基于FPGA的數(shù)字信號(hào)處理算法研究與高效實(shí)現(xiàn)[D].黑龍江:哈爾濱工程大學(xué),2009.
[7]唐良瑞,馬全明,景曉軍,等.圖像處理實(shí)用技術(shù).北京:化學(xué)工業(yè)出版社,2002.1.
[8]褚鎮(zhèn)勇.FPGA設(shè)計(jì)及應(yīng)用.西安:西安電子科技大學(xué)出版社,2002.7.