關(guān)鍵詞:Sobel邊緣檢測;FPGA;自適應(yīng)閾值
0 引言
邊緣檢測被廣泛運用于車牌識別、人臉檢測、藥用植物形態(tài)研究、醫(yī)學(xué)影像等領(lǐng)域[1]。圖像邊緣是圖像最重要的特征之一,是圖像處理的基礎(chǔ),圖像的大多數(shù)信息都儲存在圖像邊緣中。邊緣檢測的目的是標識數(shù)字圖像中灰度變化明顯的點,在計算機視覺和圖形分析等應(yīng)用中起著重要作用[2]。常見的邊緣檢測算法可以分為一階和二階邊緣檢測算法,一階算法有Roberts 算法、Sobel 算法和Prewitt 算法;二階算法有Laplacian算法、Canny算法和LOG算法[3]等。
隨著現(xiàn)場可編程門陣列(Field Programmable GateArray,F(xiàn)PGA) 技術(shù)的快速發(fā)展,利用FPGA平臺設(shè)計的邊緣檢測系統(tǒng)由于其并行流水線、高速數(shù)據(jù)處理的特點而被廣泛采用[4]。傳統(tǒng)的Soble邊沿檢測算法只進行水平(0°) 和垂直(90°) 兩個方向進行檢測,因此,定位精度不夠高;并且特征點檢測閾值人為設(shè)定后再不能變,算法自適應(yīng)差。為解決上述兩個問題,本文對傳統(tǒng)算法進行改進,主要表現(xiàn)在以下3個方面。第一,采用FPGA平臺并行執(zhí)行Sobel算子;第二,采用0°、45°、90°和135° 4個方向進行梯度檢測,提高邊緣檢測定位精度。第三,采用3×3中值濾波滑動窗口的中間值為閾值,使得Sobel算子具有自適應(yīng)。
最后在FPGA 平臺上,通過使用Verilog 編程語言,進行系統(tǒng)的設(shè)計和驗證。實驗表明,與傳統(tǒng)的Soble算子相比,本文提出的算法更具有邊沿檢測精度更高,魯棒性更高,能更好地捕捉圖像的邊緣信息。
1 Sobel 算法
1.1 傳統(tǒng)的Sobel 算法
Sobel算法是一階邊緣檢測算法,優(yōu)點是算法簡單、計算量小,但是對圖像的處理容易出現(xiàn)邊緣過于粗糙,產(chǎn)生偽邊緣從而導(dǎo)致定位不準確等問題。傳統(tǒng)的Sobel算子僅有水平和垂直兩個方向算子,水平算子和垂直算子的梯度計算公式如公式(1)、(2)所示,梯度幅值G 計算公式,如公式(3)所示,圖1(a)和(b)分別為水平方向和垂直方向的梯度算子,(c)為3×3像素窗口矩陣。
公式(3)和(4)中:G 為局部邊緣強度即梯度幅值,θ為梯度方向角[5]。通過將梯度幅值G 與人為設(shè)定的閾值進行比較,進行圖像的二值化處理,如果梯度幅值G大于設(shè)定的閾值,該像素點被處理為邊緣點,并賦予其最大灰度值255;如果梯度幅值G小于等于閾值,則將該像素點的灰度值設(shè)為0。
傳統(tǒng)的Sobel邊緣檢測算法梯度計算模板有限,存在著以下的缺點:
(1) 計算方向比較單一,只檢測水平和垂直兩個方向,對其他方向的邊緣信息沒有考慮,如果其他方向上的幅值較高,但是水平方向和垂直方向合成的梯度幅值較低,導(dǎo)致圖像部分邊緣細節(jié)的丟失。
(2) 閾值需要人為設(shè)定,不具備自適應(yīng)性。如果閾值設(shè)置不當,可能會導(dǎo)致邊緣信息的缺失或者增加虛假的邊緣信息。
1.2 改進的Sobel 算法
對于傳統(tǒng)Sobel算法存在的缺點,本文從3個方面來改進:
(1) 采用FPGA 平臺并行執(zhí)行Sobel算子,以提高處理速度。
(2) 增加梯度計算模板,增加了45°和135°方向算子,將3×3 像素窗口矩陣分別與四方向進行卷積計算,得到對應(yīng)方向的梯度幅值。
(3) 采用基于中值濾波思想的自適應(yīng)閾值選取策略,采用3×3中值濾波滑動窗口的中間值作為閾值,提高計算效率的同時使得Sobel算子具有自適應(yīng)。
2 硬件設(shè)計及實現(xiàn)
圖2為該系統(tǒng)的整體架構(gòu),首先通過Matlab工具進行圖像預(yù)處理先將圖片進行雙邊濾波去噪,然后再進行灰度轉(zhuǎn)換,將灰度轉(zhuǎn)換后的圖片數(shù)據(jù)通過串口發(fā)送給FPGA,F(xiàn)PGA進行Sobel邊緣處理和自適應(yīng)閾值處理,最后將邊緣檢測的結(jié)果輸出到VGA顯示器上。
2.1 圖像預(yù)處理
在圖像傳輸或者采集的過程中,不可避免地會因為傳輸環(huán)境等因素對圖像數(shù)據(jù)造成影響,產(chǎn)生噪聲[6]。噪聲的存在可能導(dǎo)致在邊緣檢測的過程中,產(chǎn)生錯誤的邊緣信息,將噪聲誤認為是邊緣,或者將真實的邊緣與噪聲混淆。所以,在進行邊緣檢測前,首先要對圖像數(shù)據(jù)進行降噪處理。
雙邊濾波算法可以有效去除圖像的各種噪聲,包括高斯噪聲和均勻噪聲,既可以達到降噪平滑的作用,同時還能很好地保持邊緣[7],因此本文通過雙邊濾波算法對圖像進行降噪的預(yù)處理。
由于邊緣檢測算法是在灰度域進行處理[8],所以在進行邊緣檢測前需要將圖像轉(zhuǎn)換為灰度圖,由RGB 圖像轉(zhuǎn)換成YCbCr圖像的公式如公式(5)所示:
由于本文設(shè)計沒有采用攝像頭模塊,而是選擇收集現(xiàn)場圖像作為圖像數(shù)據(jù)來進行邊緣檢測,因此采用Matlab工具進行圖像預(yù)處理。Matlab讀取圖片后先對圖像進行雙邊濾波,然后再將圖像進行灰度圖像處理,最后將圖像數(shù)據(jù)輸出,之后將圖像數(shù)據(jù)通過串口發(fā)送給FPGA進行邊緣處理。
2.2 邊緣處理模塊
Sobel邊緣處理模塊采用的FIFO求和的思想。本文選取一個3×3的窗口數(shù)據(jù),因此采用FIFO來處理數(shù)據(jù)[9]。兩個FIFO的作用是緩存兩行,可以得到三行數(shù)據(jù)。這里用到了FPGA的流水線特性,其優(yōu)勢在于能夠?qū)崿F(xiàn)數(shù)據(jù)的連續(xù)緩存與處理,這不僅有效減少了緩存空間的占用,而且提高了數(shù)據(jù)流的處理速度[10]。
將數(shù)據(jù)寫入寄存器之后,需要將寄存器里的數(shù)據(jù)進行Sobel處理,因此,再次定義一個讀出標志信號,當行計數(shù)器計數(shù)到第三行的時候,將緩存的數(shù)據(jù)往外讀出,對數(shù)據(jù)進行Sobel運算和閾值計算[11]。
為了獲得更多的邊緣信息,將增加的45°和135° 方向的Sobel算子參與計算,計算模板如圖3所示,其中圖3(a)為45°方向算子、圖3(b)為135°方向算子。
將水平方向和垂直方向算子以及45°和135°算子分別與像素窗口進行卷積計算,改進的梯度計算公式如公式(6)所示:
使用ModelSim SE-64 10.5對邊緣處理模塊進行仿真驗證,其結(jié)果如圖4所示。a1-c3是要進行Sobel 運算的像素點,初值為0,當使能信號rd_en_reg有效時,將dout_1_reg、dout_2_reg、pi_data_reg分別賦值給a3、b3、c3,a3、b3、c3賦值給a2、b2、c2,a2、b2、c2賦值給a1、b1、c1。
2.3 自適應(yīng)閾值分割模塊
在自適應(yīng)閾值模塊中,采用快速中值濾波的思想,利用FPGA并行計算的特點,對3×3像素窗口的9 個像素并行計算,計算流程如圖5所示,其具體操作如下:
1) 分別對每行3個像素進行兩兩比較,得到最大值Max、中間值Mid、最小值Min;
2) 求3個最大值的最小值Max_Min、求3個中間值的中間值Mid_Mid 以及求3 個最小值的最大值Min_Max;
3) 求Max_Min、Mid_Mid、Min_Max 的中間值,即為我們所需要的中間值。
圖像分割可以根據(jù)公式(8),通過比較梯度幅值G與最后得到的中值Mid_Z來區(qū)分是否是邊緣點。
使用ModelSim SE-64 10.5對自適應(yīng)閾值模塊進行仿真驗證,其結(jié)果如圖6所示。當19出現(xiàn)2個時鐘周期后,窗口更新為36,129,9,136,174,155,74,185,19,再經(jīng)過3個時鐘周期的中值濾波流水線操作,輸出為129,手算結(jié)果也為129,驗證正確,算法在FPGA上的正確性得以驗證。
2.4 圖像顯示模塊
視頻圖形陣列(Video Graphics Array,VGA) 使用模擬信號的電腦顯示標準,支持640×480,1024×768等多種分辨率,是目前常用的圖像標準之一[12]。
VGA顯示器顯示圖像,是采用掃描的方式,將構(gòu)成圖像的像素點,在行同步信號和場同步信號的同步下,按照從上到下、由左到右的順序掃描到顯示屏上。VGA顯示器掃描方式,如圖7所示。
hsync表示行同步信號,hsync自上升沿起到下一個上升沿止為一個完整周期,這段時間被稱為行掃描周期,同理,vsync場同步信號一個完整周期被稱為場掃描周期,VGA 掃描時序圖如圖8 所示。其中,以VGA分辨率640×480為例,640是指有效示顯數(shù)據(jù)每一行有640個像素點,480是指每一幀圖像有480行。一個行掃描周期為(圖8(a)行掃描時序中的行掃描周期)為800個像素時間,一個場掃描周期(圖8(b))場掃描時序中的場掃描周期)為525行時間[13]。
使用ModelSim SE-64 10.5對圖像模塊進行仿真驗證,其結(jié)果如圖9所示。pix_x信號在圖像顯示有效區(qū)域循環(huán)計數(shù),計數(shù)周期為像素時鐘周期,計數(shù)范圍0~639,計數(shù)640 次,與圖像行顯示有效區(qū)域參數(shù)一致;pix_y信號在圖像顯示有效區(qū)b53c1c6b3080124afe0ed8bec4c22c17域循環(huán)計數(shù),計數(shù)周期為完整的pix_x計數(shù)周期,計數(shù)范圍0~479,計數(shù)480 次。rgb 信號在rgb_valid 信號有效時,被賦值為pix_data,rgb_valid信號無效時,賦值為0。
3 結(jié)果與分析
本文通過FPGA對圖像進行邊緣檢測。所處操作環(huán)境是Windows11系統(tǒng),CPU為i7-13650HX,GPU為4060Ti。首先使用MatlabR2022b版本對圖像進行預(yù)處理,經(jīng)過QuartusⅡ 18.ef4490ecfb840082006d2e5fa019d5cf 0軟件編寫Verilog HDL語言來實現(xiàn)數(shù)據(jù)的傳遞、處理,通過ModelSim SE-64 10.5 驗證算法的可行性。最后采用Alter 公司的EP4CE10F17C8型號的FPGA開發(fā)板進行上板驗證。
對圖片大小為160×160尺寸的圖片進行測試,傳統(tǒng)Sobel邊緣檢測算法使用人工設(shè)定的閾值60。
圖10(a)為實驗lena帽檐原圖;圖10(b)為經(jīng)過雙邊濾波和灰度化原圖;圖10(c)為經(jīng)過傳統(tǒng)Sobel邊緣檢測的效果圖;圖10(d)為經(jīng)過四方向的Sobel邊緣檢測效果圖;圖10(e)為本文經(jīng)過四方向和自適應(yīng)閾值So?bel邊緣檢測效果圖。本文算法提取了更多的邊緣信息,較四方向Sobel的邊緣連續(xù)性更加完整,提高了邊緣檢測的準確性。
表1給出了本文算法和傳統(tǒng)Sobel算法在FPGA 上的資源占用情況。
通過表1可以看出,本文算法與傳統(tǒng)Sobel邊緣檢測算法比較,可以看出本文算法在硬件消耗的邏輯資源上有所增加,主要用于實現(xiàn)四方向梯度計算和自適應(yīng)閾值的功能。
同時根據(jù)QuartusⅡ提供的功耗報告可知,本文算法系統(tǒng)的總功耗為69.58 mW,其中靜態(tài)功耗為48.30mW,I/O口功耗為21.28 mW,系統(tǒng)滿足低功耗的要求。
4 總結(jié)
本文分析了傳統(tǒng)Sobel邊緣檢測算法的優(yōu)缺點,并針對傳統(tǒng)Sobel算法存在的缺點做了改進。一是增加的梯度計算模板,由水平和垂直2個方向增加45° 和90°到4個方向。二是對閾值的獲取做出改進,將原來需要人為設(shè)定閾值改為自適應(yīng)閾值。通過Mat?lab對圖像預(yù)處理后,板級驗證結(jié)果表明,本文算法在提高邊緣檢測精度的同時,也滿足了實時性和低功耗的要求,具有一定的應(yīng)用價值。