1.1 边缘检测算法介绍

所谓边缘是指其周围像素灰度急剧变化的那些象素的集合,它是图像最基本的特征。边缘存在于目标、背景和区域之间,所以,它是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感, ,因此,边缘也是图像匹配的重要的特征。

边缘检测和区域划分是图像分割的两种不同的方法,二者具有相互补充的特点。在边缘检测中,是提取图像中不连续部分的特征,根据闭合的边缘确定区域。而在区域划分中,是把图像分割成特征相同的区域,区域之间的边界就是边缘。由于边缘检测方法不需要将图像逐个像素地分割,因此更适合大图像的分割。边缘大致可以分为两种,一种是阶跃状边缘,边缘两边像素的灰度值明显不同;另一种为屋顶状边缘,边缘处于灰度值由小到大再到小的变化转折点处。边缘检测的主要工具是边缘检测模板。

边缘检测的有很多,典型的有索贝尔算子,普里维特算子,罗伯茨交叉边缘检测等边缘检测技术,在 Matlab 中有现成的 IPT 函数,提供边缘检测,如下:

Sobel边缘检测:

PlayBoy

subplot(1,3,1)

imshow(IMG1);

title('原图像');

IMG1 = rgb2gray(IMG1);

[m,n] = size(IMG1); %用Sobel微分算子进行边缘检测

IMG2 = edge(IMG1,'sobel');

subplot(1,3,2);

imshow(IMG2);

title('Sobel边缘检测得到的图像');

图8‑1Matlab中Sobel算法

但效果不佳,灵活性也不高,同时性能太低了啊!

1.2 Sobel边缘检测算法研究

所谓的Sobel算法,就是将得到像素点乘以一个3*3矩阵(Sobel算子)得到一个该点的灰度矢量值或者其法矢量值。

所以整个算法的核心就是Sobel算子,下面简单介绍下该算子。

索贝尔算子(Sobel operator)主要用作边缘检测, 在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。

Sobel 卷积因子为:

图8‑2 Sobel卷积因子

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以 A 代表原始图像, Gx 及 Gy 分别代表经横向及纵向边缘检测的图像灰度值,其公式如下:

图8‑3公式

图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:

图8‑4公式

通常,为了提高效率使用不开平方的近似值,但这样做会损失精度,迫不得已的时候可以如下这样子:

图8‑5公式

如果梯度 G 大于某一阀值 则认为该点(x,y)为边缘点。

if(temp3 > THRESHOLD)

IMG_Sobel(i,j) = 0;%Black

else

IMG_Sobel(i,j) = 255;%White

end

然后可用以下公式计算梯度方向(当然只要检测边缘,则不用计算方向):

图8‑6公式

通过以上分析,可以知道,横向及纵向边缘检测的图像灰度值(Gx、Gy)是必须获取得,但是该点灰度的大小时可以通过准确的计算或者近似计算获取,所以接下来针对该问题,简单介绍两个方式的实现。

1.3 Sobel边缘检测算法的 HDL 实现第一、二步

FPGA

中针对以上矩阵进行算法移植。由于直接计算会因为负值而得到错误的结果,用补码表示比较繁琐,需要用到

unsigned

以及

signed

类型,不适合

FPGA

的运算。

前面 Sobel 算子的实现, 为了实现 FPGA 的加速运算, 发挥并行流水线的特性,可以划分为 4 个步骤, 解析与实现分别如下:

(1) 计算计算 Gx与 Gy与模板每行的乘积;

(2) 求得 3*3 模板运算后的 Gx、 Gy;

(3) 求得 Gx^2+Gy^2 的结果, 及 Gx 与 Gy 的平方和;

(4) 求得 Gx^2+Gy^2 的平方根。

或者

(1) 计算计算 Gx与 Gy与模板每行的乘积;

(2) 求得 3*3 模板运算后的 Gx、 Gy;

(3) 求得|Gx|+|Gy| 的结果。

其中(1)(2)步分析如下:

图8‑7计算Gx、Gy运算

懂一点矩阵运算的就知道,Gx方向算子乘以像素值,等于矩阵中每一个值乘以像素值后相加,所以可以将上诉方法利用上图中方式进行运算,其中中间的零值可以不计算。具体看下代码:

代码8‑1 3*3 模板运算后的 Gx、 Gy

1.//Add you arithmetic here

2.//----------------------------------------------------------------------------

3.//----------------------------------------------------------------------------

4.//----------------------------------------------------------------------------

5.//-------------------------------------------

6.//Sobel Parameter

7.//         Gx                  Gy                 Pixel

8.// [   -1  0   +1  ]   [   +1  +2   +1 ]     [   P11  P12   P13 ]

9.// [   -2  0   +2  ]   [   0   0    0  ]     [   P21  P22   P23 ]

10.// [   -1  0   +1  ]   [   -1  -2   -1 ]     [   P31  P32   P33 ]

11.

12.// localparam   P11 = 8'd15,    P12 = 8'd94,    P13 = 8'd136;

13.// localparam   P21 = 8'd31,    P22 = 8'd127,   P23 = 8'd231;

14.// localparam   P31 = 8'd44,    P32 = 8'd181,   P33 = 8'd249;

15.//Caculate horizontal Grade with |abs|

16.//Step 1-2

17.reg [9:0]   Gx_temp1;//postive result

18.reg [9:0]   Gx_temp2;//negetive result

19.reg [9:0]   Gx_data;//Horizontal grade data

20.always@(posedge clk or negedge rst_n)

21.begin

22.if(!rst_n)

23.begin

24.Gx_temp1 <= 0;

