一种基于FPGA的Sobel边缘检测算法与仿真研究
2015-12-03廖传柱漳州职业技术学院电子工程系福建漳州363000
廖传柱 (漳州职业技术学院电子工程系,福建 漳州363000)
随着计算机技术的高速发展,数字图像处理技术已经融入到日常生活中,如照片、刊物、航空测量、卫星遥感等。在图像测量技术的研究中,图像边缘检测是图像处理的一个基本问题。在图像边缘检测中,边缘检测算子分为一阶微分算子和二阶微分算子。常见的一阶微分算子有Prewitt算子、Canny算子、Sobel算子、Roberts Cross算子、Kirsch算子和罗盘算子等。二阶微分算子包括Laplacian算子和LOG算子等[1,2]。下面,笔者对基于FPGA(现场可编程门阵列)的Sobel边缘检测算子的实现问题进行了研究。
1 Sobel边缘检测算子
Sobel边缘检测算子是离散型差分算子,用来运算图像亮度函数的梯度近似值。在图像的任何一点使用该算子,将会产生对应的梯度矢量或法矢量[3,4]。假设在图像平面上有一个9个点的小区域:
用二次曲面z(x,y)来拟合上述9个点的灰度值,即用:
来近似图像灰度函数f(x,y),并使均方误差:
它的2个卷积模板为:
2 基于FPGA的Sobel边缘检测算法
Sobel边缘检测算法原理图如图1所示:首先,分别计算水平梯度和垂直梯度,然后将2个方向的梯度值结合起来,通过一个门限值后,再输出二值图像。
假设输入的像素点分别为a11、a12、a13、a21、a22、a23、a31、a32、a33,则x方向的梯度和y方向的梯度分别为:
图1 Sobel边缘检测算法原理图
梯度结合后的梯度值G为:
门限处理函数:
式中,GT是门限处理的阈值。
根据以上分析,可知在空间域上比较容易实现Sobel边缘检测算子,且采用上述方法可以有效处理噪声的影响[5-6]。
Sobel边缘检测算法的关键在于计算梯度值G,由式(6)和式(7)可知:
设计中应避免使用乘法和除法运算以减小系统面积。具体算法实现框图如图2所示。在图2中,a11、a12、a13、a21、a22、a23、a31、a32、a33分别表示对应的像素点。在算法实现过程中,主要进行加法和减法操作,图2中的abs框表示的是取绝对值操作。通过编译综合,最后生成RTL级框图(见图3,其中最左侧的模块所实现的功能是生成3×3窗口,接下来左边第2个模块的功能是计算水平梯度和垂直梯度,下一个模块的功能是计算绝对值,最后一个模块的功能是整合梯度以及计算阈值)。
图2 Sobel边缘检测算法实现框图
图3 Sobel边缘检测算法的RTL级原理图
通过图3可以清晰地看出,Sobel的内部结构设计,而从图4则能看出算法模块部分的输入输出关系,其中,clk为时钟信号,rst是复位信号。median_out_flag是输出使能信号的输出端口,median_data_in是像素灰度信息的输入端口,它们是8位无符号数,取值范围是0~255。输出信号包括:输出结果sobel_data;已开始输出指示信号sobel_en。x和y分别是从内部行计数器输出的像素点的x、y坐标。
图4 Sobel边缘检测算法模块的端口
Sobel边缘检测算法设计中FPGA代码所包括的文件见图5。
每个算子的仿真工程都由上述文件构成,下面以图3为参照来介绍各个文件的作用。图3中最左侧的模块是fe_generater_mode3by3.v,主要功能是生成3×3窗口,其输入是串行的图像数据,输出则是3×3的卷积窗口。该文件模块调用的fe_fifo1和fe_fifo2以及data3by3,其中前面2个文件都是quartus的IP核,而后面的文件则最终生成3×3的窗口。从左侧起第2个模块(data_grads.v)是算子实现和计算模块,该模块输入的是3×3的图像块,输入的则是图像块中心像素点的x方向和y方向的梯度。接下来的是2个计算绝对值的模块,上述模块也是由quartusIP核生成的。紧接着的模块abs.v的作用是将其左侧模块的2个梯度值相加,最右面的模块的作用是阈值判决。需要指出的是,阈值修改边缘检测中的阈值是在顶层文件Grads.v的以下面语句中:
图5 Sobel边缘检测算法设计中的FPGA代码所包含的文件
此时为675,修改(abs_data≥675)的数据就是更改阈值。算子的实现部分是在data_grads.v文件中实现的。
3 仿真结果及分析
该模块的测试数据来自于经过Matlab处理的一个txt文件,其操作代码如下:
这个文件中存储的是在testbench文件中主要是通过一个系统函数$readmemh(“image.txt”,data_mem)将图像数据文件image.txt读入到变量data_mem中,再通过一个always语句在每个时钟上升沿到来之时依次将变量值赋值给输入端口。仿真时将相应的存储结果再存储到image_process.txt文件中。处理结果的存储主要包括以下代码:
仿真结果如图6、图7所示,分别为Sobel边缘检测算法的仿真结果及其细节图。图6中clk时钟信号显示不清楚,而图7则能清楚显示clk时钟信号和图像信息输入数据median_data_in的变化,即sobel_data只有2种状态0x00和0xff。若前点在边缘上,则通过系统后该点的数值变为0xff,若前点不是在边缘上则该点输出为0x00。
图6 Sobel边缘检测算法的仿真结果图
图7 Sobel边缘检测算法的仿真结果细节图
在modelsim仿真的过程中,通过相应函数将图的处理结果存储在image_process.txt文件中,再通过Matlab的imshow函数实现图像数据的显示。
Sobel边缘检测算子的仿真结果图如图8所示。从图8可以看出,与处理前的图片相比,处理后的图片将边缘亮点都清晰标记出来,这表明实现了基于FPGA的Sobel边缘检测。
图8 Sobel边缘检测算子的仿真结果图
4 结语
对Sobel边缘检测算子进行了介绍,在此基础上对Sobel边缘检测算法进行设计,并利用FPGA平台对其进行了仿真。分析表明,运用Sobel边缘检测算法处理后的图片能清晰标记边缘亮点,取得了良好的图像边缘检测效果。
[1]章毓晋 .图像工程——图像处理[M].北京:清华大学出版社,2012.
[2]范培培 .基于FPGA的图像处理方法研究与实现[D].天津:河北工业大学,2010.
[3]付麦霞,张元,廉飞宇 .基于CPLD的图像边缘检测器的研究[J].通信技术,2009,42(11):67~69.
[4]唐良瑞,马全明,景晓军,等 .图像处理实用技术[M].北京:化学工业出版社,2002.
[5]吴艳 .基于FPGA的数字图像处理基本算法研究与实现[D].哈尔滨:哈尔滨工业大学,2008.
[6]褚镇勇.FPGA设计及应用[M].西安:西安电子科技大学出版社,2002.