廖傳柱 (漳州職業技術學院電子工程系,福建 漳州363000)
隨著計算機技術的高速發展,數字圖像處理技術已經融入到日常生活中,如照片、刊物、航空測量、衛星遙感等。在圖像測量技術的研究中,圖像邊緣檢測是圖像處理的一個基本問題。在圖像邊緣檢測中,邊緣檢測算子分為一階微分算子和二階微分算子。常見的一階微分算子有Prewitt算子、Canny算子、Sobel算子、Roberts Cross算子、Kirsch算子和羅盤算子等。二階微分算子包括Laplacian算子和LOG算子等[1,2]。下面,筆者對基于FPGA(現場可編程門陣列)的Sobel邊緣檢測算子的實現問題進行了研究。
Sobel邊緣檢測算子是離散型差分算子,用來運算圖像亮度函數的梯度近似值。在圖像的任何一點使用該算子,將會產生對應的梯度矢量或法矢量[3,4]。假設在圖像平面上有一個9個點的小區域:

用二次曲面z(x,y)來擬合上述9個點的灰度值,即用:

來近似圖像灰度函數f(x,y),并使均方誤差:


它的2個卷積模板為:

Sobel邊緣檢測算法原理圖如圖1所示:首先,分別計算水平梯度和垂直梯度,然后將2個方向的梯度值結合起來,通過一個門限值后,再輸出二值圖像。
假設輸入的像素點分別為a11、a12、a13、a21、a22、a23、a31、a32、a33,則x方向的梯度和y方向的梯度分別為:


圖1 Sobel邊緣檢測算法原理圖
梯度結合后的梯度值G為:

門限處理函數:

式中,GT是門限處理的閾值。
根據以上分析,可知在空間域上比較容易實現Sobel邊緣檢測算子,且采用上述方法可以有效處理噪聲的影響[5-6]。
Sobel邊緣檢測算法的關鍵在于計算梯度值G,由式(6)和式(7)可知:

設計中應避免使用乘法和除法運算以減小系統面積。具體算法實現框圖如圖2所示。在圖2中,a11、a12、a13、a21、a22、a23、a31、a32、a33分別表示對應的像素點。在算法實現過程中,主要進行加法和減法操作,圖2中的abs框表示的是取絕對值操作。通過編譯綜合,最后生成RTL級框圖(見圖3,其中最左側的模塊所實現的功能是生成3×3窗口,接下來左邊第2個模塊的功能是計算水平梯度和垂直梯度,下一個模塊的功能是計算絕對值,最后一個模塊的功能是整合梯度以及計算閾值)。

圖2 Sobel邊緣檢測算法實現框圖

圖3 Sobel邊緣檢測算法的RTL級原理圖
通過圖3可以清晰地看出,Sobel的內部結構設計,而從圖4則能看出算法模塊部分的輸入輸出關系,其中,clk為時鐘信號,rst是復位信號。median_out_flag是輸出使能信號的輸出端口,median_data_in是像素灰度信息的輸入端口,它們是8位無符號數,取值范圍是0~255。輸出信號包括:輸出結果sobel_data;已開始輸出指示信號sobel_en。x和y分別是從內部行計數器輸出的像素點的x、y坐標。

圖4 Sobel邊緣檢測算法模塊的端口
Sobel邊緣檢測算法設計中FPGA代碼所包括的文件見圖5。
每個算子的仿真工程都由上述文件構成,下面以圖3為參照來介紹各個文件的作用。圖3中最左側的模塊是fe_generater_mode3by3.v,主要功能是生成3×3窗口,其輸入是串行的圖像數據,輸出則是3×3的卷積窗口。該文件模塊調用的fe_fifo1和fe_fifo2以及data3by3,其中前面2個文件都是quartus的IP核,而后面的文件則最終生成3×3的窗口。從左側起第2個模塊(data_grads.v)是算子實現和計算模塊,該模塊輸入的是3×3的圖像塊,輸入的則是圖像塊中心像素點的x方向和y方向的梯度。接下來的是2個計算絕對值的模塊,上述模塊也是由quartusIP核生成的。緊接著的模塊abs.v的作用是將其左側模塊的2個梯度值相加,最右面的模塊的作用是閾值判決。需要指出的是,閾值修改邊緣檢測中的閾值是在頂層文件Grads.v的以下面語句中:

圖5 Sobel邊緣檢測算法設計中的FPGA代碼所包含的文件

此時為675,修改(abs_data≥675)的數據就是更改閾值。算子的實現部分是在data_grads.v文件中實現的。
該模塊的測試數據來自于經過Matlab處理的一個txt文件,其操作代碼如下:

這個文件中存儲的是在testbench文件中主要是通過一個系統函數$readmemh(“image.txt”,data_mem)將圖像數據文件image.txt讀入到變量data_mem中,再通過一個always語句在每個時鐘上升沿到來之時依次將變量值賦值給輸入端口。仿真時將相應的存儲結果再存儲到image_process.txt文件中。處理結果的存儲主要包括以下代碼:

仿真結果如圖6、圖7所示,分別為Sobel邊緣檢測算法的仿真結果及其細節圖。圖6中clk時鐘信號顯示不清楚,而圖7則能清楚顯示clk時鐘信號和圖像信息輸入數據median_data_in的變化,即sobel_data只有2種狀態0x00和0xff。若前點在邊緣上,則通過系統后該點的數值變為0xff,若前點不是在邊緣上則該點輸出為0x00。

圖6 Sobel邊緣檢測算法的仿真結果圖

圖7 Sobel邊緣檢測算法的仿真結果細節圖
在modelsim仿真的過程中,通過相應函數將圖的處理結果存儲在image_process.txt文件中,再通過Matlab的imshow函數實現圖像數據的顯示。
Sobel邊緣檢測算子的仿真結果圖如圖8所示。從圖8可以看出,與處理前的圖片相比,處理后的圖片將邊緣亮點都清晰標記出來,這表明實現了基于FPGA的Sobel邊緣檢測。

圖8 Sobel邊緣檢測算子的仿真結果圖
對Sobel邊緣檢測算子進行了介紹,在此基礎上對Sobel邊緣檢測算法進行設計,并利用FPGA平臺對其進行了仿真。分析表明,運用Sobel邊緣檢測算法處理后的圖片能清晰標記邊緣亮點,取得了良好的圖像邊緣檢測效果。
[1]章毓晉 .圖像工程——圖像處理[M].北京:清華大學出版社,2012.
[2]范培培 .基于FPGA的圖像處理方法研究與實現[D].天津:河北工業大學,2010.
[3]付麥霞,張元,廉飛宇 .基于CPLD的圖像邊緣檢測器的研究[J].通信技術,2009,42(11):67~69.
[4]唐良瑞,馬全明,景曉軍,等 .圖像處理實用技術[M].北京:化學工業出版社,2002.
[5]吳艷 .基于FPGA的數字圖像處理基本算法研究與實現[D].哈爾濱:哈爾濱工業大學,2008.
[6]褚鎮勇.FPGA設計及應用[M].西安:西安電子科技大學出版社,2002.