您的位置 首页 基础

Canny算法的改善及FPGA完成

通过对传统Canny边缘检测算法的分析提出了相应的改进方法。通过模板代替卷积、适当的近似变换、充分利用并行处理单元等使其能够用FPGA实现。

Canny边际检测算法具有杰出的信噪比和检测精度,因而在图画处理范畴被广泛选用。但因为其核算量巨大,实时性较差,而且软件处理的设备体积较大,所以不适合实时检测。本文对原始Canny算法进行了剖析、改善,并在FPGA中完结。试验证明新算法能满意实时性要求,而且检测精度和抗噪才能也较抱负。

1 Canny边际检测算法的基本原理

1.1 滑润图画

  Canny边际检测算法是高斯函数的一阶导数,是对信噪比与定位精度之乘积的最优化迫临算子。Canny算法首先用二维高斯函数的一阶导数对图画进行滑润[1]。设二维高斯函数为:

其梯度矢量为:

用分化的办法进步速度,把ΔG的2个滤波卷积模板分化为2个一维的队伍滤波器:

其间,k为常数,σ为高斯滤波器参数,它操控着滑润程度。关于σ小的滤波器,尽管定位精度高,但信噪比低;σ大的状况则相反。因而要依据需求恰当地选取高斯滤波器参数σ。

1.2 核算梯度的幅值和方向

  传统Canny算法选用2×2邻域一阶偏导的有限差分来核算滑润后的数据阵列I(x,y)的梯度幅值和梯度方向。其间,x和y方向偏导数的2个阵列Px[i,j]和Py[i,j]别离为:

像素的梯度幅值和梯度方向用直角坐标到极坐标的坐标转化公式核算,用二阶范数来核算梯度幅值为:

梯度方向为:

1.3 对梯度幅值进行非极大值按捺

  为了精确认位边际,有必要细化梯度幅值图画M[i,j]中的屋脊带,只保存幅值部分改变最大的点,这一进程就对错极大值按捺。在非极大值按捺进程中,Canny算法运用3×3巨细,包括8方向的邻域对梯度幅值阵列M[i,j]的一切像素沿梯度方向进行梯度幅值的插值。在每一个点上,邻域的中心像素m[i,j]与沿梯度方向的2个梯度幅值的插值成果进行比较。ζ[i,j]是像素邻域中心处沿着梯度方向的扇形区域,非极大值按捺在此区域进行。假如邻域中心点的幅值m[i,j]不比梯度方向上的2个插值成果大,则将m[i,j]对应的边际标志位赋值为0,这一进程把M[i,j]宽屋脊带细化为一个像素宽,而且保存了屋脊的梯度幅值。非极大值按捺NMS(non-maxima suppression)进程的数学表明为:

1.4 检测和衔接边际

  双阈值算法是对经过非极大值按捺图画N[i,j]别离运用高、低2个阈值th和tl切割,得到2个阈值边际图画Th[i,j]和Tl[i,j]。因为图画Th[i,j]是由高阈值得到,因而它应该不含有假边际,但Th[i,j]可能在概括上有连续。因而双阈值算法要在Th[i,j]中把边际衔接成概括,当到达概括端点时,该算法就在由低阈值得到的边际图画Tl[i,j]的8邻域方位寻觅能够衔接到概括上的边际。这样,使用递归盯梢的算法不断地在Tl[i,j]中收集边际,直到将Th[i,j]中一切的空隙都衔接起来停止。

2 算法的改善

  传统Canny算子在2×2的邻域内求有限差分均值来核算梯度幅值的算法[2],对边际的定位比较精确,但对噪声过于灵敏,简略检测出假边际和丢掉一些实在边际的细节部分。针对传统Canny算法在梯度幅值核算上的缺点,提出了一种在像素8邻域内经过核算x方向、y方向、135°方向、45°方向一阶偏导数有限差分来确认像素梯度幅值的办法。这种办法统筹了梯度幅值核算中,边际定位精确和按捺噪声的要求,在试验中取得了很好的作用。详细算法如下:

