ZYNQ图像处理(7)——sobel边缘检测

这篇具有很好参考价值的文章主要介绍了ZYNQ图像处理(7)——sobel边缘检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

二、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) begin
    if(~rst_n)begin
        Gx1<=10'd0;
        Gx2<=10'd0;
        Gy1<=10'd0;
        Gy2<=10'd0;
    end
    else begin
      Gx1<=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) begin
    if(~rst_n)begin
      G2<=20'd0;
    end
    else begin
      G2<=Gx*Gx+Gy*Gy;
    end
end

2.3、计算梯度的平方根G

得到了梯度的平方和之后,需要对其开平方运算,开平方运算这里使用到了vivado的一个ip核cordic。相关的配置信息如下图所示。一个比较关键的信息是latency延迟了6个周期。
ZYNQ图像处理(7)——sobel边缘检测
ZYNQ图像处理(7)——sobel边缘检测
创建好了开平方模块后,对其进行例化操作,如下所示。

//          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) begin
    if(~rst_n)begin
      data_sobel<=1'b0;
    end
    else begin
      if(G>SOBEL_THRESHOLD)begin
        data_sobel<=1'b1;
      end
      else data_sobel<=1'b0;
    end
end

2.5、信号同步

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

//-----------------------------
//   signal synchronization
//-----------------------------
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)begin
      post_clken_dy<=9'd0;
      post_href_dy<=9'd0;
      post_vsync_dy<=9'd0;
    end
    else begin
      post_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
end

assign 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边缘检测代码是对的。
ZYNQ图像处理(7)——sobel边缘检测
下图给出了sobel边缘检测前的图和之后的图。可以看到,仿真结果成功提取了图片的边缘信息。通信行程卡居然提示违规hhh,只好纯色填充了。
ZYNQ图像处理(7)——sobel边缘检测
ZYNQ图像处理(7)——sobel边缘检测

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

相关的block design如下图所示,只是在原来的灰度显示基础上添加了sobel边缘检测模块。之后进行综合布局布线生成比特流文件。验证结果表明可以检测图片的边缘。后期我会整理下代码然后开源这部分的vivado工程和代码。
ZYNQ图像处理(7)——sobel边缘检测
ZYNQ图像处理(7)——sobel边缘检测文章来源地址https://www.toymoban.com/news/detail-454817.html

到了这里,关于ZYNQ图像处理(7)——sobel边缘检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】【图像处理】均值滤波 and 高斯滤波 and 中值滤波 and Sobel算子边缘提取(低通滤波)算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)

     中值滤波: 中值滤波中的MidValueFind函数的实现就是冒泡排序,最后去中间值返回:  Soble算子边缘提取:     总结: 1、均值、高斯滤波和Sobel算子边缘提取的核心,创建卷积核并确定各个点上的权重,然后将边缘灰度级归零(是否边缘归零按业务需求决定),提取非边缘像

    2024年02月05日
    浏览(55)
  • 【C++】【图像处理】均值滤波 and 高斯滤波 and 中值滤波 (低通滤波器)and Sobel算子边缘提取算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)

     中值滤波: 中值滤波中的MidValueFind函数的实现就是冒泡排序,最后去中间值返回:  Soble算子边缘提取:     总结: 1、均值、高斯滤波和Sobel算子边缘提取的核心,创建卷积核并确定各个点上的权重,然后将边缘灰度级归零(是否边缘归零按业务需求决定),提取非边缘像

    2024年02月05日
    浏览(54)
  • 图像处理:边缘检测原理

    很抱歉,前面推导三种边缘检测算子我不是很满意就发出去了,现在以我的知识储备看他们还是有着很大的问题,我潜下心的找资料,看视频,就是为了将我的基础打牢,所以,我在这一篇当中好好的抠细节,毕竟从实际的应用上来说,这是我的学习笔记,再怎么也不能糊弄

    2024年02月06日
    浏览(48)
  • 【数字图像处理】边缘检测

    边缘检测是一种图像处理技术,旨在标识和定位数字图像中的边缘和轮廓。 边缘是图像中灰度值变化明显的位置 ,通常是物体的边缘或表面的变化。通过边缘检测算法,可以将图像中的物体和背景分离出来,从而实现目标检测、图像分割、计算机视觉和机器人视觉等应用。

    2024年02月02日
    浏览(42)
  • 数字图像处理:图像分割——边缘检测与区域分割

    1.图像分割:根据图像的某些局部特征(灰度级、纹理、彩色或统计特征等)的相似性和互斥性,将图像分割成若干子区域,在每个子区域内部具有相似(相同或相近)特性,而相邻子区域的特性互斥。所以图像分割是利用图像局部特征的相似性和互斥性。 2.图像分割方法分

    2024年02月05日
    浏览(40)
  • 图像处理——边缘检测(MATLAB实现)

    实验表明,人眼对图像中边缘的识别不是通过设置阈值来分割的,目标的边缘一般表现为灰度(对彩色图像还包括色度)的特变。对于人类的视觉感知,图像边缘对理解图像内容起到关键作用。在灰度渐变的图像中无法区分其灰度变化的边界,但如果边界灰度有突变,则可以区

    2024年02月03日
    浏览(39)
  • 【图像处理】基于matlab蚁群聚类图像边缘检测

    目录 基于matlab蚁群聚类图像边缘检测 蚁群聚类是一种模拟自然界中蚂蚁群体行为的算法,常用于解决优化问题。该算法可以用于图像处理中的边缘检测。下面给出一个基于MATLAB的蚁群聚类图像边缘检测的示例代码。 我们首先读入待处理图像,并将其转换为灰度图像。然后,

    2023年04月22日
    浏览(49)
  • 图像处理之梯度及边缘检测算子

    梯度是一个量变化的速度,在数学中通常使用求导、求偏导获取梯度或者某一方向上的梯度。 在数字图像中梯度可以看为像素值分别在x,y方向上的变化速度,因为数字图像的离散型,以及像素是最小处理单元的特性,求数字图像的梯度时,不需要求导,只需要进行加减运算即

    2024年02月16日
    浏览(41)
  • 基于ZYNQ的OV5640摄像头的sobel算子边缘检测

    最近鸽了挺久的,因为最近要做课设,再加上被这个工程的调试给难到了。 在做该工程的时候,有一个良好的项目管理习惯会让开发的时候不会让人那么的高血压。 特别要注意的是,异步FIFO的读写时钟的速率匹配问题,这个问题卡了我好久。 Sobel 算法是像素图像边缘检测中

    2024年01月20日
    浏览(42)
  • 图像处理技术:数字图像分割 ------ 图像分割、边界分割(边缘检测)、区域分割

    是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分 成若干个互不相交的区域,使得这些特征在同一区域内表现出一致 性或相似性,而在不同区域间表现出明显的不同 分割出来的区域应该同时满足:  (1)分割出来的图像区域的均匀性和连通性。 • 均匀性是指该

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包