25.Gx_temp2 <= 0;

26.Gx_data <= 0;

27.end

28.else

29.begin

30.Gx_temp1 <= matrix_p13 + (matrix_p23 <

31.Gx_temp2 <= matrix_p11 + (matrix_p21 <

32.Gx_data <= (Gx_temp1 >= Gx_temp2) ? Gx_temp1 - Gx_temp2 : Gx_temp2 - Gx_temp1;

33.end

34.end

35.

36.//---------------------------------------

37.//Caculate vertical Grade with |abs|

38.//Step 1-2

39.reg [9:0]   Gy_temp1;//postive result

40.reg [9:0]   Gy_temp2;//negetive result

41.reg [9:0]   Gy_data;//Vertical grade data

42.always@(posedge clk or negedge rst_n)

43.begin

44.if(!rst_n)

45.begin

46.Gy_temp1 <= 0;

47.Gy_temp2 <= 0;

48.Gy_data <= 0;

49.end

50.else

51.begin

52.Gy_temp1 <= matrix_p11 + (matrix_p12 <

53.Gy_temp2 <= matrix_p31 + (matrix_p32 <

54.Gy_data <= (Gy_temp1 >= Gy_temp2) ? Gy_temp1 - Gy_temp2 : Gy_temp2 - Gy_temp1;

55.end

56.end

前面两步其实很好理解,主要第三步(

32

行、

54

行),这一步主要原因就是

FPGA

无法进行负数运算,所以将上两步计算结果进行取绝对值,实际上这不影响最后得结果,因为后面无论进行平方操作或者取绝对值操作结果都是相同的。

最近搞了一个小程序,主要方便大家搜索相关资料,同时为了填补之前的坑,现在小程序还不完善,大家有兴趣可以关注,后续公众号内的资料都可以通过小程序获取,谢谢大家支持

matlab差分算子的灰度图像边缘检测,灰度图像的 Sobel 边缘检测算法的 HDL实现(一)...相关推荐

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

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

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

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

  3. 6.Matlab如何将彩色图像转换为灰度图像

    6.Matlab如何将彩色图像转换为灰度图像 声明:本文转自jamin_liu_91.的文章 1.在数字图像中,彩色图像->灰色图像,一般有以下三种方式: 2.下面就以上三种方式,利用Matla ...

  4. OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器

    OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此 ...

  5. OpenCV/CUDA—Sobel边缘检测

    一.OpenCV-Sobel边缘检测 #include <opencv2/opencv.hpp> #include <math.h> #include <iostream ...

  6. OpenCV边缘检测(二)——Sobel边缘检测

    Sobel边缘检测是一种常用的基于图像梯度的边缘检测算法,它可以有效地检测出图像中的边缘.该算法通过对图像中每个像素应用Sobel算子来计算其在水平和垂直方向上的梯度值,然后将两个梯度值合并成一个值, ...

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

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

  8. Sobel边缘检测算法及OpenCV函数实现

    转自https://www.cnblogs.com/herenzhiming/articles/6526741.html  https://blog.csdn.net/qaz_wz/article/d ...

  9. 【8】python-opencv3教程:边缘检测(Roberts算子边缘检测,Prewitt算子边缘检测,Sobel算子边缘检测)

    第八节:边缘检测 边缘检测:边缘检测指的是灰度值发生急剧变化的位置,边缘检测的目的是制作一个线图,在不会损害理解图像内容的情况下, 有大大减少了图像的数据量,提供了对图像数据的合适概述. 一:Robe ...

最新文章

  1. 2016多校赛2 A 数学推公式 E 极角排序,组合数(待补) L dp+bitset优化
  2. 学习笔记(二)——CSS基础
  3. ASP.NET Core 查看应用状态和统计
  4. JavaScript中的Boolean 方法与Number方法
  5. Hey,微信广告收到了吗?你哪个阶层的?
  6. 参数估计:文本分析的参数估计方法
  7. 好险!一入职,就遇到MySQL这么大Bug!差点背锅走人~
  8. matlab 改变图片比例尺,ps修改图片尺寸和比例尺方法图解
  9. TypeScript 学习笔记(四)--- 泛型(Generics)
  10. 支持5G WIFI的串口服务器
  11. linux和win10文件共享smb,Windows 10 Samba文件共享的设置方法,解决不能访问和密码错误的问题...
  12. 全国计算机等级考试技巧,全国计算机等级考试二级复习指导及应试技巧
  13. HaaS EDU物联网项目实战:微信小程序实现云养花
  14. Windows 8 客户端预览版(Consumer Preview)抢先体验
  15. HTML中placeholder用法
  16. C语言-输出* 图形 ** *** **** *****
  17. 【来灌灌水】~~感谢csdn平台给予新手学习的地方
  18. Java“白皮书”的关键术语
  19. Microsoft word “很抱歉,无法打开xxx.docx,因为内容有问题” 的解决办法
  20. JOG是什么运动方式

热门文章

  1. 微信骗子 QQ7492593 电话 18627650031 这个骗子骗我4000块钱
  2. 金蝶K3cloud python插件之更新物料列表自定义字段(成本更新)
  3. Red Giant Trapcode Suite,Mac红巨星粒子插件
  4. 如何快速识别提取图片上的文字
  5. 小程序tabbar能放分包路径吗_微信小程序底部导航Tabbar
  6. windows编译opencv opencv-contrib
  7. 基于web得数字媒体资源库系统
  8. LINGO求解规划问题代码
  9. pip安装wxpython报错traceback_使用源码编译wxpython-基于python2.7
  10. pytest和ddt