一、sobel边缘检测的基本原理

所谓边缘是指其周围像素灰度急剧变化的那些象素的集合,它是图像最基本的特征。边缘存在于目标、背景和区域之间,所以,它是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,,因此,边缘也是图像匹配的重要的特征。边缘检测和区域划分是图像分割的两种不同的方法,二者具有相互补充的特点。在边缘检测中,是提取图像中不连续部分的特征,根据闭合的边缘确定区域。而在区 域划分中,是把图像分割成特征相同的区域,区域之间的边界就是边缘。由于边缘检测方法不需要将图像逐个像素地分割,因此更适合大图像的分割。边缘大致可以分为两种,一种是阶跃状边缘,边缘两边像素的灰度值明显不同;另一种为屋顶状边缘,边缘处于灰度值由小到大再到小的变化转折点处。边缘检测的主要工具是边缘检测模板。sobel算子是边缘检测有效的算子,主要是以下这两个矩阵,Gx=AxP,Gy=AyP。意思就是说,P矩阵是图像的3*3矩阵,然后用图像矩阵的每个像素分别去乘Ax和Ay的每个像素。Ax是行边缘检测模块,Gx代表的意思就是P矩阵右边行减去左边行,得到一个阈值,Gy也是同理。

得到了Gx和Gy之后,相当于是得到了行边缘阈值以及列边缘阈值,计算两者的平方和G,如果G是大于设定的阈值,则表示这是边缘,否则就不是。

二、sobel边缘检测的verilog实现

在对图像进行边缘检测之前需要将图像转换成灰度的,这在前面以净实现。此外,sobel边缘检测的前提同样也是需要对3×3图像矩阵进行操作,对于如何得到3×3图像的矩阵,在上一节中也实现了。接下来是实现sobel边缘检测的步骤。

2.1、计算Gx与Gy

sobel边缘检测的第一步是计算竖直方向梯度和水平方向梯度,实现的代码如下图所示。其实就是对像素进行运算,之后判断正负,然后相减得到梯度。这一步骤消耗了一个时钟周期。

//---------------------------------------------------
//              sobel edge function
//---------------------------------------------------
//          step1:calculate the Gx and Gy
//   [-1 0 1] [P1 P2 P3]    [ 1  2  1] [P1 P2 P3]
//Gx=[-2 0 2]*[P4 P5 P6] GY=[ 0  0  0]*[P4 P5 P6]
//   [-1 0 1] [P7 P8 P9]    [-1 -2 -1] [P7 P8 P9]
//a clock to finish
reg [9:0] Gx1;
reg [9:0] Gx2;
reg [9:0] Gy1;
reg [9:0] Gy2;
wire [9:0] Gx;
wire [9:0] Gy;
assign Gx=(Gx1>Gx2)? (Gx1-Gx2):(Gx2-Gx1);
assign Gy=(Gy1>Gy2)? (Gy1-Gy2):(Gy2-Gy1);
always @(posedge clk or negedge rst_n) beginif(~rst_n)beginGx1<=10'd0;Gx2<=10'd0;Gy1<=10'd0;Gy2<=10'd0;endelse beginGx1<=matrix_p11+matrix_p21+matrix_p21+matrix_p31;Gx2<=matrix_p13+matrix_p23+matrix_p23+matrix_p33;Gy1<=matrix_p11+matrix_p12+matrix_p12+matrix_p13;Gy2<=matrix_p31+matrix_p32+matrix_p32+matrix_p33;end
end

2.2、计算梯度的平方和G2

在得到了梯度后,需要计算其平方和,相关代码如下很简单,消耗一个时钟周期的时间。

//          step2:cal Gx^2 and Gy^2 and add all
//G2=Gx^2+Gy^2
//a clk delay to finish
reg [19:0] G2;
always @(posedge clk or negedge rst_n) beginif(~rst_n)beginG2<=20'd0;endelse beginG2<=Gx*Gx+Gy*Gy;end
end

2.3、计算梯度的平方根G

