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