基于FPGA的Sobel边缘检测的实现

  前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测、中值滤波、Canny算子边缘检测、腐蚀和膨胀等。那么这篇文章我们将来实现基于FPGA的Sobel边缘检测。

图像边缘:简言之,边缘就是图像灰度值突变的地方,亦即图像在该部分的像素值变化速度非常之快,这就好比在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大。

  Sobel算子主要用作边缘检测,在技术上,它是一离散型差分算子,用来计算图像亮度函数灰度之近似值。在图像的恩和一点使用此算子,将会产生对应的灰度矢量或是其法矢量。

  边缘是指其周围像素灰度急剧变化的那些像素的集合。边缘存在于目标、背景和区域之间,所以,他是图像分割所以来的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,因此,边缘也是图像匹配的重要的特征。

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

         卷积公式如下。

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

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

  Sobel卷积因子

其中A代表原始图像。

得到图像中的每一个点的横向纵向灰度值Gx、Gy。最后通过如下公式来计算改点灰度的大小。

但是通常为了提高效率,使用不开平方的近似值,虽然这样做会损失精度,,

使用并行流水线的设计思想将Sobel算子的实现划分为五个步骤,加流水线后的计算可以将整个模块的计算提高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矩阵的生成方法可以参考前面的博客:最近发现Xilinx也有自己的Shift RAM,Shift_RAM简直就是为3X3矩阵而生的,所以这我使用Xilinx shift_RAM来实现3X3矩阵,配置如下:

这里Xilinx的shift_ram一次只能生成一行数据,所以我采用两个IP Core和正在输入的一行来生成三行数据

         这是我设计的模块端口,clken为串口接收的完成标志信号,接收到的八位数据输入,最后经过Sobel算子计算完成后,将单bit数据通过位扩展为十六位输出。

生成3x3矩阵

Sobel算子与目标像素卷积

如图所示,用生成的3x3矩阵与Sobel算子进行卷积,最后求出目标像素当前的方向梯度

最终值输出

这里我们为了简化工程量,所以我们采取使用开平方根的近似值,取绝对值相加,虽然这样做会损失精度。

通过开平根的运算后,我们设置一个阈值,当该像素点的值小于阈值输出为0,当像素点的值大于阈值输出为1,最后将单bit的数据进行位扩充输出给VGA显示。显示视频效果图:http://t.cn/RN7tODe

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

         最后基于FPGA的Sobel边缘检测源码博主在这里就不暂时不提供了,前面已经提供了三个算法的工程源码,基本图像处理算法的思路已经教给大家了,而且Sobel还是本科毕业设计的热门题目,这一套所持有的价值,我见过最便宜的是卖五百块人民币,所以如果大家能够自己调试出来那么你也就可以代人做毕业设计赚钱了,如果前面的那些基础课程大家都完全掌握了,这个Sobel边缘检测算法的思路我也已经提供了,那么我觉得肯定能通过自己的方法将Sobel调试出来,在学习的过程中欢迎和我一起讨论学习。下一篇呢,我会将中值滤波和Sobel边缘检测同时做在一起,图片进过中值滤波后再进行Sobel边缘检测。看看最后的边缘检测的效果会不会更好呢!

转载请注明出处:NingHeChuan(宁河川)

图像处理系列文章

第一篇:基于FPGA的VGA显示静态图片

第二篇:基于FPGA的RGB565_YCbCr_Gray算法实现

第三篇:基于FPGA的Uart接收图像数据至VGA显示

番外篇:数字图像处理界标准图像 Lena 后面的故事

第四篇:基于FPGA的均值滤波算法实现

第五篇:深刻认识shift_ram IP core——图像处理学习笔记

第六篇:基于FPGA的中值滤波算法实现

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

深度学习面试你必须知道这些答案

本文是问题 “那些深度学习《面试》你可能需要知道的” 的回答,答案均以英文版Deep Learning页标标记。 1. 列举常见的一些范数及其应用场景,如 ...

1.1K10
来自专栏开源FPGA

基于FPGA的中值滤波算法实现

         在这一篇开篇之前,我需要解决一个问题,上一篇我们实现了基于FPGA的均值滤波算法的实现,最后的显示效果图上发现有一些黑白色的斑点,我以为是椒盐...

2158
来自专栏智能算法

基础聚类算法:K-means算法

一、算法简介: 俗话说:“物以类聚,人以群分”,聚类算法不同于分类算法,对于一个 分类器 ,通常需要你告诉它“这个东西被分为某某类”这样一些例子,理想情况下,一...

3615
来自专栏ATYUN订阅号

【学术】机器学习优化函数的直观介绍

AiTechYun 编辑:yuxiangyu 优化是机器学习的研究人员最感兴趣的领域之一。在本文中,我想从简单的函数优化开始介绍,然后讨论找到只能找到局部最小值...

3436
来自专栏小小挖掘机

深度强化学习-DDPG算法原理和实现

在之前的几篇文章中,我们介绍了基于价值Value的强化学习算法Deep Q Network。有关DQN算法以及各种改进算法的原理和实现,可以参考之前的文章: 实...

6087
来自专栏人工智能头条

如何评价无监督聚类算法

782
来自专栏一直在跳坑然后爬坑

描述统计学相关概念笔记整理

定义:一组数据向其中心值靠拢的倾向和程度 测度:寻找数据的水平代表值或中心值 常用的测度指标:①均值②中位数③众数

1164
来自专栏深度学习入门与实践

【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络AlexNet

上周我们用PaddlePaddle和Tensorflow实现了图像分类,分别用自己手写的一个简单的CNN网络simple_cnn和LeNet-5的CNN网络识别...

3298
来自专栏琦小虾的Binary

论文翻译:ViBe+算法(ViBe算法的改进版本)

论文翻译:ViBe+算法(ViBe算法的改进版本) 原文地址: 《Background Subtraction: Experiments and Impro...

2528
来自专栏磐创AI技术团队的专栏

基于word2vec训练词向量(一)

1.回顾DNN训练词向量 上次说到了通过DNN模型训练词获得词向量,这次来讲解下如何用word2vec训练词获取词向量。 回顾下之前所说的DNN训练词向量的模...

4005

扫码关注云+社区