黄河 魏幼平 谢洋 张 衎
中国矿业大学(北京)机电与信息工程学院,北京 100083
边缘检测是图像处理的重要算法之一,常用于轮廓检测、模式识别、区域分割等领域。但是图像处理对于嵌入式领域的研发,考虑的是算法的实时性和图像算法仿真设计的直观高效性。可以通过本文的设计理念方法结合Modelsim与Matlab[1]仿真平台应用与其他的图像算法设计开发,使其高效移植于嵌入式FPGA平台,然而采用FPGA进行图像处理的原因是因为它有强大的并行操作能力和流水线功能架构,能很好的进行数据的实时处理。
基于FPGA实时图像边缘检测系统处理框图如图1。先通过CMOS摄像头进行RGB格式图像采集,接着将图像进行灰度处理,再通过基于Sobel算子[1]的并行结构进行实时边缘区域粗预测,接着在边缘区域的基础上进行Roberts算子的边缘精确定位,最后通过判定横向、纵向的算子卷积和阀值,确定边缘坐标,将边缘检测效果实时的显示到VGA显示器上。
图1 FPGA实时边缘检测系统
Sobel算子用作边缘检测,该算子包含两组3*3的矩阵,分别为x方向即横向及y方向即纵向,通过相关公式运算即基于Sobel卷积因子的运算,便可得出横向及纵向的亮度差分近似值,从而用来判断图像边缘的依据。
图2 Sobel横向、纵向卷积因子
Gx及Gy分别代表(x,y)处的像素横向及纵向边缘检测的图像灰度值变化量,其中f(x,y), 表示图像(x,y)点的灰度值,具体计算如下:
为了提高效率,图像的每一个像素的横向及纵向灰度值变化量通过式结3-3方式加权[2]。
如果梯度G大于某一阀值 则认为该点(x,y)为边缘点。
Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。
Roberts算子采用对角线方向相邻两像素之差近似梯度幅值检测边缘。检测水平和垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感。
同上Roberts算子边缘检测公式如下:
除sobel边缘检测外还有Prewitt算子、Canny算子、Laplacian算子 Log算子等,每种边缘检测方法都有其优缺点,但是只要结合FPGA的可用逻辑资源及SDRAM数据缓存空间,最终规划好算法流水线结构就可以将各种边缘检测算法互补综合使用发挥其各算法的优势达到最优边缘检测效果且更重要的是具有算法的高效实时性。
因为Sobel算子边缘检测对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高,而Roberts算子检测定位精度高,所以先通过Sobel算子边缘检测粗定位边缘区域,再通过Roberts算子检测区域搜索精确定位边缘位置。
通过Sobel算子边缘检测公式可知要检测一个像素是否为图像边缘时需要结合周边8个像素即总共9个像素点进行边缘检测算法运算,才能得到边缘区域,对于FPGA的实时性算法设计就需要消耗9个时钟。再接着通过Roberts算子进一步的区域搜索精确定位,还需要消耗一个时钟。所以为了实现基于FPGA实时边缘检测系统,检测模块就需要采用流水线10并行模块结构如图。另外注意当开始一帧图像的第一个边缘检测运算时是从CMOS摄像头采集灰度处理后的第三行的第三列开始,所以需要进行至少三行的灰度像素数据缓存,且需要相应的图像显示延时。但是基于此设计的FPGA还是做到了最好的实时效果显示。(见图3)
图3 Sobel与Roberts算子联合流水线结构
以下是边缘检测的HDL核心算法设计,先基于Sobel算子的并行结构进行实时边缘区域粗预测,接着在边缘区域的基础上进行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;//判断是否为边缘区域
assign x=((Sobel_xout+Sobel_yout)>G) ? x0 :0;//边缘区域中心点x坐标
assign y=((Sobel_xout+Sobel_yout)>G) ? y0 :0;//边缘区域中心点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坐标
本文来源于大学生创新项目,设计了基于FPGA实时边缘检测系统设计,通过QuartusII、Matlab、Modelsim联合开发[3],将图像数据流通过Matlab转换为十六进制文本文件,再通过Modelsim读取十六进制图像RGB文本文件进行算法HDL硬件描述语言仿真最后输出边缘检测后文本文件,最后通过Matlab将边缘检测图像文本文件进行图像还原。三平台的联合开发高效,能充分利用仿真平台查看算法显示效果从而最大程度加快基于FPGA的图像处理项目进度。通过实际的硬件调试,成功实现了系统实时边缘检测功能。而且FPGA嵌入式结构平台便于系统升级。
[1]陈怀琛,吴大正. 高西全.MATLAB及在电子信息课程中的应用(第3版)[M].北京:电子工业出版社,2006.3.
[2]张强,王正林. 精通.MATLAB图像处理[M]. 北京:电子工业出版社, 2012.4.
[3]王诚,蔡海宁,吴继华. Altera FPGA/CPLD 设计(高级篇)[M].北京:人民邮电出版社,2012.5.