得到了梯度的平方和之后,需要对其开平方运算,开平方运算这里使用到了vivado的一个ip核cordic。相关的配置信息如下图所示。一个比较关键的信息是latency延迟了6个周期。


创建好了开平方模块后,对其进行例化操作,如下所示。

//          step3:cal sqrt G
//G=sqrt(G2)
//input width 20
//output width 11
//delay 6 clk
wire [10:0] G;
wire dout_valid;
cordic_0 u_cordic_0 (.aclk(clk),                                      .aresetn(rst_n),                               .s_axis_cartesian_tvalid(1'b1),  .s_axis_cartesian_tdata(G2),    .m_axis_dout_tvalid(dout_valid),           .m_axis_dout_tdata(G)
);

2.4、根据阈值判断输出

在得到了梯度G之后,通过G与阈值进行比较,当G大于阈值那么输出1,当G小于阈值则输出0。代码如下,消耗了一个时钟周期。

//          step4:compare with threshold data
//if G<SOBEL_THRESHOLD then 0
//if G>SOBEL_THRESHOLD then 1
//a clk to finish
reg data_sobel;
parameter SOBEL_THRESHOLD=8'd50;
always @(posedge clk or negedge rst_n) beginif(~rst_n)begindata_sobel<=1'b0;endelse beginif(G>SOBEL_THRESHOLD)begindata_sobel<=1'b1;endelse data_sobel<=1'b0;end
end

2.5、信号同步

由于完成整个sobel边缘检测消耗了10个时钟周期,因此,这里将其延迟了9拍来做信号的同步。

//-----------------------------
//   signal synchronization
//-----------------------------
always @(posedge clk or negedge rst_n) beginif(~rst_n)beginpost_clken_dy<=9'd0;post_href_dy<=9'd0;post_vsync_dy<=9'd0;endelse beginpost_clken_dy<={post_clken_dy[7:0],matrix_frame_clken};post_href_dy<={post_href_dy[7:0],matrix_frame_href};post_vsync_dy<={post_vsync_dy[7:0],matrix_frame_vsync};end
endassign post_clken=post_clken_dy[8];
assign post_href=post_href_dy[8];
assign post_vsync=post_vsync_dy[8];
assign post_data={24{data_sobel}};

三、sobel边缘检测的仿真验证

下面这张图是sobel边缘检测的仿真图,左边上面是当前周期的3×3图像矩阵,然后一个时钟周期后计算得到Gx1=773、Gx2=885、Gy1=543以及Gy2=1019。之后Gx=112和Gy=476同步得到。在一个时钟周期之后,梯度平方和G2=239120被得到。之后在经过6个周期后,平方根G=488被得到。可见,sobel边缘检测代码是对的。

下图给出了sobel边缘检测前的图和之后的图。可以看到,仿真结果成功提取了图片的边缘信息。通信行程卡居然提示违规hhh,只好纯色填充了。

三、sobel边缘检测的上板验证

相关的block design如下图所示,只是在原来的灰度显示基础上添加了sobel边缘检测模块。之后进行综合布局布线生成比特流文件。验证结果表明可以检测图片的边缘。后期我会整理下代码然后开源这部分的vivado工程和代码。

ZYNQ图像处理(7)——sobel边缘检测相关推荐

  1. 图像处理中各种边缘检测的微分算子简单比较(Sobel,Robert, Prewitt,Laplacian,Canny)

    图像处理中各种边缘检测的微分算子简单比较(Sobel,Robert, Prewitt,Laplacian,Canny) 不同图像灰度不同,边界处一般会有明显边缘,利用此特征可以分割图像.需要说明的是: ...

  2. Matlab与FPGA图像处理系列——基于FPGA的实时边缘检测系统设计,sobel边缘检测流水线实现

    注:下载链接的资源是图片存 ROM 后读取进行 Sobel 检测显示在 VGA上,可供参考. 摘要:本文设计了一种基于 FPGA 的实时边缘检测系统,使用OV5640 摄像头模块获取实时的视频图像数据 ...

  3. 基于MATLAB的三种边缘检测数字图像处理(sobel、Marr-Hildreth、Canny)

    资源下载地址:https://download.csdn.net/download/sheziqiong/85683013 资源下载地址:https://download.csdn.net/downl ...

  4. FPGA设计——图像处理(Sobel边缘检测)

    1. 概述 本设计采用FPGA技术,实现CMOS视频图像的边缘检测(sobel),并通过以太网传输(UDP方式)给PC实时显示. 2. 硬件系统框图 CMOS采用MT9V011(30万像素),FPGA ...

  5. Win8Metro(C#)数字图像处理--2.12Sobel边缘检测

    原文:Win8Metro(C#)数字图像处理--2.12Sobel边缘检测  [函数名称] 图像Sobel边缘检测函数SobelEdgeProcess(WriteableBitmap src) [ ...

  6. opencv:卷积涉及的基础概念,Sobel边缘检测代码实现及Same(相同)填充与Vaild(有效)填充

    滤波 线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果. 卷积 卷积的概念: 卷积的原理与滤波类似.但是卷积却有着细小的差别. 卷积操作也是卷积核与图像对应位置的 ...

  7. 基于MATLAB的Sobel边缘检测算法实现

    图像边缘就是图像灰度值突变的地方,也就是图像在该部分的像素值变化速度非常之快,就比如在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大. Sobel算子主要用作边缘检测,它是一离散型 ...

  8. 图像处理---《Canny 边缘检测》

    图像处理---<Canny 边缘检测> 很想系统的把图像处理之边缘检测部分详细的过一遍,对比一个各个算子的优良性能.时间紧,精力有限,现在只能走哪补哪,随手记. 有几个简单的场景,有需要, ...

  9. dsp图像处理Prewitt算子边缘检测

    --(完整工程文件到我的资源下载) Prewitt算子边缘检测 一.实验背景与意义 图像处理就是对信息加工以满足人的视觉心理或应用需求的方法.图像处理的方法有光学方法和电子学方法.从20世纪60年代起 ...

  10. OpenCV Sobel 边缘检测

    Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素:当对精度要求不是很高时,是一种较为常用的边缘检测方法. OpenCV中sobe ...

最新文章

  1. linux cp无法创建一般文件夹,cp: 无法创建普通文件 : 文件已存在
  2. JavaScript原型-进阶者指南
  3. 三台主机分别部署LAMP
  4. android siri 源码,Android的SIRI 。
  5. Redis命令:DECR key减1操作
  6. 两个字符串的删除操作
  7. cocos2dx基础篇(29)——屏幕适配
  8. 经典排序算法(7)——堆排序算法详解
  9. C刷题记录-1020
  10. javaweb基于SSH开发汽车4S店管理系统(前台+后台) 课程设计 毕业设计源码
  11. eslint: globals
  12. 推荐王森的关于j2me开发的2本书!
  13. 【python--爬虫】千图网高清背景图片爬虫
  14. Kail教程(三)—私人订制(设置字体、netspeed流量监控 、文件目录)
  15. 记一次字段类型强转导致的死锁
  16. IDEA2020安装教程
  17. 校园招聘--网易笔试
  18. 京东七夕报名要注意什么?四川万顿思
  19. 基于ZigBee的WPAN网络配置应用
  20. 如何快速在一段字符串中提取想要的字符

热门文章

  1. FC SAN、IP SAN、IB SAN
  2. 第1章 iFIX概述
  3. 腾讯信鸽推送,部分手机不能接收到推送弹窗
  4. 小程序场景二维码扫码
  5. 作为公共组软件工程师如何工作
  6. Vue uniapp省份城市列表选择、省市选择
  7. 量子计算机王,王正汉|量子计算机:下一轮工业革命的引擎
  8. 有源滤波器matlab/simulink 采用simulink搭建有源滤波器模型,有操作视频和报告资料,运行稳定,效果显著
  9. oracle的dbv命令,Oracle的DBV命令行工具用法详解
  10. window10 tar解压