您的位置  > 互联网

基于FPGA的Sobel边缘检测、中值滤波、Canny算子边缘

实现了利用PC上位机的串口将图像数据发送到VGA显示器,处理后处理的图像数据直接为灰度图像,然后在此基础上进行修改,从而实现基于FPGA动态图片的Sobel边缘检测、中值滤波、Canny算子边缘检测、腐蚀和扩展。然后在本文中,我们将实现基于 FPGA 的 Sobel 边缘检测。图像边缘

:简而言之,边缘是图像的灰度值突然变化的地方,即图像的像素值变化非常快,就像坐标轴上的一条曲线,开始平滑,突然大转弯,导数非常大。

Sobel算子主要用于边缘检测,从技术上讲,它是一种离散差分算子,用于计算图像亮度函数灰度的近似值。如果在图像的总和点使用此运算符,则将生成相应的灰度向量或其法向量。

边是那些像素的集合,这些像素周围的灰度会发生巨大变化。边缘存在于目标、背景和区域之间,因此它们是图像分割的最重要基础。由于边缘是位置的标志,对灰度变化不敏感,因此边缘也是图像匹配的一个重要特征。

Sobel边缘检测的核心在于像素矩阵的卷积,这对于数字图像处理非常重要,许多图像处理算法都是通过卷积实现的。卷积运算的本质是对定义图像区域的像素值进行加权求和的过程,计算过程是将图像区域中的每个像素值分别乘以卷积模板的每个元素,将卷积的结果相加,运算之和就是卷积运算的结果。

卷积公式如下。

3x3 窗口 M 和卷积模板 C 的卷积运算如下。

Gx 和 Gy 是 sobel 的卷积因子,这两个因子与原始图像的卷积因子如下。如图3-22所示。

Sobel 卷积因子

其中 A 表示原始图像。

得到图像中每个点的水平和垂直灰度值 Gx 和 Gy。最后,使用以下公式计算灰度的大小。

但通常,为了提高效率,使用非平方近似,尽管这样做会导致精度损失,

利用并行流水线的设计思想,将Sobel算子的实现分为5个步骤,整个模块的计算量可提高5倍。

(1)计算Gx和Gy的乘积以及模板的每一行

(2)两个3x3矩阵的卷积是将每行每列对应相乘,然后想加

(3) 3*3 模板运算后得到 Gx 和 Gy

(4) 求 Gx^2 + Gy^2 的结果,以及 Gx 和 Gy 的平方和(消耗两个时钟)。

(5) 求 Gx^2 + Gy^2 的平方根

边缘检测也需要生成 3x3 矩阵,这与中值滤波和均值滤波中生成 3X3 矩阵的方法完全相同,3X3 矩阵的生成方法可以参考之前的博客: 我最近发现我也有自己的 Shift RAM,它简直就是为 3X3 矩阵而生的, 所以我用它来实现 3X3 矩阵,配置如下:

只有一行

在这里一次可以生成数据,所以我拿两个IP核和一行输入来生成三行数据

这是

模块端口I设计,clken是串口接收到的完成标志信号,接收到的8位数据输入,最后经过Sobel算子计算后,通过比特将单位数据扩展为16位输出。

生成 3x3 矩阵

Sobel 算子和目标像素卷积如图所示,

利用生成的3x3矩阵与Sobel算子进行卷积,最终得到目标像素的当前方向梯度

最终值输出

在这里,我们使用开平方根的近似值并添加绝对值以简化工程量,尽管这会降低精度。

开平根操作后,我们设置一个阈值,当像素的值小于阈值输出为

0,当像素值大于输出阈值1时,最后将单个比特的数据扩展到VGA显示。显示视频效果图:

最后,我将阈值设置为150,最终测试lena图片如上图所示,可以看出,我们将属于lena边缘的部分显示为黑色,其余部分显示为百,这样就可以清楚地看到图像的边缘, 这为后期的图像分割和识别打下了坚实的基础,所以看来我们的Sobel边缘检测是正确的,边缘捕捉的效果还是不错的!

最后,

基于FPGA的Sobel边缘检测源码博主暂且不提供,之前已经提供了三种算法的工程源码,基础图像处理算法的思想已经传授给大家了,而Sobel也是本科毕业设计的热门话题,这套的价值, 我见过的最便宜的卖500元,所以如果能自己调试,那么你也可以代别人赚钱做毕业设计,如果你已经完全掌握了之前的基础课程,并且我提供了Sobel边缘检测算法的想法,那么我想你一定可以通过自己的方法调试Sobel, 也欢迎大家在学习的过程中与我讨论和学习。在下一篇文章中,我将同时进行中值滤波和 Sobel 边缘检测,然后在图像滤波后进行 Sobel 边缘检测。让我们看看最终的边缘检测是否会更好!