Canny算法的改进及FPGA实现
梯度方向计算:根据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上实现,结果表明该算法可以得到预期的边缘。但仍存在一些问题,如阈值的选取虽然可以通过直方图统计自动获得,但该阈值仍缺乏自适应性;边缘连接未采用递归跟踪,因此连续性有待改进。
Canny边缘检测算法 卷积 FPGA 相关文章:
- 水声OFDM系统中卷积码译码设计及其DSP实现(04-11)
- 基于FPGA的固定倍率图像缩放的实现(06-05)
- 云中的机器学习:FPGA上的深度神经网络(06-04)
- 基于FPGA的卷积码的编/译码器设计(11-30)
- 在采用FPGA设计DSP系统中仿真的重要性 (06-21)
- 基于 DSP Builder的FIR滤波器的设计与实现(06-21)
