黃河 魏幼平 謝洋 張 衎
中國礦業(yè)大學(xué)(北京)機(jī)電與信息工程學(xué)院,北京 100083
邊緣檢測是圖像處理的重要算法之一,常用于輪廓檢測、模式識別、區(qū)域分割等領(lǐng)域。但是圖像處理對于嵌入式領(lǐng)域的研發(fā),考慮的是算法的實(shí)時(shí)性和圖像算法仿真設(shè)計(jì)的直觀高效性??梢酝ㄟ^本文的設(shè)計(jì)理念方法結(jié)合Modelsim與Matlab[1]仿真平臺應(yīng)用與其他的圖像算法設(shè)計(jì)開發(fā),使其高效移植于嵌入式FPGA平臺,然而采用FPGA進(jìn)行圖像處理的原因是因?yàn)樗袕?qiáng)大的并行操作能力和流水線功能架構(gòu),能很好的進(jìn)行數(shù)據(jù)的實(shí)時(shí)處理。
基于FPGA實(shí)時(shí)圖像邊緣檢測系統(tǒng)處理框圖如圖1。先通過CMOS攝像頭進(jìn)行RGB格式圖像采集,接著將圖像進(jìn)行灰度處理,再通過基于Sobel算子[1]的并行結(jié)構(gòu)進(jìn)行實(shí)時(shí)邊緣區(qū)域粗預(yù)測,接著在邊緣區(qū)域的基礎(chǔ)上進(jìn)行Roberts算子的邊緣精確定位,最后通過判定橫向、縱向的算子卷積和閥值,確定邊緣坐標(biāo),將邊緣檢測效果實(shí)時(shí)的顯示到VGA顯示器上。
圖1 FPGA實(shí)時(shí)邊緣檢測系統(tǒng)
Sobel算子用作邊緣檢測,該算子包含兩組3*3的矩陣,分別為x方向即橫向及y方向即縱向,通過相關(guān)公式運(yùn)算即基于Sobel卷積因子的運(yùn)算,便可得出橫向及縱向的亮度差分近似值,從而用來判斷圖像邊緣的依據(jù)。
圖2 Sobel橫向、縱向卷積因子
Gx及Gy分別代表(x,y)處的像素橫向及縱向邊緣檢測的圖像灰度值變化量,其中f(x,y), 表示圖像(x,y)點(diǎn)的灰度值,具體計(jì)算如下:
為了提高效率,圖像的每一個(gè)像素的橫向及縱向灰度值變化量通過式結(jié)3-3方式加權(quán)[2]。
如果梯度G大于某一閥值 則認(rèn)為該點(diǎn)(x,y)為邊緣點(diǎn)。
Sobel算子根據(jù)像素點(diǎn)上下、左右鄰點(diǎn)灰度加權(quán)差,在邊緣處達(dá)到極值這一現(xiàn)象檢測邊緣。對噪聲具有平滑作用,提供較為精確的邊緣方向信息,邊緣定位精度不夠高。當(dāng)對精度要求不是很高時(shí),是一種較為常用的邊緣檢測方法。
Roberts算子采用對角線方向相鄰兩像素之差近似梯度幅值檢測邊緣。檢測水平和垂直邊緣的效果好于斜向邊緣,定位精度高,對噪聲敏感。
同上Roberts算子邊緣檢測公式如下:
除sobel邊緣檢測外還有Prewitt算子、Canny算子、Laplacian算子 Log算子等,每種邊緣檢測方法都有其優(yōu)缺點(diǎn),但是只要結(jié)合FPGA的可用邏輯資源及SDRAM數(shù)據(jù)緩存空間,最終規(guī)劃好算法流水線結(jié)構(gòu)就可以將各種邊緣檢測算法互補(bǔ)綜合使用發(fā)揮其各算法的優(yōu)勢達(dá)到最優(yōu)邊緣檢測效果且更重要的是具有算法的高效實(shí)時(shí)性。
因?yàn)镾obel算子邊緣檢測對噪聲具有平滑作用,提供較為精確的邊緣方向信息,邊緣定位精度不夠高,而Roberts算子檢測定位精度高,所以先通過Sobel算子邊緣檢測粗定位邊緣區(qū)域,再通過Roberts算子檢測區(qū)域搜索精確定位邊緣位置。
通過Sobel算子邊緣檢測公式可知要檢測一個(gè)像素是否為圖像邊緣時(shí)需要結(jié)合周邊8個(gè)像素即總共9個(gè)像素點(diǎn)進(jìn)行邊緣檢測算法運(yùn)算,才能得到邊緣區(qū)域,對于FPGA的實(shí)時(shí)性算法設(shè)計(jì)就需要消耗9個(gè)時(shí)鐘。再接著通過Roberts算子進(jìn)一步的區(qū)域搜索精確定位,還需要消耗一個(gè)時(shí)鐘。所以為了實(shí)現(xiàn)基于FPGA實(shí)時(shí)邊緣檢測系統(tǒng),檢測模塊就需要采用流水線10并行模塊結(jié)構(gòu)如圖。另外注意當(dāng)開始一幀圖像的第一個(gè)邊緣檢測運(yùn)算時(shí)是從CMOS攝像頭采集灰度處理后的第三行的第三列開始,所以需要進(jìn)行至少三行的灰度像素?cái)?shù)據(jù)緩存,且需要相應(yīng)的圖像顯示延時(shí)。但是基于此設(shè)計(jì)的FPGA還是做到了最好的實(shí)時(shí)效果顯示。(見圖3)
圖3 Sobel與Roberts算子聯(lián)合流水線結(jié)構(gòu)
以下是邊緣檢測的HDL核心算法設(shè)計(jì),先基于Sobel算子的并行結(jié)構(gòu)進(jìn)行實(shí)時(shí)邊緣區(qū)域粗預(yù)測,接著在邊緣區(qū)域的基礎(chǔ)上進(jìn)行Roberts算子的邊緣精確定位。
Sobel 算子單個(gè)模塊HDL代碼:
If((a3+2*a6+a9)-(a1+2*a4+a7)<0)//Sobel橫向灰度變量絕對值
Sobel_xout<=-((a3+2*a6+a9)-(a1+2*a4+a7));
If((a1+2*a2+a3)-(a7+2*a8+a9)<0)//Sobel縱向灰度變量絕對值
Sobel_yout<=-((a1+2*a2+a3)-(a7+2*a8+a9));end
end
assign sobel_out=((Sobel_xout+Sobel_yout)>G) ? 1:0;//判斷是否為邊緣區(qū)域
assign x=((Sobel_xout+Sobel_yout)>G) ? x0 :0;//邊緣區(qū)域中心點(diǎn)x坐標(biāo)
assign y=((Sobel_xout+Sobel_yout)>G) ? y0 :0;//邊緣區(qū)域中心點(diǎn)y坐標(biāo)
Roberts算子單個(gè)模塊HDL代碼:
always@(posedge clk)
begin if(rst==0) begin robert_xout<=0; robert_yout<=0; end else if(rst!=0) begin
If(a1-a4<0)//Roberts橫向灰度變量絕對值
robert_xout<=-(a1-a4);
If(a2-a3<0)//Roberts縱向灰度變量絕對值
robert_yout<=-(a2-a3);end
end
assign robert_out=((robert_xout+Sobel_yout)>G) ? 255:0;//精確定位邊緣
assign x=((robert_xout+robert_yout)>G) ? x0 :0;//邊緣點(diǎn)x坐標(biāo)
assign y=((robert_xout+robert_yout)>G) ? y0:0; //邊緣點(diǎn)x坐標(biāo)
本文來源于大學(xué)生創(chuàng)新項(xiàng)目,設(shè)計(jì)了基于FPGA實(shí)時(shí)邊緣檢測系統(tǒng)設(shè)計(jì),通過QuartusII、Matlab、Modelsim聯(lián)合開發(fā)[3],將圖像數(shù)據(jù)流通過Matlab轉(zhuǎn)換為十六進(jìn)制文本文件,再通過Modelsim讀取十六進(jìn)制圖像RGB文本文件進(jìn)行算法HDL硬件描述語言仿真最后輸出邊緣檢測后文本文件,最后通過Matlab將邊緣檢測圖像文本文件進(jìn)行圖像還原。三平臺的聯(lián)合開發(fā)高效,能充分利用仿真平臺查看算法顯示效果從而最大程度加快基于FPGA的圖像處理項(xiàng)目進(jìn)度。通過實(shí)際的硬件調(diào)試,成功實(shí)現(xiàn)了系統(tǒng)實(shí)時(shí)邊緣檢測功能。而且FPGA嵌入式結(jié)構(gòu)平臺便于系統(tǒng)升級。
[1]陳懷琛,吳大正. 高西全.MATLAB及在電子信息課程中的應(yīng)用(第3版)[M].北京:電子工業(yè)出版社,2006.3.
[2]張強(qiáng),王正林. 精通.MATLAB圖像處理[M]. 北京:電子工業(yè)出版社, 2012.4.
[3]王誠,蔡海寧,吳繼華. Altera FPGA/CPLD 設(shè)計(jì)(高級篇)[M].北京:人民郵電出版社,2012.5.