soble边缘检测算法的verilog实现

    先来说说soble算子,soble算子是一种离散性差分算子,用来运算图像亮度函数的灰度的近似值,在图像的任何一点使用这个算子,会得到对应的灰度矢量或法矢量。

     SOBLE算子的卷积因子为:
soble边缘检测算法的verilog实现_第1张图片 soble边缘检测算法的verilog实现_第2张图片
soble算子包含两组3*3的矩阵,分别为横向和纵向,将 Gx 和 Gy 与图像做 卷积,即可分别得出横向和纵向的亮度差分近似值,如果用A表示原始图像,Gx 和 Gy 分别代表经横向和纵向边缘检测的图像灰度值,公式如下:

soble边缘检测算法的verilog实现_第3张图片 soble边缘检测算法的verilog实现_第4张图片
图像每一个像素的横向和纵向灰度值通过一下公式结合,来计算该点灰度的大小:

通常,为了提高效率,使用不开平方的近似值,但是这样做会损失精度,迫不得已的时候可以这样做:

就是这个G就是判断条件,如果梯度G大于某一阈值(THRESHOLD),则认为该点(X,Y)为边缘点。可以使用下面公式计算梯度方向(如果只是边缘检测则不需要计算方向)

soble边缘检测算法的verilog实现_第5张图片
soble算子的verilog实现,可以划分为4个步骤,解析和实现分别如下:
(1)计算Gx, Gy与3*3像素阵列每行的乘积。
soble边缘检测算法的verilog实现_第6张图片
以上是例化生成3*3矩阵的模块,下面的代码是计算Gx, Gy。(2个clk) soble边缘检测算法的verilog实现_第7张图片
 
这个理解起来不难,比较简单,先用一个时钟计算3*3矩阵每行的像素乘积,再求的卷积后的Gx,Gy,因此消耗了两个时钟。
(2)求Gx^2+Gy^2的结果,及Gx与Gy的平方和。(1个clk)
这一步直接通过veilog中的乘法器的描述来实现,综合时会自动布线为片内乘法器,如下。
soble边缘检测算法的verilog实现_第8张图片
(3)求Gx^2+Gy^2的平方根。(1个clk)
强大的ALTERA在QII软件中提供了平方根的IP核,如下所示。
soble边缘检测算法的verilog实现_第9张图片
下面给出SQRT的例化代码:
soble边缘检测算法的verilog实现_第10张图片
(4)根据外部输入阈值,判断并实现边缘的检测。(1个clk)
soble边缘检测算法的verilog实现_第11张图片
将post_bit_r扩展到8bit, ~{8{post_bit_r}}, 检测到的边缘为黑色。

soble_threshold 是外部输入的一个人为设定的阈值。
(5)前面几步对图像数据的处理总共消耗了5个时钟,因此图像阵列的同步信号需要延迟5个时钟。
soble边缘检测算法的verilog实现_第12张图片

以上就完成了Soble 算子的HDL移植。是不是很简单?真的不难。


你可能感兴趣的:(FPGA)