廖傳柱 (漳州職業(yè)技術(shù)學院電子工程系,福建 漳州363000)
隨著計算機技術(shù)的高速發(fā)展,數(shù)字圖像處理技術(shù)已經(jīng)融入到日常生活中,如照片、刊物、航空測量、衛(wèi)星遙感等。在圖像測量技術(shù)的研究中,圖像邊緣檢測是圖像處理的一個基本問題。在圖像邊緣檢測中,邊緣檢測算子分為一階微分算子和二階微分算子。常見的一階微分算子有Prewitt算子、Canny算子、Sobel算子、Roberts Cross算子、Kirsch算子和羅盤算子等。二階微分算子包括Laplacian算子和LOG算子等[1,2]。下面,筆者對基于FPGA(現(xiàn)場可編程門陣列)的Sobel邊緣檢測算子的實現(xiàn)問題進行了研究。
Sobel邊緣檢測算子是離散型差分算子,用來運算圖像亮度函數(shù)的梯度近似值。在圖像的任何一點使用該算子,將會產(chǎn)生對應(yīng)的梯度矢量或法矢量[3,4]。假設(shè)在圖像平面上有一個9個點的小區(qū)域:
用二次曲面z(x,y)來擬合上述9個點的灰度值,即用:
來近似圖像灰度函數(shù)f(x,y),并使均方誤差:
它的2個卷積模板為:
Sobel邊緣檢測算法原理圖如圖1所示:首先,分別計算水平梯度和垂直梯度,然后將2個方向的梯度值結(jié)合起來,通過一個門限值后,再輸出二值圖像。
假設(shè)輸入的像素點分別為a11、a12、a13、a21、a22、a23、a31、a32、a33,則x方向的梯度和y方向的梯度分別為:
圖1 Sobel邊緣檢測算法原理圖
梯度結(jié)合后的梯度值G為:
門限處理函數(shù):
式中,GT是門限處理的閾值。
根據(jù)以上分析,可知在空間域上比較容易實現(xiàn)Sobel邊緣檢測算子,且采用上述方法可以有效處理噪聲的影響[5-6]。
Sobel邊緣檢測算法的關(guān)鍵在于計算梯度值G,由式(6)和式(7)可知:
設(shè)計中應(yīng)避免使用乘法和除法運算以減小系統(tǒng)面積。具體算法實現(xiàn)框圖如圖2所示。在圖2中,a11、a12、a13、a21、a22、a23、a31、a32、a33分別表示對應(yīng)的像素點。在算法實現(xiàn)過程中,主要進行加法和減法操作,圖2中的abs框表示的是取絕對值操作。通過編譯綜合,最后生成RTL級框圖(見圖3,其中最左側(cè)的模塊所實現(xiàn)的功能是生成3×3窗口,接下來左邊第2個模塊的功能是計算水平梯度和垂直梯度,下一個模塊的功能是計算絕對值,最后一個模塊的功能是整合梯度以及計算閾值)。
圖2 Sobel邊緣檢測算法實現(xiàn)框圖
圖3 Sobel邊緣檢測算法的RTL級原理圖
通過圖3可以清晰地看出,Sobel的內(nèi)部結(jié)構(gòu)設(shè)計,而從圖4則能看出算法模塊部分的輸入輸出關(guān)系,其中,clk為時鐘信號,rst是復(fù)位信號。median_out_flag是輸出使能信號的輸出端口,median_data_in是像素灰度信息的輸入端口,它們是8位無符號數(shù),取值范圍是0~255。輸出信號包括:輸出結(jié)果sobel_data;已開始輸出指示信號sobel_en。x和y分別是從內(nèi)部行計數(shù)器輸出的像素點的x、y坐標。
圖4 Sobel邊緣檢測算法模塊的端口
Sobel邊緣檢測算法設(shè)計中FPGA代碼所包括的文件見圖5。
每個算子的仿真工程都由上述文件構(gòu)成,下面以圖3為參照來介紹各個文件的作用。圖3中最左側(cè)的模塊是fe_generater_mode3by3.v,主要功能是生成3×3窗口,其輸入是串行的圖像數(shù)據(jù),輸出則是3×3的卷積窗口。該文件模塊調(diào)用的fe_fifo1和fe_fifo2以及data3by3,其中前面2個文件都是quartus的IP核,而后面的文件則最終生成3×3的窗口。從左側(cè)起第2個模塊(data_grads.v)是算子實現(xiàn)和計算模塊,該模塊輸入的是3×3的圖像塊,輸入的則是圖像塊中心像素點的x方向和y方向的梯度。接下來的是2個計算絕對值的模塊,上述模塊也是由quartusIP核生成的。緊接著的模塊abs.v的作用是將其左側(cè)模塊的2個梯度值相加,最右面的模塊的作用是閾值判決。需要指出的是,閾值修改邊緣檢測中的閾值是在頂層文件Grads.v的以下面語句中:
圖5 Sobel邊緣檢測算法設(shè)計中的FPGA代碼所包含的文件
此時為675,修改(abs_data≥675)的數(shù)據(jù)就是更改閾值。算子的實現(xiàn)部分是在data_grads.v文件中實現(xiàn)的。
該模塊的測試數(shù)據(jù)來自于經(jīng)過Matlab處理的一個txt文件,其操作代碼如下:
這個文件中存儲的是在testbench文件中主要是通過一個系統(tǒng)函數(shù)$readmemh(“image.txt”,data_mem)將圖像數(shù)據(jù)文件image.txt讀入到變量data_mem中,再通過一個always語句在每個時鐘上升沿到來之時依次將變量值賦值給輸入端口。仿真時將相應(yīng)的存儲結(jié)果再存儲到image_process.txt文件中。處理結(jié)果的存儲主要包括以下代碼:
仿真結(jié)果如圖6、圖7所示,分別為Sobel邊緣檢測算法的仿真結(jié)果及其細節(jié)圖。圖6中clk時鐘信號顯示不清楚,而圖7則能清楚顯示clk時鐘信號和圖像信息輸入數(shù)據(jù)median_data_in的變化,即sobel_data只有2種狀態(tài)0x00和0xff。若前點在邊緣上,則通過系統(tǒng)后該點的數(shù)值變?yōu)?xff,若前點不是在邊緣上則該點輸出為0x00。
圖6 Sobel邊緣檢測算法的仿真結(jié)果圖
圖7 Sobel邊緣檢測算法的仿真結(jié)果細節(jié)圖
在modelsim仿真的過程中,通過相應(yīng)函數(shù)將圖的處理結(jié)果存儲在image_process.txt文件中,再通過Matlab的imshow函數(shù)實現(xiàn)圖像數(shù)據(jù)的顯示。
Sobel邊緣檢測算子的仿真結(jié)果圖如圖8所示。從圖8可以看出,與處理前的圖片相比,處理后的圖片將邊緣亮點都清晰標記出來,這表明實現(xiàn)了基于FPGA的Sobel邊緣檢測。
圖8 Sobel邊緣檢測算子的仿真結(jié)果圖
對Sobel邊緣檢測算子進行了介紹,在此基礎(chǔ)上對Sobel邊緣檢測算法進行設(shè)計,并利用FPGA平臺對其進行了仿真。分析表明,運用Sobel邊緣檢測算法處理后的圖片能清晰標記邊緣亮點,取得了良好的圖像邊緣檢測效果。
[1]章毓晉 .圖像工程——圖像處理[M].北京:清華大學出版社,2012.
[2]范培培 .基于FPGA的圖像處理方法研究與實現(xiàn)[D].天津:河北工業(yè)大學,2010.
[3]付麥霞,張元,廉飛宇 .基于CPLD的圖像邊緣檢測器的研究[J].通信技術(shù),2009,42(11):67~69.
[4]唐良瑞,馬全明,景曉軍,等 .圖像處理實用技術(shù)[M].北京:化學工業(yè)出版社,2002.
[5]吳艷 .基于FPGA的數(shù)字圖像處理基本算法研究與實現(xiàn)[D].哈爾濱:哈爾濱工業(yè)大學,2008.
[6]褚鎮(zhèn)勇.FPGA設(shè)計及應(yīng)用[M].西安:西安電子科技大學出版社,2002.