首页 > 范文大全 > 正文

一种改进的Canny算法及其仿真验证

开篇:润墨网以专业的文秘视角,为您筛选了一篇一种改进的Canny算法及其仿真验证范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要: 为了提升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. It’s 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]。

此外,如果一个点的灰度处于高低阈值之间,又与边缘点相邻,则被认定为边缘点,这样检测得到的边缘往往较厚,很难达到单像素级。

1.3 改进的Canny边缘检测算法

第一步:针对由所选邻域过小,计算后精度偏低这一情况,根据Canny算法在某些条件下与小波变换是等价的[8],而小波变换是使用函数的一阶导数对原图像进行小波变换后直接求出梯度,利用小波变换的方法可以避开这种情况。所以选用二维高斯函数的一阶偏导数来构造滤波器,得到滤波器Q(x,y)为:

[Q(x,y)=-x?e-(x2+y2)2σ22πσ4] (4)

高斯标准差为1时,得到滤波器fx:

使用滤波器平滑图像,并根据式(2)求取梯度幅值。

第二步:优化阈值选取。双阈值法对图像进行边缘提取是一种图像分割的方法,基于阈值的图像分割方法还有极小值法、p?参数法、聚类法等。p?参数法是一种简单而有效的方法,针对预先已知图像中目标物所占比例的情况下,选择一个值L,使前景目标物所占的比例为p[9]。由于每幅图像灰度值大小的不确定性,不能确定目标在图像中多占比例,所以不能直接使用此方法,本文运用一种更为简单的确定阈值方法,如下式:

[L=a?(Dmax-Dmin)+Dmin] (6)

式中Dmax和Dmin分别是图像梯度幅值的最大值和最小值,a是一个可以提前设定的系数,可以通过多次试验根据图像分割效果来确定。使用式(6)确定图像的阈值,认定小于该值的点为非边缘点,大于该值的点为待确定边缘点。通过调节系数a,算法能够适应不同的图像。

第三步:边界细化。经过前面的低阈值图像分割,会产生一些可能的边缘点。经典Canny算法根据阈值判断来确定某一点是否为边缘点。在这种情况下,检测到的边缘像素比较多,构成的目标边界比较粗,不能使得边缘达到单像素级别。此时需要对边界进行细化,通过对三种细化方法的进行比较[8],根据边界细化的描述[7],本文选用一种用插值进行非最大消除的方法进行边界细化。其基本思路是通过对相邻单元的梯度幅值的插值来在当前点的周围计算梯度的幅度。通过选取可能边界点周围8?邻域像素在经过图像分割后的值进行二维线性插值,如果该点的值比插值所得的值都大,则认定该点为边缘点,否则不是边缘点。

2 算法实现

完成算法设计后,运用C语言编程(用浮点运算)实现了该算法。由于最终应用对象是FPGA平台,而FPGA上的运算一般是定点运算,所以需要对C语言程序进行浮点运算定点化,首先对式(5)的滤波器进行整体放大,得到整形的滤波器:

系数a取值为0.18,图像处理结果如图1所示。

图1 处理结果对比

可见本文算法处理效果与经典的Canny算法处理效果相比,边缘更细,测得的非边缘点误检较少。定点化处理后的效果与未进行定点化处理效果基本一致,两种处理结果存在差别的主要原因是:滤波器经过放大后,精度有所降低,平滑结果会有一些细微的差别。但是总体效果相差不大,所以可以将定点化后的算法使用Verilog HDL语言进行描述。

3 改进算法的仿真验证

3.1 仿真平台

仿真运行的操作系统为Windows 7 64 b SP1,Matlab版本为R2011b(7.13.0.564)64?bit,Modelsim版本为 SE64 10.0a。

3.2 仿真过程

仿真过程主要分为三大部分,如图2所示。

图2 仿真流程

第一步:设计输入。图像处理系统的输入是图像数据。不同于其他文献[10]将图像数据写入到文本文件,并在后续仿真中使用testbench导入数据的方法。本文通过Matlab编程,读取待处理图像,并生成一个包含工具控制语言和图像数据的do格式文件,do文件可以作为Moldesim仿真的输入。do文件生成过程如图3所示。

图3 Matlab生成激励

第二步:在Modelsim中仿真并输出结果数据。首先将系统工作目录切换至已完成Verilog HDL算法描述文件所在目录下,然后对该文件进行编译,编译通过后进行仿真。开始仿真后,首先使用执行宏命令项将激励文件指向Matlab生成的do文件将激励导入,然后根据算法模块的端口设计设置信号属性,设置完成后运行算法仿真,仿真界面如图4所示。虽然Modelsim可以进行功能仿真,但是无法查看图像处理结果,只能将处理结果保存在本地磁盘,再借助其他软件将处理结果显示出来。具体方法是在编写Verilog HDL代码时,加入文件操作功能,在本地磁盘上创建文本文件,将算法仿真处理结果写入到文本文件当中,这样仿真结果可以非常直接的保存下来。

图4 Modelsim仿真过程

第三步:Matlab中查看仿真结果。仿真结束后再次转入到Matlab软件中,将第二步中生成的文本文件中的内容复制到Matlab中并赋给一个变量,这样便在Matlab中得到一个矩阵,这个矩阵就是图像处理的结果,将该矩阵封装成一幅图像并显示出来就可以查看处理结果,显示效果如图5所示。

3.3 仿真结果展示

通过观察可以发现,采用本文算法并仿真的图片与C语言效果相差不大。形成差别的主要原因是:硬件描述语言仿真过程中如果除运算出现小数,小数部分就会被舍弃,这样会降低运算精度,而C语言中则不会,所以C语言处理结果更加接近没有进行定点化的效果。

4 结 语

针对经典Canny算法所选邻域较小、阈值确定问题、所检得边缘较厚等问题,提出一种改进的算法,并用C语言编程对算法进行验证,为了将改进的算法移植至FPGA平台,设计了一种图像处理仿真方法,运用Verilog HDL编程,对图像处理结果进行了验证。

参考文献

[1] CANNY J F. A computational approach to edge detection [J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1986, 8(6): 679?698.

[2] 王植.贺赛先.一种基于Canny理论的自适应边缘检测方法[J].中国图象图形学报,2004,9(8):957?962.

[3] 潘琦.黄英.基于Canny算法的改进型图像边缘检测算法[J].工业控制计算机,2011,24(10):57?58.

[4] 张震.马驷良.张忠波,等.一种改进的基于Canny算子的图像边缘提取算法[J].吉林大学学报,2007,45(2):244?248.

[5] 宗露艳.吴陈.一种改进的Canny算子边缘检测算法[J].现代电子技术,2011,34(4):104?106.

[6] 孙即祥.图像分析[M].北京:科学出版社,2005.

[7] 章毓晋.图像分析[M].2版.北京:清华大学出版社,2005.

[8] LAM Louisa, LEE S W. Thinning methodologies: a comprehensive survey [J]. IEEE Transactions on Pattern Analysis and Machine intelligence, 1992, 9(14): 869?885.

[9] 于殿泓.图像检测与处理技术[M].西安:西安电子科技大学出版社,2006.

[10] 李寿强.Matlab和Modelsim联合仿真在FPGA开发中的应用[J].电子制作,2013(12):77?78.

[11] 赵晓丽,孔勇.基于高斯小波的多尺度图像边缘检测算法[J].数据采集与处理,2012,27(4):491?494.