11.图像边缘检测的原理与实现

数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子)
数字图像处理(20): 边缘检测算子(Canny算子)

1.边缘检测介绍

1.1 边缘检测的基本原理

  边缘是图像的基本特征,所谓的边缘就是指的图像的局部不连续性。灰度或者结构等信息的突变之处称之为边缘。如灰度级的突变、颜色的突变、纹理结构的突变等。边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。
  图像的边缘有方向和幅度两种特性,边缘通常可以通过一阶导数或二阶导数检测得到。一阶导数是以最大值作为对应边缘的位置,而二阶导数则以过零点作为对应边缘的位置
  边缘检测是一种常用的图像分割技术,常用的边缘检测算子有Roberts Cross算子、Prewitt算子、Sobel算子、Kirsch算子、Laplacian算子以及Canny算子。

1.2 边缘检测算子分类

(1)一阶导数的边缘算子
  通过模版作为卷积核与图像的每个像素点做卷积运算,然后选择合适的阈值来提取图像的边缘。常用的有Roberts算子、Sobel算子和Prewitt算子。
(2)二阶导数的边缘算子
  依据与二阶导数过零点,常见的有Laplacian算子,此类算子对噪声敏感。
(3)其他边缘算子
  前面两类算子均通过微分来检测图像边缘,还有一种就是Canny算子,其就是在满足一定约束条件下推到出来的边缘检测最优化算子。

1.3 梯度

1.3.1 图像梯度

  为了达到寻找边缘的目的,检测灰度变化可用一阶导数或者二阶导数来完成。下面讨论一阶导数。
  为了在一副图像 f f f ( x , y ) (x,y) (x,y)位置处寻找边缘的强度和方向,所选择的工具就是梯度,梯度用 ∇ f \nabla f f来表示,并用向量来定义,定义如下所示:
∇ f = g r a d ( f ) = [ g x g y ] = [ ∂ f ∂ x ∂ f ∂ x ] (1) \nabla f=grad(f)=\begin{bmatrix}g_x \\g_y \end{bmatrix}=\begin{bmatrix}\frac{\partial f}{\partial x} \\ \\ \frac{\partial f}{\partial x} \end{bmatrix}\tag{1} f=grad(f)=[gxgy]= xfxf (1)
  其中,梯度 ∇ f \nabla f f为一个向量,他表示 f f f在位置 ( x , y ) (x,y) (x,y)处的最大变化率的方向。
  梯度的大小用 M ( x , y ) M(x,y) M(x,y)表示,则:
M ( x , y ) = m a g ( ∇ f ) = g x 2 + y y 2 (2) M(x,y)=mag(\nabla f)=\sqrt{g_x^2+y_y^2}\tag{2} M(x,y)=mag(f)=gx2+yy2 (2)
  其中, M ( x , y ) M(x,y) M(x,y)表示梯度向量方向变化率的值。
数学梯度的简单推导
  对于以函数 f ( x ) f(x) f(x)在点 x x x处的导数近似:将函数 f ( x + Δ x ) f(x+\Delta x) f(x+Δx)展开为 x x x的泰勒级数,令 Δ x = 1 \Delta x=1 Δx=1,且只保留该级数的线性项,则函数 f ( x ) f(x) f(x)的梯度 ∇ f \nabla f f计算为:
