原创 Sobel算子(边缘检测)

2015-9-17 13:59 1981 8 14 分类: FPGA/CPLD
将学习过程记录下来,结合自己的理解,并附上代码,目的是为了使更多像我一样的初学者可以收益,少走弯路。以下是笔者总结,仅供参考,如有错误,望指正!

一.定义

Sobel算子是计算机视觉领域的一种重要处理方法。多用于图像的边缘检测
二.原理
Sobel算子利用离散的一阶差分(离散函数中连续相邻两项之差,定义X(k),则Y(k)=X(k+1)-X(k)就是此函数的一阶差分)算子,模拟图像亮度函数一阶梯度(可以近似理解为导数,具体内容自己去百度)的近似值。
一阶差分其实是一阶导数的近似,那么求边缘为什么要用到导数呢?我们先回归一下导数的概念,还记得我们第一次接触导数就在什么时候吗,老师会告诉我们,导数反映的是函数变化的快慢(大小)。图像中的每个像素点可以类比函数图像中一个个点,那么图像的导数(如果可以求导)反映的就是图像像素值的变化吗。那么变化大的(比如,连续的三个像素点从20->200->20)像素点就是所谓的边界点。而变化大小的标准可以根据实际的图像设定一个阈值。这就是为什么可以用差分算子来做边缘检测。那么该算子究竟是什么呢?
该算子包含两组3*3的矩阵,一个是x方向、一个是y方向,如下图Gx,Gy所示。利用目标图像分别与这两个算子做卷积(两个变量在某范围内相乘后求和的结果),就得到了图像亮度在x、y方向的差分近似值。
 
-1 0 1 1 2 1
-2 0 2 0 0 0
-1 0 1 -1 -2 -1
Gx Gy
三.通过一个实例来说明,并附上代码
该实例将一 200*200的灰度图像 通过 串口 发送给FPGA,调用FIFO做卷积运算,运算结果存入ram中,最后通过VGA显示出来。
首先送上实验效果
原始图像(bmp)   处理后图像
1.jpg 2.jpg

   

流程如下:
RS232   ->     FIFO    ->   SOBEL   ->   RAM   ->  VGA
具体步骤如下:
1)Matlab生成数据图像
将图像矩阵变换成1*m*n大小(m:图像行数 n:图像列数)写入txt文本,以两位十六进制(%02x)格式保存数据。
matlab代码:
5.gif
2)串口模块接收数据rx_data
串口数据是一位一位接收,接收的数据每8位保存在rx_data中,rx_data的位宽为8.
接收模块接口如下:(由于篇幅限制,这里只给出接口与内部变量)
6.gif
  
3)利用FIFO同时取图像三行,Sobel算子参与运算
7.gif
   控制FIFO的输出,使得同时控制三行数据,将每行读出的数据依次保存在a、b、c中,a、b、c组成的3*3的矩阵,我们叫做A,A与Gx,Gy分别作卷积,分别得到目标图像在Gx,Gy方向的边界。卷积公式如下:
Gx = a1-c1+(a2-c2)<<1+a3-c3;
Gy = a1-a3+(b1-b3)<<1+c1-c3;
Gxy = |Gx| + |Gy|;
Gxy表示两个方向差分绝对值的和。
Sobel主要变量的时序图(手写)
8.gif
  
4.创建一个双口ram,将Gxy保存到双口ram中
这里值得注意的是,保存到ram中的图像大小实际上是198*198(原始图像是200*200),图像周围边框没有处理。
写使能控制好拉高的时间,通过计数器来控制。
5.读出ram中的数据,并在VGA中显示
 
实验过程中出现的问题:
1.再次发送图像,图像会偏移。
观察仿真波形图发现,使能信号拉高时间错误。

 

 

文章评论6条评论)

登录后参与讨论

83642879_827020636 2015-9-28 08:13

是FPGA练习用的,我们实际项目中的图像处理算法,是在DSP上面用C写的,包括了二值化、滤波算法等等。

83642879_827020636 2015-9-26 22:29

谢谢

83642879_827020636 2015-9-26 22:27

谢谢

用户377235 2015-9-26 09:50

问一下,用到实际项目中了吗?

zcf287 2015-9-20 07:06

东莞元宝代理Microchip长电二三极管 2015-9-19 12:08

牛!
相关推荐阅读
洋仔 2023-03-07 19:51
时钟约束小练习
400m时钟使用sigma_delta算法产生(a)m的时钟使能clk_en,用来平滑156m时钟带来的vld(vld是有缺口的),然后使用400m时钟与clk_en进行时钟的2分频,产生clk_b,...
洋仔 2022-07-05 16:23
PRBS码型生成器&验证器结构
1.生成器结构2.验证器结构        PRBS Error :高电平有效,代表出错...
洋仔 2022-01-12 11:15
基于vcs+uvm+xilinx ip的仿真平台的半自动化搭建
1. 总体概述1.1软件环境   系         统:ubuntu 18.04&nbs...
洋仔 2021-12-24 09:35
Vivado仿真UVM
1.修改仿真配置在Settings->Simulation->1.1Target simulator为默认配置Vivado Simulator1.2在以下位置修改配置Compliation->xsim...
洋仔 2021-12-23 17:30
Vivado调用VCS仿真
1.编译仿真库Tools->Compile Simulation Libraries在Simulator executable path中添加vcs 仿真器可执行文件的位置2.修改仿真配置在Setti...
洋仔 2021-07-06 15:40
Vivado的一些tcl命令记录(待补充)
1.Report Clock Networks  report_clock_networks -name {network_1}2.分析设计中逻辑级数的分布  report_des...
我要评论
6
8
关闭 站长推荐上一条 /2 下一条