像素的梯度幅值和梯度方向用直角坐标到极坐标的坐标转化公式来核算,用二阶范数来核算梯度幅值为:

别的,传统算法中的边际衔接采纳的是递归办法,不适合硬件完结,因而本文只进行了一次衔接。其他改善详细体现在硬件完结的进程中,如用模板替代卷积, 加减法替代小数乘除等。

3 改善算法及FPGA完结

  依据以上的数学推导及剖析,得到Canny 边际检测用FPGA完结的流程图,如图1所示。

3.1 高斯滤波

  依据详细状况挑选恰当的σ,为了便于硬件完结能够选用模板来替代卷积运算。本文挑选图2所示的模板,其间的乘除法系数都是2n的方法,因而能够用移位的方法完结,这避免了乘除法运算带来的时刻与资源的耗费。核算中屡次用到中心点的8邻域的值,因而规划了窗口构成模块,以便一起得到某个像素点的8邻域的值。原理图如图3所示。

行推迟和列推迟别离由FIFO和寄存器完结,其间FIFO的深度等于图画的列数。

3.2 梯度核算

  经过高斯滤波模块的数据再经过窗口构成模块,得到3×3邻域,然后依照式15,核算梯度的幅值。

  梯度方向核算:依据8连通区域,量化边际方向。首先将梯度视点的改变规模减小到圆周的1/8扇区。如图4所示,以0°、45°、90°、135°等为中心视点:每个方向包括±22.5°,依据Px Py的比值及正负确认其地点方向的区域规模,其方向界说为中心视点的方向。关于整个坐标系而言,梯度向量共分为8类,可是关于非部分最大值按捺的完结,使用中心对称原理,只需求4个方向,如图5所示。

当|Py/Px|>tg22.5°,即梯度方向在0和180两个扇区内,则将其方向用0表明;

  当tg22.5°|Py/Px|>tg67.5°且Px/Py>0,即梯度方向在45°和225°两个扇区内,则将其方向用1表明;

  当|Py/Px|>tg67.5°即梯度方向在90°和270°两个扇区内,则将其方向用2表明;

  当tg22.5°|Py/Px|>tg67.5°且Px/Py>0,即梯度135°和315°两个扇区内,则将其方向用3表明。

0,即梯度135°和315°两个扇区内,则将其方向用3表明。 P>  进行方向核算时,需求核算tg22.5°和tg67.5°。在硬件规划中选用简化和近似的办法来完结。

  tg22.5°≈0.4375=1/2-1/16

tg67.5°≈2.5=2+1/2

这样就能够用简略的移位和加减运算替代杂乱的小数乘法运算,而在实践的数字图画处理中,近似引进的差错是答应的[3]。再使用比较器和编码器就能够完结方向判别。

3.3 阈值核算

  阈值选取根据梯度直方图,所以先核算梯度直方图[4]。以256×256×8bit的图为例,根据双端口RAM(hist_buffer)及其操控器完结。经核算存储器宽度为16bit,深度为1 024。当有梯度值输入时,RAM中相应地址的内容被读出来,加1后再存入该地址。如此进行下去,直到整幅图画扫描结束,得到梯度的直方图。依照地址从小到大的次序顺次累加RAM中的值,当累加和不小于图画总像素的80%时,输出对应的地址,即为Th, 而Tl则由Th右移一位得到,如图6所示。

3.4 非最大值按捺值按捺及边际检测

  本文采纳将强弱边际检测一起进行,而且在边际检测之前构成窗口,这样就避免了后续考虑同步的问题,节省了存储单元。图7为原理图,其间粗线表明一起输出9个值。

4 试验成果

  图8顺次是原图、软件处理成果图和硬件处理成果图。试验成果表明本算法能够得到较精确的边际。

本文经过对传统Canny算子的剖析,结合硬件完结的特色对算法进行了改善,并在FPGA上完结,成果表明该算法能够得到预期的边际。但仍存在一些问题,如阈值的选取尽管能够经过直方图核算主动取得,但该阈值仍缺少自适应性;边际衔接未选用递归盯梢,因而连续性有待改善。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/196124.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部