文章目录

  • 一、sobel边缘检测算法
    • 1.1 初识sobel边缘检测
    • 1.2 sobel原理
    • 1.3 应用
  • 二、matlab实现sobel边缘检测
  • 三、FPGA实现sobel边缘检测
    • 3.1 3*3窗口生成
    • 3.2 sobel算法模块
  • 四、modelsim仿真
  • 五、效果对比

基于均值、中值和高斯滤波等的实现,本文对sobel边缘检测进行实现。

一、sobel边缘检测算法

1.1 初识sobel边缘检测

边缘检测是特征提取中的一个研究领域,它能边缘检测出数字图像中亮度变化明显的点,减少数据量,并剔除不相关的信息,最终保留图像重要的结构属性。常用的边缘检测模板有Laplacian算子、Roberts算子、Sobel算子等。本文介绍Sobel算子。同时,Sobel 边缘检测通常带有方向性,可以只检测竖直边缘或垂直边缘或都检测。

1.2 sobel原理

1、Sobel 提供了x水平和y垂直两个方向的滤波模板。

采用上面模板对原图像A进行卷积,其中 Gx 为水平横向梯度幅值,Gy为垂直方向梯度幅值。(梯度:灰度值的变化情况,梯度幅值相当于2个相邻像素灰度值之间的差异。)
2、由Gx和Gy,计算该点的梯度幅值,公式如下:


由于公式涉及到开方运算,我们可调用IP核,也可对公式进行近似简化,以提高运算效率:

梯度方向的计算:

3、设置阈值,大于阈值的梯度值G设置黑色,也就是边缘点。(因为梯度值越大,说明变化越快)

1.3 应用

sobel边缘检测算法可在SIFT特征提取中使用。因为SIFT提取的特征点中含有边缘点,存在边缘响应的问题(不稳定的边缘点),我们即可在设置阈值,将不稳点边缘点剔除。

二、matlab实现sobel边缘检测

设置阈值:120;

clc;
clear all;
close all;RGB = imread('flower.bmp');        %读取图片
gray = double(rgb2gray(RGB));     %灰度图[ROW,COL, DIM] = size(gray);      %得到图像行列数
value = 120;                      %阈值设置
Sobel_img = zeros(ROW,COL);for r = 2:ROW-1for c = 2:COL-1Gx = gray(r-1,c+1) + 2*gray(r,c+1) + gray(r+1,c+1) - gray(r-1,c-1) - 2*gray(r,c-1) - gray(r+1,c-1);Gy = gray(r-1,c-1) + 2*gray(r-1,c) + gray(r-1,c+1) - gray(r+1,c-1) - 2*gray(r+1,c) - gray(r+1,c+1);G = abs(Gx) + abs(Gy);%G = sqrt(Gx^2 + Gy^2);if(G > value)Sobel_img(r,c)=0;elseSobel_img(r,c)=255;endend
endsubplot(2,2,1); imshow(RGB);      title('原图');
subplot(2,2,2); imshow(gray/256);title('原图');
subplot(2,2,3); imshow(Sobel_img);title('Sobel');imwrite(gray/256,'灰度图.bmp');
imwrite(Sobel_img,'sobel.bmp');

运行结果:

三、FPGA实现sobel边缘检测

注意:加入value信号,进行阈值比较。

3.1 3*3窗口生成

同高斯滤波,由于sobel边缘检测仍是33卷积运算,因此我们要生成33窗口。

3.2 sobel算法模块

流水并行处理:
第一级流水线并行:计算Gx模板左右列乘积和,计算Gy模板上下行乘积和
第二级流水并行:计算|Gx|和|Gy|——注意正负数的处理
第三级流水线:计算梯度幅值(绝对值之和),得到最终的G= |Gx| + |Gy|

组合逻辑:阈值比较(二值化)



verilog代码如下:

