一种改进的Canny算法及其仿真验证
   来源:现代电子技术     2021年01月22日 20:30

付博研+卢振洋+白立来+陈雨+刘嘉

摘 要: 为了提升Canny边缘检测的效果,并使之适用于FPGA平台,提出一种改进的Canny算法,并用C语言实现了该算法;将改进的Canny算法定点化处理并使用Verilog HDL语言进行描述,采用一种Matlab与Modelsim联合的仿真方法,进行了FPGA仿真实验,以对改进算法在FPGA上的性能进行评估。实验结果表明改进的算法检得边缘清晰且更细,所采用仿真方法是基于Modelsim平台使用Verilog HDL语言进行的,是一种验证FPGA上图像算法性能的新方法。

关键词: Canny算法; FPGA仿真; Modelsim; 边界细化

中图分类号: TN919?34; TP391 文献标识码: A 文章编号: 1004?373X(2014)18?0011?04

An improved Canny algorithm and its simulation verification

FU Bo?yan, LU Zhen?yang, BAI Li?lai, CHEN Yu, LIU Jia

(College of Mechanical Engineering and Applied Electronics Technology, Beijing University of Technology, Beijing 100124, China)

Abstract: In order to improve an image edge detection effect of Canny algorithm and be applied to FPGA platform, a improved Canny algorithm is proposed in this paper. The algorithm was realized with C language on computer. The fixed?point processing for the improved Canny algorithm was performed. It is described with Verilog HDL. The simulation experiment was conducted by a co?simulating method which associates Matlab with Modelsim to assess the performance of the algorithm on FPGA. The result shows that the edges detected by the improved algorithm are more clear and thin. The co?simulating method is based on Modelsim, and Verilog HDL. Its a new method for verifying image processing algorithm on FPGA.

Keywords: Canny algorithm; FPGA simulation; Modelsim; edge thinning

边缘检测技术在特征提取、目标识别等领域有广泛的应用。常用的边缘检测算法有Sobel算法、Robert算法、Prewitt算法、Canny算法等。其中Canny算法是由John F. Canny于1986年提出,是一种经典的边缘检测算法[1],具有信噪比大,检测精度高等优点,应用非常广泛。Canny算法也存在一些缺点,研究人员提出多种改进方法[2?5],包括修改平滑方法,优化阈值选取等。本文提出一种改进的Canny算法并编程实现;提出一种方法用于对FPGA平台下的图像算法进行仿真验证,通过对改进的Canny算法进行仿真,结果证明了改进Canny算法的有效性。

1 算法设计

1.1 经典Canny算法

经典Canny算法可以分为4步:

(1) 平滑图像。利用二维高斯函数的对称性和可分解性,很容易求出高斯函数在任意方向的方向倒数与图像的卷积。因此对于二维情况,容易求出适用于各类型边界的边界检测算子,Canny算法实际上是用高斯函数与图像卷积,然后求梯度[6],根据梯度的幅值和相位进一步判断边缘。所选二维高斯函数为:

[G(x,y)=e(-x2+y22σ2)2πσ2] (1)

式中:σ为高斯函数的标准差,决定高斯函数的平滑程度,高斯函数的平滑程度与其成正比。

(2) 计算梯度的幅值和方向。设原图像为f(x,y),采用2×2领域内一阶偏导数的有限差分计算经平滑后图像P(x,y)的幅值D(x,y):

[D(x,y)=?[G(x,y)*f(x,y)]=[(?G?x*f)2+(?G?y*f)2]12] (2)

方向V(x,y)为:

[V(x,y)=arctan(Py(x,y)Px(x,y))=?G?y*f?G?x*f] (3)

(3) 对梯度幅值进行非极大值抑制。当某点的幅值大于该点梯度方向上的两个相邻像素的幅值,则认定该点为边界点[6]。

(4) 双阈值方法检测并连接边缘。根据高低阈值,认定所有灰度大于高阈值的点为边缘点;灰度在高低阈值之间的点,如果周围有大于高阈值的像素则认定该点也是边缘点;灰度小于低阈值的点不是边缘点[7]。

1.2 Canny算法的缺点

Canny算法在2×2邻域内计算梯度和幅值,容易检测出孤立边缘点和伪边缘[4]。Canny算法对阈值选取比较敏感,如果Canny算子的高阈值选取过大,则会丢失灰度值变化较小的边缘,阈值选取过小则会造成细节过多,增加伪边缘数目[5]。

文章 算法 阈值