楊 康, 衛(wèi) 敏, 孫 磊
(安徽大學(xué) 電氣與自動化學(xué)院,安徽 合肥 230601)
圖像邊緣檢測是計算機視覺、模式識別等專業(yè)領(lǐng)域極其重要的步驟,其目的是通過算法把圖像的邊緣檢測出來,為后續(xù)復(fù)雜算法做準(zhǔn)備,對目標(biāo)識別、圖像分割等高層次應(yīng)用有很大的影響[1]。常見的邊緣檢測算子有很多種,比如一階的Roberts算子、Prewitt算子、Sobel算子,二階的有Laplace算子、Log算子、Canny算子[2]。相對于前幾種邊緣檢測算子抗干擾性差,對噪聲敏感,Canny算子對圖像邊緣檢測效果更加,因而被廣泛使用,但該算法的雙邊緣閾值需要人為根據(jù)經(jīng)驗給定,并且算法在用軟件實現(xiàn)時,數(shù)據(jù)量大,處理速度較慢,滿足不了實時性的要求。
隨著現(xiàn)場可編程門陣列(field programmable gate array,FPGA)技術(shù)的快速發(fā)展,利用FPGA平臺設(shè)計的邊緣檢測系統(tǒng)由于其并行流水線、高速數(shù)據(jù)處理的特點而被廣泛采用[3]。傳統(tǒng)的Canny算法的閾值需要人為給定,自適應(yīng)性較差。本文在Bernsen算法[4]基礎(chǔ)上,利用中值濾波算法求出的中值、最大值、最小值,再結(jié)合加權(quán)平均法自動生成高低閾值。最后在FPGA平臺,利用Verilog編程語言進(jìn)行系統(tǒng)設(shè)計與驗證。
由于Canny算法[5]對噪聲有較強的抗干擾能力,并且邊緣提取更為準(zhǔn)確而被廣泛的使用。Canny算法具體可以分為以下幾個步驟,首先選用合適的高斯濾波函數(shù),對圖像進(jìn)行平滑處理,濾除一定的噪聲。然后利用2×2模板梯度算子計算梯度幅值以及方向,其次對梯度幅值進(jìn)行非極大值抑制,細(xì)化邊緣,最后利用雙邊緣法,去除偽邊緣,連接有效邊緣。經(jīng)典Canny算法相比前幾個算法有很好的邊緣提取效果,但仍有其自身的局限性[6]:
1)傳統(tǒng)的Canny算法計算梯度幅值是利用2×2模板,盡管模板越小,邊緣定位越準(zhǔn)確,但對噪聲的抗干擾能力較弱,3×3檢測模板兼顧了檢測速度與精度,是理想的檢測模板。
2)傳統(tǒng)的Canny算法采用雙閾值方法連接邊緣,需要人為設(shè)定閾值,閾值設(shè)置過高會丟失大量邊緣,設(shè)置過低,會產(chǎn)生許多偽邊緣,不具備自適應(yīng)能力。
針對傳統(tǒng)算法的不足先進(jìn)行以下改進(jìn),把2×2檢測模板改為3×3的Sobel檢測模板。
設(shè)圖像函數(shù)為f(i,j),圖1(a)為目標(biāo)像素點P22的8領(lǐng)域窗口,圖1(b) 和圖1(c)分別為水平方向和垂直方向的梯度算子。
圖1 Sobel梯度算子
水平梯度和垂直梯度公式如下
Gx=(P13+2P23+P33)-(P11+2P21+P31)
(1)
Gy=(P31+2P32+P33)-(P11+2P12+P13)
(2)
梯度幅值為
(3)
梯度方向為
θ=arctan(Gx/Gy)
(4)
Bernsen算法是經(jīng)典的局部閾值自適應(yīng)算法,原理是利用矩陣窗口中的像素灰度級的最大值和最小值的平均值作為窗口中心像素的自適應(yīng)閾值,為了使算法更具代表性和自適應(yīng)性,加入中值濾波算法求得的中值并引入權(quán)值系數(shù)不斷調(diào)整閾值的大小。改進(jìn)后的算法描繪如下:
設(shè)在以目標(biāo)像素點(i,j)為中心的3×3窗口中,窗口中最大像素值為Max(Pij),中值為Med(Pij),最小值為Min(Pij),權(quán)值系數(shù)分別為f1,f2,f3,則圖像像素各點的閾值為
T(i,j)=(f1×Max(Pij)+f2×Med(Pij)+
f3×Min(Pij))/3
(5)
式(5)權(quán)值系數(shù)的范圍大于0小于1,隨著矩形窗口的擴大而相應(yīng)的增加。在求得式(5)中的自適應(yīng)閾值后,把它作為Canny算法的高閾值Th,低閾值取其1/2大小,即Tl=0.5Th。
系統(tǒng)由OV7725攝像頭、海力士提供的容量為256 Mb的SDRAM芯片、FPGA控制單元以及VGA顯示器組成。硬件總體結(jié)構(gòu)圖如圖2所示。首先通過IIC接口及數(shù)據(jù)采集模塊,實現(xiàn)攝像頭對外界視頻圖像的采集,采集來的圖像數(shù)據(jù)經(jīng)過SDRAM緩存,然后經(jīng)過灰度變換處理模塊,處理后的圖像數(shù)據(jù)一方面經(jīng)過高斯濾波、梯度幅值和方向計算模塊、非極大值抑制等處理模塊,另一方面同時進(jìn)行自適應(yīng)閾值處理,為經(jīng)過非極大值后的圖像進(jìn)行雙閾值處理提供實時自適應(yīng)閾值做準(zhǔn)備。最后得到的邊緣圖像在VGA顯示器上顯示。其中FPGA控制單元主要對外部接口芯片及圖像輸入數(shù)據(jù)進(jìn)行控制與處理。
圖2 系統(tǒng)總體結(jié)構(gòu)
I2C接口是由串行時鐘線和串行數(shù)據(jù)線組成,通過I2C時序電路的設(shè)計來完成對攝像頭中寄存器的配置,最后通過設(shè)計OV7725的通信時序,來完成對圖像數(shù)據(jù)的采集。IIC接口時序分為寫操作與讀操作兩大部分,圖3給出了寫操作時序仿真波形,讀操作原理類似。當(dāng)時鐘信號為高電平,數(shù)據(jù)線為低電平時,數(shù)據(jù)傳輸開始,首先寫入設(shè)備地址42 H,收到設(shè)備應(yīng)答信號ACK,開始寫入寄存器地址12 H,再次收到應(yīng)答信號ACK后,開始寫入8位數(shù)據(jù)80 H,之后進(jìn)行讀操作,由于原理類似,不再做贅述。
圖3 I2C接口寫操作時序仿真
在圖像處理模塊中,VGA接口模塊是25 MHz的時鐘域,SDRAM的接口模塊是100 MHz時鐘域,由于速率的不匹配,會影響整個系統(tǒng)的工作性能,為了解決這種跨時鐘域的問題,引入兩種控制技巧[7]。
1)引入WFIFO和RFIFO兩個異步FIFO作為圖像數(shù)據(jù)的輸入輸出緩存模塊。當(dāng)一幀640×480的圖像的每個像素點按順序?qū)懭氲絎FIFO時,WFIFO的數(shù)據(jù)大于或等于256個時,WFIFO請求寫SDRAM;當(dāng)SDRAM響應(yīng)了寫請求時,從WFIFO中讀取數(shù)據(jù)寫入到SDRAM。同理當(dāng)RFIFO中的數(shù)據(jù)小于256時,給SDRAM發(fā)送讀請求,把從SDRAM中讀出的數(shù)據(jù)寫到RFIFO中,VGA接口模塊在行場信號到達(dá)有效區(qū)域后,給RFIFO發(fā)送讀請求,讀取圖像數(shù)據(jù)。
2)為了減少圖像拖影等問題利用乒乓操作進(jìn)行Bank切換,以完成數(shù)據(jù)無縫緩存與處理。階段A,WFIFO數(shù)據(jù)寫入Bank0,RFIFO從Bank讀出數(shù)據(jù),等寫完且讀完一幀圖像后,切換Bank;階段B,WFIFO數(shù)據(jù)寫入Bank3,RFIFO從Bank0讀出數(shù)據(jù),等寫完且讀完一幀圖像后,再切換Bank,依次反復(fù)循環(huán)。Bank切換過程如圖4所示。
圖4 Bank切換過程
矩陣窗口的獲取是后續(xù)圖像處理算法中必不可少的一環(huán),傳統(tǒng)的矩陣窗口利用FIFO或RAM作為緩沖器[8],本文通過調(diào)用軟件中的IP核中的2個移位寄存器來進(jìn)行延遲生成矩陣窗口,由于OV7225攝像頭的分辨率為640×480,移位寄存器中的行緩存深度可以設(shè)置為640。移位的2行與當(dāng)前的圖像數(shù)據(jù)流組成3行數(shù)據(jù),為了使數(shù)據(jù)對齊即能夠同時并行輸出,可以每行增加3個寄存器進(jìn)行延遲,結(jié)構(gòu)如圖5所示,模塊仿真波形圖如圖6所示。由仿真波形可知:3個時鐘周期后矩陣窗口形成。
圖5 矩形窗口生成
圖6 矩形窗口仿真
利用FPGA并行處理快速求得所需的中值,運算過程如圖7所示。
圖7 自適應(yīng)閾值運算結(jié)構(gòu)
利用FPGA并行處理數(shù)據(jù)的特點,首先把并行輸入的9個數(shù)據(jù)分成3組,利用3個三輸入的比較器進(jìn)行排序,一個時鐘周期的并行運算后,每個比較器都輸出相應(yīng)的最大值、中間值、最小值,然后再次利用3個比較器分別給3個最大值、3個中間值、3個最小值進(jìn)行排序,經(jīng)過1個時鐘周期后,把3個最大值比較器進(jìn)行比較得到的最小值、中間值比較器得到的中間值、最小值比較器得到的最大值再次進(jìn)行比較,總共3個時鐘周期得到矩陣窗口中值。由于窗口中的最大值,最小值在第2個時鐘周期就已經(jīng)可以得出,為了使數(shù)據(jù)同步,把最大值、最小值分別利用寄存器打一拍。最后利用式(5)加權(quán)平均計算得到自適應(yīng)閾值,為了計算方便,這里取f1=f2=f3=0.5。
梯度幅值和方向可以利用式(3)、式(4)精確計算出來,但開方運算和反三角函數(shù)在硬件實現(xiàn)過程中會消耗大量邏輯資源,不宜采用,在實際設(shè)計中梯度幅值可以近似為水平梯度與垂直梯度的絕對值的和,即M=|Gx|+|Gy|。對梯度方向而言,為節(jié)省邏輯開銷,方向可以根據(jù)水平梯度值Gx和垂直梯度值Gy及其二者的絕對值的比較運算具體量化成一定的范圍,運算量化準(zhǔn)則如圖8(a)所示。利用中心對稱原理,只需求得Ⅰ,Ⅱ,Ⅲ,Ⅳ四個方向即可。圖8(b)是為了進(jìn)行非極大值抑制運算做準(zhǔn)備的矩陣窗口領(lǐng)域內(nèi)4方向梯度標(biāo)記圖。
圖8 梯度方向量化示意
當(dāng)運算結(jié)果符合8扇區(qū)的Ⅰ區(qū)域時即為水平方向記為“00”以此類推Ⅱ扇區(qū)對應(yīng)“10”、 Ⅲ扇區(qū)對應(yīng)“01”、Ⅳ扇區(qū)對應(yīng)“11”。
非極大值抑制主要是對前面計算的梯度幅值及梯度方向的計算結(jié)果進(jìn)行開窗運算[9],遍歷梯度幅值圖像中的每一個像素,將矩陣中心的梯度像素值與其同方向的兩個梯度值作比較,如果當(dāng)前梯度值為最大值,則為邊緣點,否則為非邊緣點。硬件實現(xiàn)過程如圖9所示。
圖9 非極大值抑制硬件實現(xiàn)
將經(jīng)過非極大值抑制算法輸出的梯度值與前面所求得的高低閾值進(jìn)行比較,若大于高閾值則將其值置為1,所得的圖像記為f1,稱之為強邊緣圖像,小于低閾值則全部置為0,大于低閾值小于高閾值的值置為1,所得的圖像記為f2,稱之為弱邊緣圖像。統(tǒng)計f1,f2的值,若f1=1,則該點是邊緣點,若f1=0并且f2=1,判斷前8領(lǐng)域是否有強邊緣點,若有,則該點為邊緣點置為1,否則為非邊緣點置為0。其硬件實現(xiàn)結(jié)構(gòu)如圖10所示。
圖10 邊緣連接硬件實現(xiàn)
將本文設(shè)計的閾值自適應(yīng)邊緣檢測系統(tǒng)利用Verilog語言編程,Quartus13.1軟件綜合,在Altera公司提供的CycloneⅣ系統(tǒng)芯片EP4CE6F17C8N上實現(xiàn),圖11(a)為彩色圖像經(jīng)過灰度變換后的灰度圖像,圖11(b)是利用經(jīng)典的Sobel算子、閾值人為給定的檢測結(jié)果,圖11(c)是傳統(tǒng)的Canny的算子檢測圖,圖11(d)是利用本文設(shè)計的自適應(yīng)閾值后的出的結(jié)果,對比可知經(jīng)典的Sobel算子檢測邊緣較寬,并且丟失了大量的真實邊緣,傳統(tǒng)的Canny算子邊緣定位較精確,但也受人為設(shè)定閾值的影響,會丟失一些邊緣,而且含有一定的偽邊緣。本文設(shè)計的邊緣檢測系統(tǒng)能夠彌補前兩種傳統(tǒng)算法的缺點,邊緣定位準(zhǔn)確,同時很好滿足地實時性的要求。
圖11 實驗現(xiàn)象
本文利用FPGA并行流水線,高速處理數(shù)據(jù)的能力,設(shè)計了實時性視頻邊緣檢測系統(tǒng)。相比傳統(tǒng)的Canny算子閾值需要人為給定的情況下,利用中值濾波算法結(jié)合加權(quán)系數(shù)自適應(yīng)給定閾值,邊緣定位準(zhǔn)確、自適應(yīng)性強。本系統(tǒng)在車牌識別,目標(biāo)追蹤等專業(yè)領(lǐng)域有較強應(yīng)用前景。