天天看点

soble边缘检测算法的verilog实现

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

     SOBLE算子的卷积因子为:

soble边缘检测算法的verilog实现
soble边缘检测算法的verilog实现

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

soble边缘检测算法的verilog实现
soble边缘检测算法的verilog实现

图像每一个像素的横向和纵向灰度值通过一下公式结合,来计算该点灰度的大小:

soble边缘检测算法的verilog实现

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

soble边缘检测算法的verilog实现

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

soble边缘检测算法的verilog实现

soble算子的verilog实现,可以划分为4个步骤,解析和实现分别如下: (1)计算Gx, Gy与3*3像素阵列每行的乘积。

soble边缘检测算法的verilog实现

以上是例化生成3*3矩阵的模块,下面的代码是计算Gx, Gy。(2个clk)

soble边缘检测算法的verilog实现
soble边缘检测算法的verilog实现

  这个理解起来不难,比较简单,先用一个时钟计算3*3矩阵每行的像素乘积,再求的卷积后的Gx,Gy,因此消耗了两个时钟。 (2)求Gx^2+Gy^2的结果,及Gx与Gy的平方和。(1个clk) 这一步直接通过veilog中的乘法器的描述来实现,综合时会自动布线为片内乘法器,如下。

soble边缘检测算法的verilog实现

(3)求Gx^2+Gy^2的平方根。(1个clk) 强大的ALTERA在QII软件中提供了平方根的IP核,如下所示。

soble边缘检测算法的verilog实现

下面给出SQRT的例化代码:

soble边缘检测算法的verilog实现

(4)根据外部输入阈值,判断并实现边缘的检测。(1个clk)

soble边缘检测算法的verilog实现

将post_bit_r扩展到8bit, ~{8{post_bit_r}}, 检测到的边缘为黑色。

soble_threshold 是外部输入的一个人为设定的阈值。 (5)前面几步对图像数据的处理总共消耗了5个时钟,因此图像阵列的同步信号需要延迟5个时钟。

soble边缘检测算法的verilog实现

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