王 靜
(安康學(xué)院電子與信息工程系,陜西 安康 725000)
在數(shù)字圖像處理以及對物體的識別、計(jì)算機(jī)視覺、生物醫(yī)學(xué)、人工智能、遙感、氣象預(yù)測學(xué)等諸多領(lǐng)域中,圖像的特征提取有著很重要的作用。邊緣是物體一個(gè)不變的特性,同時(shí)人的視覺系統(tǒng)對邊緣也是最敏感的,因此邊緣檢測是圖像處理的重要內(nèi)容,它已經(jīng)成為眾多學(xué)者研究的重點(diǎn)和熱點(diǎn)之一。
圖像邊緣檢測與提取的技術(shù)研究一直貫穿于圖像處理與分析的始終,邊緣檢測指“在一幅有一個(gè)或多個(gè)物體圖像的畫面中尋找其三維邊界,如陰影、紋理、邊沿等”通常通過圖像中某些確定點(diǎn)的灰度值、色度等來分辨出物體的邊界。從狹義上也可以說,邊緣檢測“主要是圖像灰度變化的度量、檢測和定位”[1]。
2.1 濾波。邊緣檢測算法主要是基于圖像灰度的一階導(dǎo)數(shù)和二階導(dǎo)數(shù),但導(dǎo)數(shù)的計(jì)算同樣對噪聲很敏感,因此必須使用濾波器來改善與噪聲有關(guān)的邊緣檢測方法的性能。
2.2 增強(qiáng)。增強(qiáng)邊緣的基礎(chǔ)是確定圖像中各點(diǎn)鄰域強(qiáng)度的變化值。
2.3 檢測。在圖像中有許多梯度幅值比較大的像素點(diǎn),而這些點(diǎn)并不一定都是想要的圖像邊緣,所以應(yīng)該用某種可靠的方法來確定哪些點(diǎn)是邊緣點(diǎn)。最簡單可靠的邊緣檢測就是根據(jù)圖像幅度閾值來判斷。
2.4 定位。確定邊緣所在的像素,也可以在亞像素分辨率上來估計(jì)邊緣位置,邊緣的方向也是可以被估計(jì)出來的。
硬件加速器是指利用硬件模塊來代替軟件算法。硬件在執(zhí)行各種操作時(shí)要比軟件快得多,其優(yōu)勢尤其表現(xiàn)在對大量數(shù)據(jù)進(jìn)行計(jì)算和傳輸方面。
4.1.1 Sobel 邊緣檢測法的機(jī)理。Sobel 邊緣檢測法的機(jī)理是計(jì)算x 和y 方向亮度信號的導(dǎo)數(shù)值并且尋找導(dǎo)數(shù)中的最大值和最小值。這些區(qū)域也就是亮度變化最劇烈的區(qū)域[2]。
Sobel 檢測法通過叫作卷積的過程來估計(jì)每個(gè)像素點(diǎn)在每個(gè)方向上的導(dǎo)數(shù)值。分別用于計(jì)算x 和y 方向?qū)?shù)值的Sobel卷積表Gx和Gy點(diǎn)和離它最近的8個(gè)像素點(diǎn)每個(gè)乘以一個(gè)系數(shù)后相加。先把每個(gè)像素值分別乘以卷積表中對應(yīng)的各系數(shù),再把相乘得到的9個(gè)數(shù)相加就可以得到x方向和y方向的偏導(dǎo)數(shù)值Dx和Dy。然后,利用這兩個(gè)偏導(dǎo)數(shù)值計(jì)算中心像素點(diǎn)的導(dǎo)數(shù)。計(jì)算公式如下:
由于只想得到導(dǎo)數(shù)幅值的最大值和最小值,對上式作如下簡化:
這樣近似能夠滿足計(jì)算要求。并且,與計(jì)算平方和開平方相比,計(jì)算絕對值所用的硬件資源少得多。
它需要重復(fù)地計(jì)算圖像中每個(gè)像素位置導(dǎo)數(shù)的幅值。最簡單的方法就是把圖像中邊緣像素點(diǎn)的導(dǎo)數(shù)數(shù)值|D|都設(shè)置為0[3-4]。
4.1.2 計(jì)算Sobel卷積比特?cái)?shù)
計(jì)算Sobel 卷積中表示每個(gè)像素點(diǎn)中間值和最終值所需要的比特?cái)?shù),
求出每個(gè)Dx和Dy的值需要把各自的9個(gè)部分積相加。
4.1.3 確定能夠滿足計(jì)算性能的并行結(jié)構(gòu)方案
按照要求同時(shí)對盡可能多的像素進(jìn)行并行計(jì)算。從原始圖像的頂部像素開始,通過獨(dú)立并行操作得到中間結(jié)果,最后求出底部的導(dǎo)數(shù)像素。然后可以并行地把兩組各6個(gè)部分積加起來,再并行地計(jì)算兩個(gè)絕對值,把它們加起來最后得到(原始圖像某個(gè)像素的)導(dǎo)數(shù)像素值[5]。
4.1.4 確定加速器的結(jié)構(gòu)
原始圖像的像素,一旦被讀取,就可以用來計(jì)算該像素的后一列、本列和前一列中3個(gè)像素的導(dǎo)數(shù),這樣可以進(jìn)一步減少所占的內(nèi)存帶寬。
從原始圖像中讀取三行,每行4個(gè)相鄰的像素,把這些像素值存儲在加速器的寄存器中以待處理。
計(jì)算流水線按照每4個(gè)像素值一組的形式產(chǎn)生給定行的導(dǎo)數(shù)像素值。加速器從內(nèi)存中的上一行、本行、下一行各讀取4個(gè)像素點(diǎn)到右上角的3個(gè)32位寄存器中。在接下來的4個(gè)時(shí)鐘周期里,像素值依次左移,每次移一個(gè)像素值,到乘法器陣列中。陣列中的每個(gè)單元包括一個(gè)像素值寄存器和一個(gè)或兩個(gè)乘法電路。乘法電路用于把像素值寄存器中存儲的像素值乘以一個(gè)常量系數(shù)。
在每個(gè)時(shí)鐘周期,硬件電路陣列提供了求一個(gè)導(dǎo)數(shù)像素值所需要的部分積,部分積加起來后存儲到Dx和Dy寄存器中。同樣,在每個(gè)時(shí)鐘周期,計(jì)算出前一個(gè)像素值的Dx和Dy的絕對值,加起來后存儲到|D|寄存器中。|D|寄存器中的導(dǎo)數(shù)像素值左移到結(jié)果行寄存器中。當(dāng)寄存器中4個(gè)結(jié)果像素值都準(zhǔn)備好后,隨即被寫入到內(nèi)存中。進(jìn)入穩(wěn)態(tài)后,在處理一行的過程中,加速器在移入新的像素值到乘法法器陣列,Dx,Dy和|D|寄存器之前,需要把導(dǎo)數(shù)像素值從結(jié)果寄存器先寫到內(nèi)存中。再讀入3組各4個(gè)像素點(diǎn),像素值按時(shí)鐘節(jié)拍移入計(jì)算流水線,當(dāng)結(jié)果寄存器填滿4個(gè)像素值后,再次寫到內(nèi)存,然后不斷重復(fù)這個(gè)過程。
當(dāng)?shù)竭_(dá)一行的結(jié)尾,需要排出流水線中的數(shù)據(jù)。因?yàn)橐恍欣锵袼攸c(diǎn)的個(gè)數(shù)是4 的整數(shù)倍(640=160×4),每次都可以讀到包含4個(gè)像素值的完整組。當(dāng)把一行里最后4個(gè)像素讀入讀寄存器,經(jīng)過4個(gè)計(jì)算周期后,結(jié)果寄存器被移入4個(gè)新的結(jié)果值,同時(shí)讀寄存器中的像素值被全部移入流水線中。然后結(jié)果寄存器被寫入內(nèi)存。由于整行像素已經(jīng)被讀完,不執(zhí)行讀操作。此時(shí),流水線中還有數(shù)據(jù),再執(zhí)行4個(gè)計(jì)算周期排出流水線中的數(shù)據(jù)。
[1]夏宇聞.Verilog數(shù)字系統(tǒng)設(shè)計(jì)教程[M].北京:北京航天航空大學(xué)出版社,2003.
[2]黃智偉,王彥.FPGA系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[M].北京:電子工業(yè)出版社,2005.
[3]姚遠(yuǎn),李辰.FPGA 應(yīng)用開發(fā)入門與典型實(shí)例(修訂版)[M].北京:人民郵電出版社,2010.
[4]徐志軍.大規(guī)??删幊踢壿嬈骷捌鋺?yīng)用[M].成都:電子科技大學(xué)出版社,2000.
[5]吳厚航.深入淺出玩轉(zhuǎn)FPGA[M].北京:北京航天航空大學(xué)出版社,2010.