概述
目录
- 一、边缘检测
- 二、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)的梯度表达式:
∇f它指出了f(图像)在点( x, y)处最大变化率的方向。
向量∇f的大小(长度)表示为M(x,y), M(x,y)的表达式如下:
梯度的方向我们可以用下图的公式来表示,它是以x轴为度量基准表示的,它与图像的边缘垂直。
二、Sobel算子
索贝尔算子是把图像中每个像素的上下左右四领域的灰度值加权差,在边缘处达到极值从而检测边缘。索贝尔算子不但产生较好的检测效果,而且对噪声具有平滑抑制作用,但是得到的边缘较粗,且可能出现伪边缘。
因为Sobel算子简单,提供较为精确的边缘方向信息,当对精度要求不是很高时,是一种较为常用的边缘检测方法。 如果对边缘精度较高,canny算子比较适合,但是canny算子实现较sobel算子更复杂。
我们要计算梯度的大小,首先要计算梯度关于x和y方向的分量gy和gx,比较常用的计算梯度的分量的方法是使用一些空间域的模板。这次用Sobel的模板来实现:
然后用这个模板去卷积图像阵列,最终得到X方向和Y方向的分量,再求X分量Y分量和的平方根,得到最终灰度值的大小,然后与设置的阈值比较,判断该点是否为边缘。
三、Verilog 实现步骤
图像数据缓存(实时边缘检测,难点,重点)
在进行边缘检测之前,我们需要知道,因为我们需要实现进行边缘检测,所以就不能像对静态图片进行边缘检测一样(得到一整副图像后再进行边缘检测),而是当采集到一个像素点图像数据之后立马对该点进行边缘检测。
所以我们需要先对两行图像数据进行缓存,然后,当下一行的第一个数据来到之后,开始进行计算。
其实整个Sobel边缘检测的最重要也最难的一点就是数据缓存(设计一个移位寄存器)。
下面我们假设一副图像的有16个像素点,一副完整图像位置如下:
我们设计两个RAM,充当移位寄存器每个RAM深度为4,用来缓存8个图像数据,数据输入到RAM的步骤如下:
1、RAM1和RAM2已经缓存完成,RAM1和RAM2构成移位寄存器,第三行是新输入的一行,不用缓存
2、当下一个数据(第三行第一列的数据)输入
3、当第三行第二列的数据输入
4、当第三行第三列的数据输入
5、当第三行第四列的数据输入
6、当第四行第一列的数据输入
后面的依次输入,只需要把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算子边缘检测的全部内容,希望文章能够帮你解决数字图像处理学习(二):Sobel算子边缘检测所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复