ZYNQ图像处理(7)——sobel边缘检测
一、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边缘检测相关推荐
- 图像处理中各种边缘检测的微分算子简单比较(Sobel,Robert, Prewitt,Laplacian,Canny)
图像处理中各种边缘检测的微分算子简单比较(Sobel,Robert, Prewitt,Laplacian,Canny) 不同图像灰度不同,边界处一般会有明显边缘,利用此特征可以分割图像.需要说明的是: ...
- Matlab与FPGA图像处理系列——基于FPGA的实时边缘检测系统设计,sobel边缘检测流水线实现
注:下载链接的资源是图片存 ROM 后读取进行 Sobel 检测显示在 VGA上,可供参考. 摘要:本文设计了一种基于 FPGA 的实时边缘检测系统,使用OV5640 摄像头模块获取实时的视频图像数据 ...
- 基于MATLAB的三种边缘检测数字图像处理(sobel、Marr-Hildreth、Canny)
资源下载地址:https://download.csdn.net/download/sheziqiong/85683013 资源下载地址:https://download.csdn.net/downl ...
- FPGA设计——图像处理(Sobel边缘检测)
1. 概述 本设计采用FPGA技术,实现CMOS视频图像的边缘检测(sobel),并通过以太网传输(UDP方式)给PC实时显示. 2. 硬件系统框图 CMOS采用MT9V011(30万像素),FPGA ...
- Win8Metro(C#)数字图像处理--2.12Sobel边缘检测
原文:Win8Metro(C#)数字图像处理--2.12Sobel边缘检测 [函数名称] 图像Sobel边缘检测函数SobelEdgeProcess(WriteableBitmap src) [ ...
- opencv:卷积涉及的基础概念,Sobel边缘检测代码实现及Same(相同)填充与Vaild(有效)填充
滤波 线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果. 卷积 卷积的概念: 卷积的原理与滤波类似.但是卷积却有着细小的差别. 卷积操作也是卷积核与图像对应位置的 ...
- 基于MATLAB的Sobel边缘检测算法实现
图像边缘就是图像灰度值突变的地方,也就是图像在该部分的像素值变化速度非常之快,就比如在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大. Sobel算子主要用作边缘检测,它是一离散型 ...
- 图像处理---《Canny 边缘检测》
图像处理---<Canny 边缘检测> 很想系统的把图像处理之边缘检测部分详细的过一遍,对比一个各个算子的优良性能.时间紧,精力有限,现在只能走哪补哪,随手记. 有几个简单的场景,有需要, ...
- dsp图像处理Prewitt算子边缘检测
--(完整工程文件到我的资源下载) Prewitt算子边缘检测 一.实验背景与意义 图像处理就是对信息加工以满足人的视觉心理或应用需求的方法.图像处理的方法有光学方法和电子学方法.从20世纪60年代起 ...
- OpenCV Sobel 边缘检测
Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素:当对精度要求不是很高时,是一种较为常用的边缘检测方法. OpenCV中sobe ...
最新文章
- linux cp无法创建一般文件夹,cp: 无法创建普通文件 : 文件已存在
- JavaScript原型-进阶者指南
- 三台主机分别部署LAMP
- android siri 源码,Android的SIRI 。
- Redis命令:DECR key减1操作
- 两个字符串的删除操作
- cocos2dx基础篇(29)——屏幕适配
- 经典排序算法(7)——堆排序算法详解
- C刷题记录-1020
- javaweb基于SSH开发汽车4S店管理系统(前台+后台) 课程设计 毕业设计源码
- eslint: globals
- 推荐王森的关于j2me开发的2本书!
- 【python--爬虫】千图网高清背景图片爬虫
- Kail教程(三)—私人订制(设置字体、netspeed流量监控 、文件目录)
- 记一次字段类型强转导致的死锁
- IDEA2020安装教程
- 校园招聘--网易笔试
- 京东七夕报名要注意什么?四川万顿思
- 基于ZigBee的WPAN网络配置应用
- 如何快速在一段字符串中提取想要的字符