soble边缘检测算法的verilog实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
soble边缘检测算法的verilog实现
先来说说soble算子,soble算子是一种离散性差分算子,用来运算图像亮度函数的灰度的近似值,在图像的任何一点使用这个算子,会得到对应的灰度矢量或法矢量。
SOBLE算子的卷积因子为:
soble算子包含两组3*3的矩阵,分别为横向和纵向,将Gx 和Gy 与图像做卷积,即可分别得出横向和纵向的亮度差分近似值,如果用A表示原始图像,Gx 和 Gy 分别代表经横向和纵向边缘检测的图像灰度值,公式如下:
图像每一个像素的横向和纵向灰度值通过一下公式结合,来计算该点灰度的大小:
通常,为了提高效率,使用不开平方的近似值,但是这样做会损失精度,迫不得已的时候可以这样做:
就是这个G就是判断条件,如果梯度G大于某一阈值(THRESHOLD),则认为该点(X,Y)为边缘点。
可以使用下面公式计算梯度方向(如果只是边缘检测则不需要计算方向)
soble算子的verilog实现,可以划分为4个步骤,解析和实现分别如下:
(1)计算Gx, Gy与3*3像素阵列每行的乘积。
以上是例化生成3*3矩阵的模块,下面的代码是计算Gx, Gy。
(2个clk)
这个理解起来不难,比较简单,先用一个时钟计算3*3矩阵每行的像素乘积,再求的卷积后的Gx,Gy,因此消耗了两个时钟。
(2)求Gx^2+Gy^2的结果,及Gx与Gy的平方和。
(1个clk)这一步直接通过veilog中的乘法器的描述来实现,综合时会自动布线为片内乘法器,如下。
(3)求Gx^2+Gy^2的平方根。
(1个clk)
强大的ALTERA在QII软件中提供了平方根的IP核,如下所示。
下面给出SQRT的例化代码:
(4)根据外部输入阈值,判断并实现边缘的检测。
(1个clk)
将post_bit_r扩展到8bit, ~{8{post_bit_r}}, 检测到的边缘为黑色。
soble_threshold 是外部输入的一个人为设定的阈值。
(5)前面几步对图像数据的处理总共消耗了5个时钟,因此图像阵列的同步信号需要延迟5个时钟。
以上就完成了Soble 算子的HDL移植。
是不是很简单?真的不难。