∇ f = ∂ f ∂ x = f ′ ( x ) = f ( x + 1 ) − f ( x ) (3) \nabla f = \frac{\partial f}{\partial x}=f^{'}(x)=f(x+1)-f(x) \tag{3} f=xf=f(x)=f(x+1)f(x)(3)

1.3.2 梯度算子

  由上面的数学推导可知,要得到一副图像的梯度,则要求图像的每一个像素点位置处计算偏导数。我们处理的是数字量,因此需要求关于一点的邻域上的偏导数的数字近似,因此一副图像 f f f,在 ( x , y ) (x,y) (x,y)位置处的 x x x y y y方向上的梯度大小 g x g_x gx g y g_y gy分别计算为:
g x = ∂ f ( x , y ) ∂ x = f ( x + 1 , y ) − f ( x , y ) g y = ∂ f ( x , y ) ∂ x = f ( x , y + 1 ) − f ( x , y ) (4) \begin{array}{c}g_x=\frac{\partial f(x,y)}{\partial x}=f(x+1,y)-f(x,y) \\ \\g_y=\frac{\partial f(x,y)}{\partial x}=f(x,y+1)-f(x,y)\end{array}\tag{4} gx=xf(x,y)=f(x+1,y)f(x,y)gy=xf(x,y)=f(x,y+1)f(x,y)(4)
  上述公式对所有 x x x y y y的有关值可用下图的一维模版对 f ( x , y ) f(x,y) f(x,y)的滤波得到。
在这里插入图片描述
  用于计算梯度偏导数的滤波器模版,通常称之为梯度算子、边缘算子和边缘检测算子等。
  对于不同的滤波器模版得到的梯度是不同的,这也就衍生出了很多算子,如Roberts、Prewitt、Sobel和Laplacian算子等。下面将详细介绍不同的算子。

2 Roberts算子

3 Prewitt算子

4 Sobel算子

4.1 基本原理

  Sobel算子是一种用于边缘检测的离散微分算子,他结合了高斯平滑和微分求导。该算子用于计算图像明暗程度近似值,根据图像边缘旁边明暗程度把该区域内超过某个数的特定点记为边缘。Sobel算子再Prewitt算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的点影响越大,从而实现图像锐化并突出边缘轮廓。
  Sobel算子根据像素点上下、左右邻点灰度的加权差,在边缘达到极值这一现象检测边缘。对噪音具有平滑作用,提供较为准确的边缘信息。因为Soble算子结合了高斯平滑和微分求导(分化),因此结果会具有较多的抗噪性,当对精度要求不高时,Sobel算子是一种较为常用的边缘检测算法。
  Soble算子的边缘定位更为准确,常用于噪声较多、灰度渐变的图像。其算法模板如下面的公式所示,其中 d x d_x dx表示水平方向, d y d_y dy表示垂直方向。
d x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] d y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] (4) d_x=\begin{bmatrix}-1 & 0 &1 \\-2 & 0 &2\\ -1 &0&1 \end{bmatrix}\qquad d_y=\begin{bmatrix}-1 & -2 &-1 \\0 & 0 &0\\ 1 &2&1 \end{bmatrix}\tag{4} dx= 121000121 dy= 101202101 (4)
  例如,下面给出Sobel算子的模板,在像素点P5处 x x x y y y方向上的梯度大小 g x g_x gx g y g_y gy分别计算为:
在这里插入图片描述
g x = ∂ f ( x , y ) ∂ x = ( P 7 + 2 P 8 + P 9 ) − ( P 1 + 2 P 2 + P 3 ) g y = ∂ f ( x , y ) ∂ x = ( P 3 + 2 P 6 + P 9 ) − ( P 1 + 2 P 4 + P 7 ) (4) \begin{array}{c}g_x=\frac{\partial f(x,y)}{\partial x}=(P7+2P8+P9)-(P1+2P2+P3) \\ \\g_y=\frac{\partial f(x,y)}{\partial x}=(P3+2P6+P9)-(P1+2P4+P7)\end{array}\tag{4} gx=xf(x,y)=(P7+2P8+P9)(P1+2P2+P3)gy=xf(x,y)=(P3+2P6+P9)(P1+2P4+P7)(4)
  图像中的每一个像素的横向以及纵向灰度值通过以下公式结合,来计算该点的灰度值大小:
G = G x 2 + G y 2 G=\sqrt{G_x^2+G_y^2} G=Gx2+Gy2
  通常为了提高效率,使用不开平方的近似值,但是这样做会损失精度,迫不得已的时候可以如下这样子:
G = ∣ G x ∣ + ∣ G y ∣ G=\mid{G_x}\mid + \mid G_y\mid G=∣Gx+Gy
  如果梯度G大于某一阈值,则认为该点 ( x , y ) (x,y) (x,y)为边缘点。

4.2 Sobel边缘检测的FPGA实现

4.3 Sobel边缘检测的MATLAB算法实现与验证

clc;
clear all ;
GRAY = imread('../img/1920X1080_gray.bmp');
[row,col] = size(GRAY);
sobel_result = zeros(row,col);
sobel_padding = zeros(row+2,col+2);x_mod = [-1,0,1;-2,0,2;-1,0,1];
y_mod = [-1,-2,-1;0,0,0;1,2,1];for i = 1:rowfor j = 1:colsobel_padding(i+1,j+1) = GRAY(i,j);end
endfor i = 1:row+2sobel_padding(i,1) = sobel_padding(i,2);sobel_padding(i,col+2) = sobel_padding(i,col+1);
endfor i = 1:col+2sobel_padding(1,i) = sobel_padding(2,i);sobel_padding(row+2,i) = sobel_padding(row+1,i);
endfor i = 2:row+1for j = 2:col+1matrix11 = sobel_padding(i-1,j-1);matrix12 = sobel_padding(i-1,j);matrix13 = sobel_padding(i-1,j+1);matrix21 = sobel_padding(i,j-1);matrix22 = sobel_padding(i,j);matrix23 = sobel_padding(i,j+1);matrix31 = sobel_padding(i+1,j-1);matrix32 = sobel_padding(i+1,j);matrix33 = sobel_padding(i+1,j+1);matrix = [matrix11,matrix12,matrix13;matrix21,matrix22,matrix23;matrix31,matrix32,matrix33];x_mult = matrix.* x_mod;y_mult = matrix.* y_mod;gx1 = sum(sum(x_mult()));gy1 = sum(sum(x_mult()));gx2 = gx1*gx1;gy2 = gy1*gy1;sobel_result(i-1,j-1) = sqrt(gx2+gy2);end
end
subplot(1,2,1)
matlab_Y = uint8(floor(sobel_result));
imshow(matlab_Y),title('MATLAB  Sobel算法图像');
subplot(1,2,2)
imshow(GRAY),title('原图像');

