胡雪梅,吳占敏
(瑞芯微電子股份有限公司,福建福州,350003)
圖像邊緣檢測(cè)是數(shù)字圖像處理中的一項(xiàng)關(guān)鍵技術(shù),是模式識(shí)別、目標(biāo)跟蹤、運(yùn)動(dòng)檢測(cè)及圖像分割等技術(shù)的基礎(chǔ),其識(shí)別的準(zhǔn)確性及速度將直接影響后續(xù)圖像分析的效果。傳統(tǒng)的邊緣檢測(cè)算法大多依靠軟件程序,一些普通的圖像處理軟件在提取圖像邊緣時(shí)無法滿足實(shí)時(shí)性[1],因此實(shí)用性不高?;诂F(xiàn)場(chǎng)可編程門陣列(Field Programmable Gate Array,FPGA)芯片以其獨(dú)特的并行可編程處理信號(hào)的方式,成為圖像處理的重要器件[2]。
為了提高檢測(cè)精度和解決實(shí)時(shí)性問題,在文獻(xiàn)[3]中,作者通過增加Sobel 算子的檢測(cè)方向獲得了更清晰的邊緣,且展示了FPGA 優(yōu)秀的并行處理能力,在文獻(xiàn)[4]中,作者使用改進(jìn)的DoG 算子提高了檢測(cè)精度,但是這些算法都沒有考慮到sensor 噪聲和鏡頭暗影(Lens Shading)對(duì)邊緣檢測(cè)的影響,導(dǎo)致離圖像中心越遠(yuǎn)邊緣檢測(cè)越容易丟失關(guān)鍵細(xì)節(jié)信息的問題。為了解決這些問題,本文使用改進(jìn)的中值濾波對(duì)輸入圖像進(jìn)行第一級(jí)濾波計(jì)算,在去除顆粒噪聲的同時(shí)兼顧邊界的連續(xù)性,然后采用高斯差分(DoG,Difference of Gaussian)算子對(duì)中值濾波后的圖像進(jìn)行第二級(jí)邊緣檢測(cè)計(jì)算,為了進(jìn)一步解決鏡頭暗影帶來的圖像降質(zhì)影響,設(shè)置徑向力度對(duì)閾值進(jìn)行調(diào)整后再輸出最終的邊緣檢測(cè)結(jié)果。此外,為了滿足現(xiàn)代數(shù)字圖像處理中對(duì)實(shí)時(shí)性的需求,本文基于FPGA 硬件平臺(tái),利用其高速并行處理、高性能運(yùn)算能力及高靈活性等特點(diǎn),通過兩級(jí)RAM 存儲(chǔ)控制及簡(jiǎn)化計(jì)算大幅提升圖像數(shù)據(jù)實(shí)時(shí)處理速度。實(shí)驗(yàn)結(jié)果表明,本算法可用于含噪圖像的邊緣檢測(cè)且具有實(shí)用性的優(yōu)點(diǎn)。
邊緣通常指圖像灰度值變化劇烈的像素點(diǎn)集合,其理論上是由灰度值的瞬間跳變產(chǎn)生,但在實(shí)際圖像區(qū)域中,由明變暗或由暗變明是一個(gè)漸變過程,灰度曲線存在一定的斜率[5]。由于其突變的時(shí)間非???,因此一階微分和二階微分對(duì)這種突變的檢測(cè)有很好的效果。一階邊緣檢測(cè)算子有Prewitt 算子、Sobel 算子、羅盤算子等,二階邊緣檢測(cè)算子有Canny 算子、Laplacian 算子等,但是二階微分算子對(duì)噪聲太敏感,會(huì)產(chǎn)生大量偽邊緣。此外,在實(shí)際應(yīng)用中,Sensor 的鏡頭暗影和數(shù)據(jù)傳輸中電子元器件產(chǎn)生的白噪聲都一定程度上造成了圖像降質(zhì)[6],這些都會(huì)影響圖像邊緣的提取。
為了解決上述問題,本文提出了一種可抗噪的邊緣檢測(cè)算法,先對(duì)輸入的圖像做一個(gè)3×3 的改進(jìn)版的梯度權(quán)重中值濾波,然后再用高斯差分[7]算子提取圖像邊緣信息,最后為了緩解Sensor 鏡頭暗影的影響,針對(duì)鏡頭暗影產(chǎn)生的規(guī)律計(jì)算出一個(gè)徑向系數(shù),對(duì)輸入的閾值做一個(gè)調(diào)整,以達(dá)到抑制噪聲且提取連續(xù)清晰的圖像邊緣的目的。
中值濾波對(duì)一些孤立的椒鹽噪聲有很好的去噪效果,但是也會(huì)模糊圖像邊緣,對(duì)后續(xù)的邊緣提取非常不利[8],為了緩解這個(gè)問題,本文提出一種方向權(quán)重混合的中值濾波改進(jìn)算法,這種算法充分考慮到了邊緣降噪需保邊的需求,在去除顆粒噪聲的同時(shí)保護(hù)了邊緣的連續(xù)性,且本算法利用了FPGA 并行計(jì)算的優(yōu)勢(shì),可以快速得出結(jié)果。具體算法步驟如下:
(1)對(duì)一個(gè)如式(1)所示的3×3 的矩陣,對(duì)垂直、水平、45 度和135 度四個(gè)方向分別計(jì)算其梯度的絕對(duì)值和中值,以垂直方向?yàn)槔?,其梯度為diff0=abs(data0_1-data2_1),中值med0 為data0_1、data1_1 和data2_1 的中間值,其他三個(gè)方向計(jì)算相同。
(2)對(duì)垂直、水平、45 度和135 度四個(gè)方向的梯度diff0、diff1、diff2 和diff3 做exp 曲線映射,梯度的值越小的地方其權(quán)重分配越大,梯度的值越大的地方其權(quán)重分配越小,exp 曲線映射如公式(2)所示,映射后的權(quán)重分別記為weight0、weight1、weight2 和weight3。
(3)用第二步計(jì)算出的權(quán)重分別乘以各個(gè)方向的中值,再除以權(quán)重的和得到歸一化輸出,權(quán)重歸一化如公式(3)所示:
一階微分算子如Sobel 需要計(jì)算多個(gè)方向的一階導(dǎo)并做混合才能提取出足夠的圖像邊緣,二階微分算子如Laplacian 算子雖然擁有各向同性的優(yōu)勢(shì),可以直接計(jì)算出各個(gè)方向的邊緣,無需像Sobel 算子那樣,需要計(jì)算各個(gè)方向的邊緣然后做混合,但是二階微分算子普遍對(duì)噪聲又過于敏感,尤其是如果噪點(diǎn)在圖像邊緣上,會(huì)造成圖像邊緣不夠連續(xù)[9]。
為了解決這個(gè)問題,選擇使用高斯差分(DoG,Difference of Gaussian)算子來代替Laplacian 算子,DoG 算子是兩個(gè)Gauss 算子相減獲得的,Gauss 算子配置不同的均值和方差,可以獲得不同頻段的圖像邊緣信息,本文需要檢測(cè)出所有頻段的邊緣信息且抗噪,因此第一個(gè)Gauss 算子就用3×3 來代替,考慮到3×3 的窗口太小,一些弱邊緣可能會(huì)不容易檢測(cè)到,因此第二個(gè)Gauss 算子加大窗口,選擇5×5 的窗口來進(jìn)行計(jì)算,5×5 的DoG 算子如公式如(4)所示:
鏡頭類似一個(gè)凸透鏡,由于凸透鏡中心的聚光能力遠(yuǎn)大于其邊緣,從而導(dǎo)致Sensor 中心的光線強(qiáng)度大于四周,此種現(xiàn)象也稱之為鏡頭暗影[10]。對(duì)于一個(gè)沒有畸變的Sensor來說,物體到鏡頭中心的距離越亮,圖像越亮,離中心距離越遠(yuǎn),圖像越暗,其規(guī)律整體呈從圓心位置沿半徑方向逐步遞減。由于亮度遞變的影響,使得邊緣檢測(cè)中越靠近中心區(qū)域噪聲越小,越靠近圖像四周邊緣噪聲越大,為了緩解這個(gè)問題,對(duì)輸入的閾值乘以徑向力度系數(shù),達(dá)到抑制圖像周圍噪聲的作用。
設(shè)圖像中心點(diǎn)坐標(biāo)為(row,col),當(dāng)前pixel 的像素坐標(biāo)為(x,y),則距離如公式(5)所示,用外部配置的閾值除以distance 就得到徑向閾值,根據(jù)這個(gè)閾值對(duì)邊緣檢測(cè)的圖像進(jìn)行二值化,可以抑制圖像周圍的噪聲。
在圖像邊緣檢測(cè)中,所需要處理的數(shù)據(jù)量較大,為了提升數(shù)據(jù)處理速度,通常都會(huì)利用DDR3 DRAM 的高速運(yùn)行速度(運(yùn)行速度可達(dá)800 MHz,數(shù)據(jù)速率達(dá)1 600 Mb/s)來完成讀寫數(shù)據(jù)的操作,這樣就占用了一定的DDR 帶寬,一定程度上限制了處理速度。為了提升數(shù)據(jù)處理速度,本論文用sensor 直接接入FPGA 中的Video Capture 模塊,Video Capture 的按照光柵輸入模式將數(shù)據(jù)直接輸入到邊緣檢測(cè)模塊中的Med RAM 讀寫控制模塊,不寫入DDR3 可以節(jié)省帶寬并提高邊緣檢測(cè)處理速度。Med RAM 模塊湊夠3×3 窗口數(shù)據(jù)即輸出至4 方向權(quán)重和4 方向均值模塊,這兩個(gè)模塊并行計(jì)算出結(jié)果,然后按照權(quán)重計(jì)算歸一化輸出中值濾波結(jié)果至Med RAM 讀寫控制,該模塊湊夠5×5 窗口數(shù)據(jù)即輸出至5×5 DoG 計(jì)算模塊,此時(shí)按照窗口數(shù)據(jù)輸出的數(shù)據(jù)個(gè)數(shù)Col_cnt 和Row_cnt 分別計(jì)數(shù),按照公式(5)計(jì)算出徑向閾值,對(duì)DoG 的輸出結(jié)果做二值化操作,得到的邊緣檢測(cè)結(jié)果存入DDR3 中,最后通過VGA 輸出至顯示器上,整體設(shè)計(jì)如圖1 所示。
圖1 系統(tǒng)框圖
以5×5 窗口大小的DoG RAM 為例(3×3 窗口類似),對(duì)于5×5 的窗口大小來說,能進(jìn)行5×5 窗口濾波的條件是必須湊夠5 行數(shù)據(jù)。假設(shè)第4 行為正在實(shí)時(shí)輸入的數(shù)據(jù),前4 行數(shù)據(jù)為歷史數(shù)據(jù),為了同時(shí)滿足讀歷史數(shù)據(jù)和寫新數(shù)據(jù)的需求,需要一個(gè)能容納4 行數(shù)據(jù)的雙口RAM。開一個(gè)能容納4 行數(shù)據(jù)的雙口RAM,前4 行數(shù)據(jù)在RAM 中的存儲(chǔ)方式如圖2 所示(為了便于說明,data 的后綴分別代表圖像的行數(shù)和列數(shù))。
圖2 RAM 數(shù)據(jù)存儲(chǔ)方式示意圖
RAM 中的每一個(gè)地址的數(shù)據(jù)位寬都是40 bit,這40 bit包含了4行數(shù)據(jù),以Addr0為例,其中存儲(chǔ)了圖像第0行~第3 行的第0 列數(shù)據(jù),data0_0 占據(jù)位寬[9:0],data1_0 占據(jù)位寬[19:10],data2_0 占據(jù)位寬[29:20],data3_0 占據(jù)位寬[39:0]。這種存儲(chǔ)方式讀Addr0 可以獲得一列共4個(gè)數(shù)據(jù),加上正在輸入的data4_0 就會(huì)構(gòu)成完整的一列數(shù)據(jù),把這列數(shù)據(jù)存進(jìn)二維寄存器中,然后把RAM 讀出數(shù)據(jù)的[39:10]和data4_0 拼起來組成一個(gè)新的40 bit 數(shù)據(jù)再寫回Addr0 中,就完成了一次數(shù)據(jù)讀和寫更新,一行做完后RAM 中每個(gè)地址的[9:0]是新寫入的第4 行數(shù)據(jù),下一行更新的位置是[19:10],如此循環(huán)往復(fù),可存完一整幅圖像。
對(duì)于5×5 的窗口,需要一個(gè)5×5 的二維寄存器緩存讀出來列數(shù)據(jù)和輸入的當(dāng)前數(shù)據(jù),每產(chǎn)生一列新數(shù)據(jù)就寫入二維寄存器中最左邊的一列寄存器中,同時(shí)每列寄存器中的數(shù)據(jù)向右一列寄存器中移位一次,最右邊的一列寄存器數(shù)據(jù)被覆蓋。用這種方法讀3次RAM 即可湊夠一個(gè)完整的窗口計(jì)算一次,后續(xù)每讀出一列新數(shù)據(jù),舊數(shù)據(jù)依次覆蓋右列數(shù)據(jù)即可獲得一個(gè)新的5×5 數(shù)據(jù)。
此外窗口數(shù)據(jù)還存在擴(kuò)邊需求,當(dāng)中心點(diǎn)在圖像邊界的時(shí)候,上下左右各需要2 行2 列的擴(kuò)邊,分以下4 種情況進(jìn)行擴(kuò)邊:
(1)上擴(kuò)邊,在第0 行寫RAM 的時(shí)候就把data0_x的數(shù)據(jù)復(fù)制3 次,即[9:0]、[19:10]和[29:20]中的數(shù)據(jù)都是data0_x。
(2)下擴(kuò)邊,在RAM 讀數(shù)據(jù)的時(shí)候,把最后一行數(shù)據(jù)復(fù)制到第一列二維寄存器中。
(3)左擴(kuò)邊,在每行第0 列數(shù)據(jù)讀出寫5×5 二維矩陣的時(shí)候,就同時(shí)寫最左邊的3 列數(shù)據(jù),即二維寄存器的前3 列中的數(shù)據(jù)都是第0 列的數(shù)據(jù),更新兩次數(shù)據(jù)之后即可獲得一個(gè)完整的5×5 數(shù)據(jù)。
(4)右擴(kuò)邊,在每行的最后兩列的時(shí)候,不讀RAM,只做寄存器的移位,即可獲得右擴(kuò)邊。
用上述方法做圖像擴(kuò)邊可大大節(jié)省硬件面積,且邏輯控制非常簡(jiǎn)單。
為驗(yàn)證各個(gè)模塊算法的正確性,在型號(hào)為Xilinx Virtex UltraScale XCVU440FLGA2892 的FPGA 上進(jìn)行測(cè)試,得到的實(shí)驗(yàn)結(jié)果如圖3 和4 所示。
圖3 圖標(biāo)邊緣檢測(cè)結(jié)果
圖4 分辨率卡邊緣檢測(cè)結(jié)果
由實(shí)驗(yàn)結(jié)果分析可知,Sobel 算子的邊緣連續(xù)性差,檢測(cè)不到弱邊緣。Canny 算子在邊緣連續(xù)性上表現(xiàn)較好,但是無法對(duì)抗噪聲的干擾,在圖像周圍噪聲比較大的區(qū)域,其檢測(cè)出的邊緣淹沒于噪聲中。而本論文的邊緣檢測(cè)結(jié)果在連續(xù)性和抗噪方面均優(yōu)于前兩個(gè)算法,且在圖像四周區(qū)域?qū)D像噪聲的抑制性較好。結(jié)合FPGA 可以達(dá)到實(shí)時(shí)性的需求,從圖像采集到最終顯示的時(shí)間小于25 ms。
本文通過兩級(jí)窗口串聯(lián)的方式設(shè)計(jì)了一種可抗噪的邊緣濾波算法,通過改進(jìn)的中值濾波和高斯差分濾波的級(jí)聯(lián)抑制噪聲提取連貫的邊緣,結(jié)合徑向閾值,進(jìn)一步解決了Sensor 鏡頭暗影帶來的圖像四周噪聲過大的問題。通過RAM 對(duì)窗口數(shù)據(jù)的緩存,解決了硬件實(shí)時(shí)處理中開銷大的問題,利用FPGA 的流水線和并行處理的特點(diǎn),使得圖像數(shù)據(jù)的處理速度遠(yuǎn)遠(yuǎn)高于使用傳統(tǒng)軟件程序處理圖像的速度,滿足了實(shí)際應(yīng)用中實(shí)時(shí)獲得圖像邊緣的需求。并通過對(duì)比不同算法的圖片檢測(cè)效果,本文算法邊緣清晰且抗噪能力較好,在高速圖像處理領(lǐng)域具有較高的實(shí)用價(jià)值。