謝昭莉,白穎杰
(重慶大學(xué)自動(dòng)化學(xué)院,重慶400030)
圖像邊緣檢測(cè)是圖像分割、目標(biāo)區(qū)域識(shí)別、區(qū)域形狀提取等圖像分析領(lǐng)域的基礎(chǔ),圖像理解和分析的基礎(chǔ)是邊緣檢測(cè)。邊緣檢測(cè)目前已成為機(jī)器視覺(jué)研究領(lǐng)域最活躍的課題之一,在工程應(yīng)用中占有十分重要的地位。
邊緣的檢測(cè)常借助空域微分算子進(jìn)行,通過(guò)微分模板與圖像卷積完成。常見的邊緣檢測(cè)算子有Roberts、Laplacian、Sobel、Prewitt、Krisch等,其中Prewitt和Sobel算子是在實(shí)踐中計(jì)算數(shù)字梯度時(shí)最常用的[1]。Prewitt算子比Sobel算子略簡(jiǎn)單,但實(shí)際應(yīng)用中和Sobel算子的效果差別很小。從運(yùn)算結(jié)構(gòu)上看,圖像卷積運(yùn)算主要是乘加運(yùn)算且具有很高的重復(fù)性和并行性,屬于圖像處理中最耗時(shí)的低層處理算法,其速度和性能直接影響到實(shí)時(shí)圖像處理系統(tǒng)結(jié)果的好壞,也一直是傳統(tǒng)實(shí)時(shí)圖像處理系統(tǒng)的瓶頸?,F(xiàn)場(chǎng)可編程邏輯門陣列FPGA具有高度的并行性和設(shè)計(jì)靈活性,因而基于FPGA用硬件實(shí)現(xiàn)對(duì)圖像底層的處理,可以大大提高圖像處理的速度,滿足系統(tǒng)的實(shí)時(shí)性要求。
本文針對(duì)實(shí)際使用中的320×240×8 bit的灰度圖像數(shù)據(jù)流,在FPGA芯片上利用3×3的Prewitt卷積模板檢測(cè)圖像的邊緣,動(dòng)態(tài)計(jì)算閾值,用非極大值抑制方法對(duì)邊緣檢測(cè)的結(jié)果進(jìn)行細(xì)化處理,提高了邊緣檢測(cè)的精度,滿足了實(shí)時(shí)性要求。
本文采用3×3大小的Prewitt算子。數(shù)字圖像在位置(x,y)處點(diǎn)P(x,y)的水平差分算子Gx和垂直差分算子Gy為:
該點(diǎn)梯度的模近似為[1]:
上述公式采用模板表示:
可以看出,Prewitt算子是對(duì)圖像灰度求平均后再求差分的,因此可以抑制噪聲,但Prewitt算子檢測(cè)出的邊緣較寬。模板算子運(yùn)算時(shí)采用模板卷積的方式,即把模板在圖像上移動(dòng)并在每點(diǎn)計(jì)算相應(yīng)的梯度值。Prewitt算子使用2個(gè)有向算子(1個(gè)水平,1個(gè)垂直,一般稱為掩模)。進(jìn)行邊緣檢測(cè)時(shí),用這2個(gè)核對(duì)圖像中的每個(gè)點(diǎn)做卷積,其中一個(gè)核對(duì)垂直邊緣響應(yīng)最大,而另一個(gè)則對(duì)水平邊緣響應(yīng)最大。將它們的絕對(duì)值相加作為該點(diǎn)的輸出,運(yùn)算結(jié)果是一幅梯度幅度圖像。
本文中原始圖像的大小為320×240,經(jīng)過(guò)3×3的模板卷積后,得到的梯度幅度圖像G(x,y)大小為318×238。該圖像增強(qiáng)了邊緣信息,削弱了灰度變化緩慢的信息。但是,該圖像產(chǎn)生的邊緣較粗,因而傳統(tǒng)的Prewitt邊緣檢測(cè)的定位精度較差。為了精確定位邊緣,減小后續(xù)處理的數(shù)據(jù)量和復(fù)雜度,本文對(duì)梯度幅度圖像G(x,y)進(jìn)行了非極大值抑制和二值化處理。
非極大值抑制NMS(Non-Maximum Supression)是將當(dāng)前像素的梯度值同沿其梯度方向相鄰2個(gè)梯度值進(jìn)行比較,如果其值比相鄰的梯度值小,則此像素點(diǎn)被判斷為非邊緣點(diǎn);如果其值比相鄰的梯度值大,則此像素點(diǎn)被判斷為邊緣點(diǎn)[2]。
梯度幅度圖像G(x,y)在(x,y)位置的非極大值抑制算法定義如下:
傳統(tǒng)邊緣檢測(cè)需要人工給定閾值,適用性有限。本文根據(jù)噪聲標(biāo)準(zhǔn)偏差估計(jì)RMS(estimate of noise)原理,用梯度幅度圖像的平均值與增益系數(shù)的乘積作為自適應(yīng)閾值:
這里,對(duì)Prewitt算子來(lái)說(shuō),scale取4。
最終的梯度二值(邊緣二值)圖像B(x,y)為:對(duì)梯度幅度圖像上的像素點(diǎn)G(x,y),若其梯度幅值大于閾值,并且該點(diǎn)是局部變化最大的點(diǎn),即nms(x,y)為1,則該像素點(diǎn)為圖像的邊緣:
根據(jù)以上數(shù)學(xué)推導(dǎo)和分析得出,Prewitt邊緣檢測(cè)的核心運(yùn)算是對(duì)每個(gè)像素點(diǎn)進(jìn)行8鄰域的模板卷積,以及對(duì)梯度幅度圖像進(jìn)行十字鄰域的非極大值抑制運(yùn)算。算法數(shù)據(jù)量大,但具有很高的并行性,一般通用處理器因其順序執(zhí)行的特點(diǎn)不能總是滿足實(shí)時(shí)性要求[3]。而FPGA具有硬件執(zhí)行處理、流水線任務(wù)處理技術(shù)以及并行信息處理的優(yōu)點(diǎn),適合用于圖像處理領(lǐng)域,結(jié)合自身優(yōu)點(diǎn)提高處理速度[4]。
用FPGA實(shí)現(xiàn)實(shí)時(shí)Prewitt圖像邊緣檢測(cè)及邊緣細(xì)化的流程為:
(1)從數(shù)字?jǐn)z像頭獲取8 bit灰度圖像數(shù)據(jù)流,經(jīng)過(guò)2個(gè)行緩沖器,流水生成3×3大小的窗口。
(2)根據(jù)算式1、2、3計(jì)算窗口中心像素的梯度幅值G(x,y),比較Gx和Gy的大小,輸出帶比較位的G(x,y);根據(jù)場(chǎng)信號(hào)VSYNC、行信號(hào)HREF、像素時(shí)鐘信號(hào)PCLK確定G(x,y)有效區(qū)間G_valid和有效時(shí)鐘G_clk。
(3)根據(jù)式(6)的改進(jìn)式(見下文)計(jì)算閾值,該閾值每一場(chǎng)更新1次。
(4)將第2步生成的梯度幅值圖像數(shù)據(jù)流,經(jīng)過(guò)2個(gè)行緩沖器,流水生成十字窗口。
(5)根據(jù)式(5)、式(7)判斷窗口中心像素是否為邊緣,生成邊緣二值圖像B(x,y);根據(jù)G_clk、G_valid和VSYNC確定B(x,y)的有效區(qū)間B_valid和有效時(shí)鐘B_clk。
(6)一場(chǎng)圖像流水處理完畢,進(jìn)行下一場(chǎng)圖像的在線處理。
系統(tǒng)采用流水線作業(yè)方式,由原始圖像的像素時(shí)鐘PCLK驅(qū)動(dòng),將8 bit灰度圖像數(shù)據(jù)流首先轉(zhuǎn)換成梯度幅度圖像數(shù)據(jù)流,進(jìn)而轉(zhuǎn)換成邊緣二值圖像數(shù)據(jù)流。由于經(jīng)過(guò)了3×3窗口的圖像卷積和十字窗口的非極大值抑制處理,圖像大小由原始圖像的320×240變?yōu)樘荻确葓D像的318×238,進(jìn)而變?yōu)檫吘壎祱D像的316×236。系統(tǒng)的功能結(jié)構(gòu)圖如圖1所示。
(1)復(fù)位和時(shí)鐘控制模塊
本文采用的攝像頭OV7620輸出制式NTSC,1 s有60場(chǎng)圖像(分為奇場(chǎng)和偶場(chǎng)),每場(chǎng)240行,每行640像素,原始像素時(shí)鐘周期為75 ns。時(shí)鐘控制模塊將原始像素時(shí)鐘二分頻,像素時(shí)鐘周期變?yōu)?50 ns,故輸入圖像分辨率為320×240。本設(shè)計(jì)的處理周期以場(chǎng)為單位,除了閾值以外,所有寄存器都在場(chǎng)開始時(shí)清零。
在窗口生成過(guò)程中,每個(gè)像素時(shí)鐘都會(huì)流水地生成窗口,但并不是每個(gè)都有效。對(duì)3×3窗口來(lái)說(shuō),由于采用8鄰域的模板卷積,那些在圖像邊緣的像素沒(méi)有“有效”的窗口,故只有那些行數(shù)大于2并且行內(nèi)像素?cái)?shù)大于2的點(diǎn)才有有效窗口??紤]到模板計(jì)算模塊的執(zhí)行時(shí)間,梯度幅度像素的時(shí)鐘延遲“有效”像素時(shí)鐘半個(gè)周期。邊緣二值像素時(shí)鐘產(chǎn)生的過(guò)程類似。
(2)FIFO和窗口生成模塊
以3×3窗口為例。為了實(shí)現(xiàn)窗口并行結(jié)構(gòu),需要2個(gè)先進(jìn)先出緩沖器(FIFO)和9個(gè)8 bit寄存器。可以使用FPGA內(nèi)部邏輯資源構(gòu)造FIFO,但是會(huì)占用大量的邏輯資源[5]。本文采用ACTEl提供的FIFO控制器和FPGA內(nèi)部RAM實(shí)現(xiàn)。FIFO通過(guò)2個(gè)指針來(lái)控制數(shù)據(jù)的讀寫,寫時(shí)鐘和讀時(shí)鐘分離。本文讀寫時(shí)鐘共用像素時(shí)鐘,復(fù)位時(shí)讀寫地址相同,必須初始化讀寫地址,否則不能進(jìn)行正常讀寫。為了實(shí)現(xiàn)行緩沖功能,寫使能信號(hào)比讀使能信號(hào)提前319個(gè)周期,這樣寫地址就比讀地址大319。窗口生成模塊結(jié)構(gòu)圖如圖2所示。考慮到FIFO有一個(gè)時(shí)鐘周期的延時(shí),故在第321個(gè)像素時(shí)鐘的上升沿時(shí),第321個(gè)像素被鎖入D33,第一個(gè)像素被鎖入D23。
(3)模板計(jì)算及比較模塊
該模塊按照式(1)、式(2)、式(3)在生成的窗口中計(jì)算G(x,y)。為避免數(shù)據(jù)溢出,Gx、Gy為11 bit有符號(hào)數(shù),絕對(duì)值按如下方法確定:如果最高位為1,則結(jié)果為原數(shù)取反加1,舍掉最高位(符號(hào)位);否則直接舍掉最高位(符號(hào)位)。由于后續(xù)模塊要比較Gx和Gy的大小,顯然保存Gx和Gy會(huì)浪費(fèi)很多邏輯單元,故本文將結(jié)果G(x,y)擴(kuò)展1 bit,令其最高位表示Gx和Gy的大小:如果Gx大于等于Gy,則該位為1;否則為0。
(4)閾值模塊
式(6)存在大數(shù)據(jù)除法,直接計(jì)算很慢而且不易實(shí)現(xiàn),故本文采用構(gòu)造分段函數(shù)的方法來(lái)逼近。首先將式(6)化簡(jiǎn)為:
其中累加和sum可以用累加器實(shí)現(xiàn)。經(jīng)過(guò)大量實(shí)驗(yàn)數(shù)據(jù)分析,發(fā)現(xiàn)sum值大多集中在2 000 000到4 000 000區(qū)間內(nèi),考慮到可以方便高效地用移位來(lái)實(shí)現(xiàn)除數(shù)為2的倍數(shù)的除法,故閾值threshold用式(10)逼近。FPGA實(shí)現(xiàn)時(shí),把累加器sum先右移14 bit,再減去補(bǔ)償系數(shù)。
(5)非極大值抑制及二值化模塊
該模塊按照式(5)、式(7)判斷對(duì)應(yīng)像素是否為邊緣,若是,則B(x,y)為1,否則為0。
本文選用ACTEL公司FUSION系列60萬(wàn)門的AFS600,該款FPGA基于FLASH架構(gòu),擁有上電即行、單芯片、非易失性、低功耗等優(yōu)點(diǎn),具有4 Mbit用戶可用的Flash Memory、1 kbit的FlashROM、108 kbit的RAM。
(1)控制FPGA按照320×240大小采集灰度圖像并存儲(chǔ)在片外SRAM中,通過(guò)串口將圖像數(shù)據(jù)發(fā)送到計(jì)算機(jī),用MATLAB還原圖像,得到原始圖像(圖3(a))。該圖像表明采集到的圖像無(wú)隨機(jī)噪聲,可以不用濾波處理。為了直觀地顯示算法的處理過(guò)程,本文利用MATLAB模擬算法的中間過(guò)程。在MATLAB上得到基于Prewitt算子的梯度幅度圖像(圖3(b)),為了方便顯示,將其最大值限制為255。在MATLAB上得到傳統(tǒng)Prewitt邊緣檢測(cè)結(jié)果,如圖3(c)所示,取閾值為130。該圖像邊緣較粗,定位精度不高。
(2)用MATLAB生成原始圖像的數(shù)據(jù)文件,利用Verilog的系統(tǒng)任務(wù)“$readmemh”將原始圖像數(shù)據(jù)寫入測(cè)試程序(testbench),用modelsim進(jìn)行布線后仿真,將結(jié)果B(x,y)導(dǎo)出,用MATLAB還原成圖像(圖3(d)),該圖像即為本算法邊緣檢測(cè)結(jié)果。
加入VGA驅(qū)動(dòng)模塊,將邊緣結(jié)果B(x,y)接入VGA實(shí)時(shí)顯示。VGA顯示大小與圖像大小一致,為320×240。處理和顯示的頻率為60場(chǎng)/s。
實(shí)驗(yàn)結(jié)果表明,本系統(tǒng)產(chǎn)生單像素邊緣,邊緣細(xì),定位精度高,較好地完成了邊緣檢測(cè)的任務(wù),為輪廓跟蹤、目標(biāo)識(shí)別打下良好的基礎(chǔ)。本系統(tǒng)用FPGA實(shí)現(xiàn),消耗邏輯資源1 473個(gè)Core Cells,占片上資源的11%;處理的圖像大小為320×240,處理速度達(dá)到60場(chǎng)/s,滿足了實(shí)時(shí)性要求。
本文利用FPGA實(shí)現(xiàn)了基于Prewitt算子的邊緣檢測(cè),并提出基于FPGA的自適應(yīng)閾值算法和非極大值抑制方法對(duì)邊緣檢測(cè)的結(jié)果進(jìn)行細(xì)化處理,克服了傳統(tǒng)方法產(chǎn)生的邊緣較粗的問(wèn)題,提高了邊緣檢測(cè)的精度。在設(shè)計(jì)中使用FIFO控制器、流水線結(jié)構(gòu)、分段函數(shù)逼近等方法提高了硬件處理速度,減少了資源占用,克服了軟件方法速度不足的問(wèn)題,滿足了系統(tǒng)實(shí)時(shí)性要求。
[1]GONZALEZ R C.Digital image processing[M].北京:電子工業(yè)出版社,2004.
[2]韋海萍,趙保軍,唐林波,等.Canny算法的改進(jìn)及其硬件的實(shí)現(xiàn)[J].光學(xué)技術(shù),2006,3(2):263-266.
[3]César Torres-Huitzil,Miguel Arias-Estrada.Real-time image processing with a compact FPGA-based systolic architecture[J].Real-Time Imaging,2004,10(3):177-187.
[4]胡亮,段發(fā)階,丁克勤,等.基于FPGA圖像處理技術(shù)在鋼板表面缺陷檢測(cè)系統(tǒng)中的應(yīng)用[J].傳感技術(shù)學(xué)報(bào),2006,19(3):694-696,701.
[5]朱耀東.一種卷積濾波器大容量延遲線實(shí)現(xiàn)新方法[J].計(jì)算機(jī)工程,2006,32(15):215-217.