5 Laplacian算子

6 Canny算子

7 小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/587117.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

诡异的LISTENER本地服务问题(WINDOWS)

前因后果 win上配置oracle经常性会装server端client端。 所以经常有运维人员说win上不能使用sqlplus / as sysdba。这个根本原因是使用的sqlplus是客户端的,但是ORACLE_HOME也是客户端的,本地认证登录,ORACLE_HOME要是server端的。只需要调…

顺序表的创建

本期我们主要讨论动态顺序表 这个内容可以分为三个部分 1.创建头文件进行函数声明 2.创建源文件进行函数定义 3.创建主文件进行测试 我们先来看看头文件里的函数声明&#xff1a; 函数声明&#xff1a; 头文件中包括<stdlib.h>库函数用于进行动态内存管理&#xff0…

《QT实用小工具·八》数据库通用翻页类

1、概述 源码放在文章末尾 该项目实现数据库通用翻页类&#xff0c;主要包含如下功能&#xff1a; 1:自动按照设定的每页多少行数据分页 2:只需要传入表名/字段集合/每页行数/翻页指示按钮/文字指示标签 3:提供公共静态方法绑定字段数据到下拉框 4:建议条件字段用数字类型的主…

Micron FY24 Q2业绩强劲,凭内存实现翻盘

根据TechInsights数据显示&#xff0c;美光科技24财年第二季度业绩强劲&#xff0c;公司通过技术创新和产能优化&#xff0c;成功抓住了AI服务器和其他高性能应用带来的市场需求增长机遇。尽管短期内面临供应紧张的问题&#xff0c;但美光通过加大研发投入和产能转换力度&#…

Java8 Stream API全面解析——高效流式编程的秘诀

文章目录 什么是 Stream Api?快速入门流的操作创建流中间操作filter 过滤map 数据转换flatMap 合并流distinct 去重sorted 排序limit 限流skip 跳过peek 操作 终结操作forEach 遍历forEachOrdered 有序遍历count 统计数量min 最小值max 最大值reduce 聚合collect 收集anyMatch…

NumPy创建ndarray数组大揭秘

1.使用 np.array() 创建 使用 np.array() 由 python list 创建 n np.array(list) 注意 numpy 默认 ndarray 的所有元素的类型是相同的 如果传进来的列表中包含不同的类型&#xff0c;则统一为同一类型&#xff0c;优先级&#xff1a;str > float > int ndarray 的常…

阿赵UE学习笔记——24、动画播放控制

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。关于UE的动画系统&#xff0c;之前学习了很多&#xff0c;包括动画合成或者动画蒙太奇等&#xff0c;实际上最后得到的都是一个动画片段。那么这些动画片段&#xff0c;是需要怎样播放控制呢…

某东手势验证

地球上最强版&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 成功率99 基本不失败&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 识别速…

vmware让其他pc访问vmware中服务器的ip

端口转发 虚拟网络编辑器 nat设置 添加nat设置

图的应用试题

01&#xff0e;任何一个无向连通图的最小生成树( )。 A.有一棵或多棵 B.只有一棵 C.一定有多棵 D.可能不存在 02.用Prim算法和Kruskal算法构造图的最小生成树&#xff0c;…

vue-ueditor-wrap上传图片报错:后端配置项没有正常加载,上传插件不能正常使用

如图所示,今天接收一个项目其中富文本编辑器报错 此项目为vue2项目,富文本编辑器为直接下载好的资源存放在public目录下的 经过排查发现报错的函数在ueditor.all.min.js文件内,但是ueditor.all.min.js文件夹是经过压缩的 所以直接,将index.html中的引用路径修改为ueditor…

6.8物联网RK3399项目开发实录-驱动开发之RTC实时时钟的使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接&#xff1a;https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f RTC 使用 简介 AIO-3399J 开发板上有 一个集成于 RK808 上的RTC(Real Time Clock)&#xff0c;主要功能有时钟&#xff0c…