module sobel(input            clk,input            rst_n,input    [7:0]   value,input            iValid,input   [7:0]     sobel_11,sobel_12,sobel_13, //生成的3*3窗口数据input   [7:0]     sobel_21,sobel_22,sobel_23,input   [7:0]     sobel_31,sobel_32,sobel_33,output            sobel_de    ,//de同步信号output  wire  [7:0]    sobel_data  // sobel算子:加权平均后的值);reg [2:0]           de_shift1 ;  reg [9:0]     Gx1, Gx2 ,Gy1 ,Gy2 ,Gx,Gy;
reg [10:0]    G;
reg [7:0]     sodel;//---------------------------------------------------
//                   sobel三级流水线
//---------------------------------------------------//clk1,计算Gx模板左右列乘积和,计算Gy模板上下行乘积和always @ (posedge clk or negedge rst_n)if(!rst_n) beginGx1 <= 1'b0;Gx2 <= 1'b0;Gy1 <= 1'b0;Gy2 <= 1'b0;endelse beginGx1 <= sobel_11 + (sobel_21 << 1) + sobel_31 ;Gx2 <= sobel_13 + (sobel_23 << 1) + sobel_33 ;Gy1 <= sobel_11 + (sobel_12 << 1) + sobel_13 ;Gy2 <= sobel_31 + (sobel_32 << 1) + sobel_33 ;end//clk2,计算 |Gx|和|Gy|,正负号的处理要注意
always @ (posedge clk or negedge rst_n)if(!rst_n) beginGx <= 1'b0;Gy <= 1'b0;endelse beginGx = (Gx1 > Gx2) ? (Gx1 - Gx2) : (Gx2 - Gx1) ;Gy = (Gy1 > Gy2) ? (Gy1 - Gy2) : (Gy2 - Gy1) ;end//  clk3,计算G = |Gx|+|Gy|梯度幅值always @(posedge clk or negedge rst_n) beginif(!rst_n) beginG <= 1'd0;endelse beginG <= Gx  + Gy  ;end
end//   阈值比较
always @(*)if(G > value)sodel <= 8'b0;elsesodel <= 8'd255;assign sobel_data = sodel;// 打拍做同步
always @(posedge clk or  negedge rst_n) beginif(!rst_n)beginde_shift1   <=  3'b0;endelse beginde_shift1 <= {de_shift1[1:0], iValid};endendassign sobel_de   = de_shift1[2];endmodule

四、modelsim仿真

阈值设为120

// 实例化
sobel_top sobel_top(.clk             (clk),.rst_n           (rst_n),.iValid          (iValid),.iData           (gray),.value           (8'd120),.oValid          (oValid),.oData           (oData)
);

波形和高斯滤波等分析方式相同。

五、效果对比

原图:

Matlab实现sobel边缘检测:

FPGA实现sobel边缘检测:

FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比相关推荐

  1. 基于fpga的sobel边缘检测

    基于fpga的sobel边缘检测,部分的代码参考的是野火正点原子的代码和视频.通过matlab将图片转成txt文件,并编写verilog代码将处理好的数据再转成txt文件,同时通过matlab将txt ...

  2. FPGA实现Sobel边缘检测学习心得

    参照了野火的教程学习了Sobel边缘检测,记录过程中的思考与问题. 工程目标是由串口传入图像数据,FPGA边缘检测后,将图像经过串口传回电脑.内容涉及RS232串口协议.FIFO卷积求和. 目录 一. ...

  3. 基于FPGA简易电子琴设计+电路原理图+Modelsim 仿真+Quartus II 下载+源代码+激励文件

    一.总体电路结构设计 五大模块 按键同步输入模块 编码频率控制模块 分频计数模块 译码模块 二分频(方波)模块 二.Modelsim 仿真 同步输入仿真波形:模拟按键输入 key[3:0],经过同步输 ...

  4. 国产紫光FPGA实现DDS信号发生器(ModelSim仿真)

    简介 本文主要根据利用紫光同创软件联合ModelSim对DDS信号发生器进行仿真.前序步骤(DDS实现过程)见 国产紫光FPGA实现DDS信号发生器_窃听龙吟的博客-CSDN博客 该博客. 一.创建仿 ...

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

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

  6. Sobel边缘检测算法verilog实现及仿真

    实验verilog语言对sobel边缘检测算法进行设计 实验modelsim仿真工具进行仿真,程序和仿真截图如下图所示: 1.程序截图: 2.仿真截图: module edge_judge ( clk ...

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

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

  8. modelsim仿真正确FPGA运行不正确的可能原因 - cm4写寄存器错

    困住整整一周了,工作进行不下去,中午偶遇导师,指导意见是有两种可能: 1.  FPGA编译器优化代码,可以考虑把综合过程中所有的warning排查一下 2.  verilog里有不可综合的语句. 又及 ...

  9. FPGA配合debussy、modelsim仿真环境搭建

    FPGA配合debussy.modelsim仿真环境搭建 一.软件环境搭建 1,modelsim. 2,debussy 二.工程环境搭建 1,生成testbench 2.生成.fsdb波形文件 第一步 ...

  10. FPGA开发技巧:Modelsim仿真.do文件详细解析 原创 特权同学

    FPGA开发技巧:Modelsim仿真.do文件详细解析 原创 特权同学 FPGA快乐学习 以<FPGA边码边学 视频教程>"Lesson06 分频计数器设计"中的si ...

最新文章

  1. 网站seo不能错过这几点!
  2. js获取url中的参数值
  3. C++ Primer
  4. GO语言学习之路10
  5. spring+mybatis+log4j 输出SQL
  6. Android系统在新进程中启动自定义服务过程(startService)的原理分析
  7. linux之 sed命令
  8. linux 用户操作相关命令
  9. 中国互联网变天,小米上市后将彻底冲破 BAT 格局
  10. 【技巧记录】如何批量制作文件夹/文件夹名
  11. 微信的JS接口安全域名设置+tomcat服务器
  12. 201421410013 唐昭靖 作业1
  13. 快速排序深度优化详解
  14. Pytorch学习(二)—— nn模块
  15. 【本周Python热点回顾】画一棵漂亮的樱花树,Python3*和**运算符,Python入门,这就是Python3.8么,i了
  16. 婚恋网站能遇见幸福吗?2019互联网婚恋交友行业洞察
  17. 1个月错失百万,为什么还要感恩饿了么?
  18. maya渲染序列文件存在检测工具
  19. DTS 及其在PG 数据库生态中的应用
  20. java文字云_Canvas 3D球形文字云动画特效

热门文章

  1. 算法竞赛入门经典(刘汝佳)——常用STL数据结构总结
  2. Java界面设计GUI
  3. 基于vue的仿网易云音乐播放器
  4. Vercel部署网易云音乐api
  5. c语言考试程序设计题怎么给分,计算机程序设计C语言考试试卷及评分标准.doc
  6. 仿 qq音乐播放器 html代码,仿QQ音乐播放器
  7. 真么找计算机用户密码,如何查找电脑的用户名和密码
  8. linux手写软件,Linux 手写输入法
  9. 量子场论考试必会题目
  10. 京瓷2010打印机苹果电脑能用吗_MacOS(苹果电脑苹果系统)连接京瓷300i 打印机...