FPGA在缘检测中的应用.docx
《FPGA在缘检测中的应用.docx》由会员分享,可在线阅读,更多相关《FPGA在缘检测中的应用.docx(14页珍藏版)》请在冰豆网上搜索。
FPGA在缘检测中的应用
FPGA在边缘检测中的应用
摘要:
目前,FPGA以其算法硬件处理速度快、可编程、可重配置等特性,非常适合图像处理系统。
本文针对边缘检测算法实现方法的研究,利用FPGA这一平台进行了实现。
文章分析了FPGA在边缘检测中的应用,主要是Sobel边缘检测算子、Prewitt边缘检测算子。
在论文中,根据FPGA的并行流水线性,对Sobel、Prewitt边缘检测算子分别进行了FPGA设计与实现,并进行了仿真,并且利用两种边缘检测算子对图像进行了处理比较。
最后,从时间和效果与软件处理的结果方面,对两种边缘检测算子进行了比较。
关键词数字图像处理Sobel边缘检测法Prewitt边缘检测算法现场可编程逻辑门阵列(FPGA)
0引言
所谓的数字图像处理技术,就是我们利用计算机对图像进行加工处理,并从中获取一些对我们来说有用的信息。
在现实生活中,我们也亲身体会到我们是通过图像获取视觉信息的。
伴随着计算机信息技术、集成电路技术的飞速发展,数字图像处理技术也得到了很大的发展,并且也出现了许多与数字图像处理技术相关的新理论、新技术、新设备。
这些新理论、新技术、新技术在工业生产、科学研究、医疗卫生等领域得到了广泛应用,也对人类社会的发展以及人类生活水平的提高做出了巨大的贡献。
我们知道边缘一般是指图像灰度变化率最大的位置,图像的边缘是图像最重要的特征,它是由于图像局部特征的不连续形成的。
边缘的表现形式有图像灰度级与纹理结构的突变、彩色变化等等,在图像的边缘信息里含有许多对图像分析特别重要的特征信息。
在利用计算机进行数字图像处理的过程中,为了使图像的轮廓更加突出,容易辨别,而采取的一种图像处理方法就是边缘检测,有时也称其为边缘增强。
在图像处理的过程中,边缘检测主要运用于图像中的目标与图像的背景、图像中的不同区域之间、图像中的一个目标与另一个目标之间,是人们描述、识别目标以及解释图像的一个非常重要的参数。
边缘包含了图像丰富的信息,它是完实现图像分割、图像配准、图像分类以及图像识别的重要保障,如果边缘检测能够成功,那么图像分析就会变得很方便很简单,并且其精度也会得到相应的提高。
边缘检测算子分为一阶微分算子和二阶微分算子。
常见的一阶微分算子有Prewitt算子,Canny算子、Sobel算子、RobertsCross算子,Kirsch算子,罗盘算子等等。
二阶微分算子包括Laplacian算子和LOG算子等等。
本文主要介绍了Prewitt边缘检测算子的原理以及基于FPGA的Prewitt边缘检测算法的实现。
1边缘检测算子介绍
图像的边缘是图像最基本的特征之一,边缘检测是模式识别、图像分析中非常重要部分,因此在机器人视觉、图像处理、卫星遥感技术等领域中起着很重要的作用。
边缘一般是指图像灰度变化率最大的位置,含有图像中最重要的信息,因此边缘总存在于两个相邻的且具有不同灰度值的区域之间。
通常情况下,信号中的边缘点有两种,一种是突变点,再者就是奇异点,边缘点附近灰度的变换可以由相邻象素灰度分布的梯度反映出来。
1.1Sobel边缘检测算子
索贝尔算子(SobelOperator)是数字图像处理中的常用算子之一,主要应用于边缘检测。
在技术上,它是一离散型差分算子,用来运算图像亮度函数的梯度近似值。
在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量。
现在假设在图像平面上有一个9个点的小区域:
(1-1)
现用一个二次曲面
来拟合这9个点的灰度值,即用
(1-2)
来近似图像灰度函数
,并使均方误差
(1-3)
最小。
令
分别为零,联立解得各系数。
将二次曲面
对
,
求偏导数,得到梯度的幅值为:
(1-4)
它的两个卷积模板为:
(1-5)
(1-6)
1.2Prewitt边缘检测算子
Prewitt算子是一种边缘模板算子,这种算法是利用局部差分平均方法来寻找边缘的,该算法体现了三对像素点像素值之差的平均概念。
首先这些算子的模板是由理想的边缘算子图像构成的,然后依次用边缘模板去检测待检测的图像,再由与被检测区域最为相似的模板给出检测的最大值,并且用这个最大值代替算子的输出值,这样边缘像素就被检测出来了。
在这里我们假设在图像平面上有一个9个点的小区域:
(1-7)
Prewitt算子是通过对平面上9个点进行曲面拟合进而求拟合曲面偏导数,最后再计算梯度的幅值。
根据Prewitt的定义可以得到Prewitt算子:
(1-8)
其中两个卷积为:
(1-9)
(1-10)
2.基于FPGA的设计思路
FPGA设计流程如图2-1所示:
图2-1FPGA典型设计流
2.1设计思路介绍
由于sobel算子和Prewitt算子的实现思路是类似的,他们的区别只是在于算子的不同。
这里我们以sobel算子为例介绍,Prewitt算子是一样的。
Sobel边缘检测的算法基本原理如图2-2所示:
图2-2Sobel边缘检测算法原理图
首先分别计算水平梯度和垂直梯度,然后将两个方向的梯度值结合起来,接着通过一个门限值后,最后输出二值图像。
通过前面的分析可知,假设输入的像素点分别为
,
,
,
,
,
,
,
,
。
那么x方向的梯度和y方向的梯度分别为:
(2-1)
梯度结合后的梯度值G为:
(2-2)
门限处理函数:
(2-3)
其中
为门限处理的阈值。
综上分析Sobel算子在空间域上比较容易实现,而且可以有效的滤除图像噪声的影响,比较适合处理有害噪声较多的图像。
欲在FPGA中实现Sobel边缘检测首先需要生成3*3的窗口,窗口的生成办法已经在前面中值滤波一节中做了介绍,在此不再重复介绍。
此处重点介绍如何完成Sobel算子运算。
Sobel算法的关键在于计算梯度值G。
由前面分析可知
(2-4)
设计中避免使用乘法和除法运算从而减小系统的面积。
其具体的算法实现框图如图2-3所示:
图2-3Sobel算法实现框图
在上面框图中
,
,
,
,
,
,
,
,
表示对应的像素点。
主要的操作是加法操作和减法操作,其中abs为取绝对值操作。
编译综合之后生成的RTL级框图如下图所示,图中最左侧的模块是3*3窗口生成模块,接着是水平梯度和垂直梯度计算模块,后面是绝对值计算模块,最后一个是梯度整合模块和阈值计算模块。
图2-4Sobel算法的RTL级原理图
从上面这个图能清晰的看出Sobel的内部结构设计,而从下面这个Sobel端口图则能清楚的看出这个模块部分的输入输出关系。
图2-5Sobel算法模块的端口
上图中的clk为时钟信号,rst是复位信号。
median_out_flag则是输出使能信号,median_data_in是输入的像素灰度信息,其为8位无符号数,取值范围是0~255。
输出信号包括:
输出结果sobel_data。
已开始输出指示信号sobel_en。
x和y是从内部行计数器输出的像素点的x,y坐标。
由于sobel算子和Prewitt算子的实现思路是类似的,他们的区别只是在于算子的不同。
其算子形式为:
(2-5)
2.2FPGA代码解释
下面这个语句中:
assignsobel_data=en_grads?
((abs_data>=675)?
8'd255:
8'd0):
8'd0;//设定阈值,此时为675
修改标红的数据就是更改阈值。
另外比较关心的是算子的实现部分该部分是在data_grads.v文件中实现的,具体代码如下所示,重点关注下标红的部分:
//产生Gx横向梯度
always@(posedgeclkornegedgerst)
begin
if(!
rst)
begin
data_x1<=0;
data_x2<=0;
end
else
begin
if(filter_req)
begin
data_x1<=P9+P8+P8+P7;(Prewitt算子此处是P9+P8+P7)
data_x2<=P1+P2+P2+P3;(Prewitt算子此处是P1+P2+P3)
end
else
begin
data_x1<=0;
data_x2<=0;
end
end
end
always@(posedgeclkornegedgerst)
begin
if(!
rst)
begin
Gx<=0;
end
else
begin
if(flag_reg)
Gx<=data_x1-data_x2;
else
Gx<=0;
end
end
//产生Gy纵向梯度
always@(posedgeclkornegedgerst)
begin
if(!
rst)
begin
data_y1<=0;
data_y2<=0;
end
else
begin
if(filter_req)
begin
data_y1<=P9+P6+P6+P3;(Prewitt算子此处是P9+P6+P3)
data_y2<=P1+P4+P4+P7;(Prewitt算子此处是P1+P4+P7)
end
else
begin
data_y1<=0;
data_y2<=0;
end
end
end
always@(posedgeclkornegedgerst)
begin
if(!
rst)
begin
Gy<=0;
end
else
begin
if(flag_reg)
Gy<=data_y1-data_y2;
else
Gy<=0;
end
end
3.仿真结果以及分析
仿真结果如下图所示:
图3-1算法的仿真结果
图3-2算法的仿真结果细节
图3-1是仿真的整体图,可以看到在这个图中clk时钟信号已经看不清楚,图3-2能清楚的看到sobel_data(Prewitt边缘检测结果数据)的输出变化。
图3-2是将仿真图放大之后的效果,在这个图中能看出clk时钟信号和图像信息输入数据median_data_in的变化。
可以看到出sobel_data只有两种状态0x00和0xff。
当前点如果是在边缘上则通过系统之后该点的数值变为0xff,如果当前点不是在边缘上则该点输出为0x00。
仿真结果如下图所示:
图3-3Sobel边缘检测算子的仿真结果(阈值为675)
图3-4Prewitt边缘检测算子的仿真结果(阈值为675)
通过以上仿真结果可以看出,Sobel边缘检测算子对噪声具有平滑作用,提供的边缘方向信息也比较精确,但是Sobel边缘检测算子的边缘定位精度不够高,适用于实际应用中对精度要求不高的场合。
Prewitt边缘检测算子也具有平滑噪声的作用,但是其定位精度也不够高。
5.结语
在文中,主要基于FPGA对Sobel和Prewitt边缘检测算子的实现进行了分析研究。
根据两种边缘检测算子的基本原理,利用FPGA平台对其进行了设计仿真分析,研究FPGA在边缘检测中应用,并通过MATLAB的imshow函数实现了图像数据的显示,并且对仿真结果进行了对比分析。
参考文献
[1]张亶,陈刚编.基于偏微分方程的图像处理.北京:
高等教育出版社,2004,20-61
[2]章毓晋.图像工程(上册)-图像处理[M].北京:
清华大学出版社,2012.2.
[3]范培培.基于FPGA的图像处理方法研究与实现[D].天津:
河北工业大学,2010.12.
[4]张永军.基于FPGA的图像处理系统设计与算法实现研究:
[D].重庆:
重庆大学,2006
[5]付麦霞,张元,廉飞宇.基于CPLD的图像边缘检测器的研究[J].通信技术,2009,42(11):
[6]云霄.可配置FFT/IFFT处理器的设计及其FPGA构造:
[硕士论文].西安:
西安电子科技大学,2009
[7]郑文明.基于FPGA的数字信号处理算法研究与高效实现:
[硕士论文].黑龙江:
哈尔滨工程大学,2009
[8]唐良瑞,马全明,景晓军等图像处理实用技术北京:
化学工业出版社,2002.1
[9]吴艳.基于FPGA的数字图像处理基本算法研究与实现:
[D].黑龙江:
哈尔滨工业大学,2008
[10]褚镇勇.FPGA设计及应用.西安:
西安电子科技大学出版社,2002.7