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