数字图像处理学习(二):Sobel算子边缘检测

目录

    • 一、边缘检测
    • 二、Sobel算子
    • 三、Verilog 实现步骤
      • 图像数据缓存(实时边缘检测,难点,重点)
      • 1、计算计算 Gx与 Gy与模板每行的乘积
      • 2、求得3*3模板运算后的Gx、Gy
      • 3、求得 Gx^2 + Gy^2 的结果, 及 Gx 与 Gy 的平方和
      • 4、求得 Gx^2 + Gy^2 的平方根
      • 5、与设置的阈值比较

一、边缘检测

边缘检测的目的是标识数字图像中亮度变化明显的点,即检测图像灰度级或者结构发生突变的像素点,这种一副图像中灰度级或结构突变的像素点的集合称为边缘。

图像的灰度值具有不连续性,图像局部的灰度突变可以用微分来检测,因为这种突变时间十分短促,因此一阶微分和二阶微分十分适合这种突变的检测。但使用二阶微分对噪声的响应更加强烈,其对图像的质量要求较高。

一幅图像可以看做是一个二维函数,图像的的一阶倒数可以用梯度表示( 梯度的本意是一个向量(矢量),表示某一函数在某一点处的方向导数沿着该方向取得最大值。 我们用∇f表示梯度,如下图所示为像素点( x, y)的梯度表达式:
数字图像处理学习(二):Sobel算子边缘检测_第1张图片
∇f它指出了f(图像)在点( x, y)处最大变化率的方向。
向量∇f的大小(长度)表示为M(x,y), M(x,y)的表达式如下:
在这里插入图片描述
梯度的方向我们可以用下图的公式来表示,它是以x轴为度量基准表示的,它与图像的边缘垂直。
在这里插入图片描述

二、Sobel算子

索贝尔算子是把图像中每个像素的上下左右四领域的灰度值加权差,在边缘处达到极值从而检测边缘。索贝尔算子不但产生较好的检测效果,而且对噪声具有平滑抑制作用,但是得到的边缘较粗,且可能出现伪边缘。

因为Sobel算子简单,提供较为精确的边缘方向信息,当对精度要求不是很高时,是一种较为常用的边缘检测方法。 如果对边缘精度较高,canny算子比较适合,但是canny算子实现较sobel算子更复杂。

我们要计算梯度的大小,首先要计算梯度关于x和y方向的分量gy和gx,比较常用的计算梯度的分量的方法是使用一些空间域的模板。这次用Sobel的模板来实现:
数字图像处理学习(二):Sobel算子边缘检测_第2张图片
然后用这个模板去卷积图像阵列,最终得到X方向和Y方向的分量,再求X分量Y分量和的平方根,得到最终灰度值的大小,然后与设置的阈值比较,判断该点是否为边缘。
数字图像处理学习(二):Sobel算子边缘检测_第3张图片

三、Verilog 实现步骤

图像数据缓存(实时边缘检测,难点,重点)

在进行边缘检测之前,我们需要知道,因为我们需要实现进行边缘检测,所以就不能像对静态图片进行边缘检测一样(得到一整副图像后再进行边缘检测),而是当采集到一个像素点图像数据之后立马对该点进行边缘检测。

所以我们需要先对两行图像数据进行缓存,然后,当下一行的第一个数据来到之后,开始进行计算。
其实整个Sobel边缘检测的最重要也最难的一点就是数据缓存(设计一个移位寄存器)。

下面我们假设一副图像的有16个像素点,一副完整图像位置如下:
数字图像处理学习(二):Sobel算子边缘检测_第4张图片

我们设计两个RAM,充当移位寄存器每个RAM深度为4,用来缓存8个图像数据,数据输入到RAM的步骤如下:

1、RAM1和RAM2已经缓存完成,RAM1和RAM2构成移位寄存器,第三行是新输入的一行,不用缓存
数字图像处理学习(二):Sobel算子边缘检测_第5张图片
2、当下一个数据(第三行第一列的数据)输入
数字图像处理学习(二):Sobel算子边缘检测_第6张图片
3、当第三行第二列的数据输入
数字图像处理学习(二):Sobel算子边缘检测_第7张图片
4、当第三行第三列的数据输入
数字图像处理学习(二):Sobel算子边缘检测_第8张图片
5、当第三行第四列的数据输入
数字图像处理学习(二):Sobel算子边缘检测_第9张图片
6、当第四行第一列的数据输入
数字图像处理学习(二):Sobel算子边缘检测_第10张图片
后面的依次输入,只需要把RAM1和RAM2的第一列数据以及被挤出来的数据组合就可以得到3*3像素矩阵的一列,然后,将三列数据取出来就可以得到一个3 * 3的像素矩阵,然后进行卷积运算。

1、计算计算 Gx与 Gy与模板每行的乘积

2、求得3*3模板运算后的Gx、Gy

3、求得 Gx^2 + Gy^2 的结果, 及 Gx 与 Gy 的平方和

4、求得 Gx^2 + Gy^2 的平方根

利用IP核,Altera 中为SQRT,Xilinx中的CORDIC

5、与设置的阈值比较

通过上面五个计算步骤,最终得到的数据与最终输出的数据偏移了5个时钟周期,所以需要对行场同步信号以及数据有效信号等进行打5拍。

这样就实现了实时边缘检测,但是因为利用的是3*3的模板,所以原始图像最边缘的一行和一列像素点并不能进行边缘检测。(卷积一般会将图像越卷越小,卷积因子的面积越大,卷积速度越快)

参考资料:如何实现Real Time的Sobel Edge Detector? (SoC)(Verilog)(Image Processing)

你可能感兴趣的:(图像处理,Sobel,边缘检测,图像处理,卷积)