matlab图像边缘检测分析

更多MATLAB图像处理视频请点击  http://study.163.com/course/courseMain.htm?courseId=1003594013     

所谓边缘是指其周围像素灰度有变化的那些像素的集合。边缘广泛存在于物体与背景之间、物体与物体之间、基元与基元之间。物体的边缘是由灰度不连续所反映的。基于边缘的分割代表了一大类基于图像边缘信息的方法,常用于图像分割。

更多MATLAB图像处理视频请点击  http://study.163.com/course/courseMain.htm?courseId=1003594013


1.边缘检测的基本原理及常用边缘检测算子

边缘检测的实质是采用某种算法来提取出图像中对象与背景间的交界线。我们将边缘定义为图像中灰度发生急剧变化的区域边界。图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此我们可以用局部图像微分技术来获得边缘检测算子。经典的边缘检测方法是对原始图像中像素的某小邻域来构造边缘检测算子。以下是对几种经典的边缘检测算子进行理论分析,并对各自的性能特点做出了比较和评价。


人们以这些理论为依据,提出了许多算法,其中比较常用的边缘检测方法有差分边缘检测、Roberts 边缘检测算子、Sobel 边缘检测算子、Prewitt 边缘检测算子、Robinson 边缘检测算子、Laplace 边缘检测算子、Canny 算子和 LOG 算子等等。

(1)差分边缘检测方法

         利用像素灰度的一阶导数算子在灰度迅速变化处得到高值来进行奇异点的检测。它在某一点的值就代表该点的“边缘强度”,可以通过对这些值设置阈值来进一步得到边缘图像。然而,用差分检测边缘必须使差分的方向与边缘方向垂直,这就需要对图像的不同方向都进行差分运算,增加了实际运算的繁琐性。

 一般为垂直边缘、水平边缘、对角线边缘检测,如下所示:

 


差分边缘检测方法是最原始、最基本的方法。根据灰度迅速变化处一阶导数达到最大(阶跃边缘情况)原理,要求差分方向与边缘方向垂直,利用导数算子检测边缘。这种算子具有方向性,运算繁琐,目前很少采用。


(2)Roberts 边缘检测算子

     Roberts 边缘检测算子根据任意一对互相垂直方向上的差分可用来计算梯度的原理,采用对角线方向相邻两像素之差,即:

   

        适当选取门限 TH,并作如下判断:如果 R(i, j)>TH,则(i, j)为阶跃状边缘点,{R(i, j)}为边缘图像。
       Roberts 算子采用对角线方向相邻两像素之差近似梯度幅值检测边缘。检测水平和垂直边缘的效果好于斜向边缘,定位精度高,但对噪声敏感。

(3)Sobel 边缘检测算子

     数字图像{f (i, j)}的每个像素,考察它上下左右邻点灰度的加权差,与之接近的邻点的权大。据此,定义 Sobel 算子如下:

 

           适当选取门限 TH,并作如下判断:如果 R(i, j)>TH,则(i, j)为阶跃状边缘点,{R(i, j)}为边缘图像。
          Sobel 算子很容易在空间上实现,Sobel 边缘检测器不但产生较好的边缘检测效果,而且受噪声的影响也比较小。当使用大的邻域时,抗噪性能会更好,但这样会增加计算量,并且得出的边缘也会相应变粗。
           Sobel 算子利用像素点上下、左右邻点的灰度加权算法,根据在边缘点处达到极值这一现象进行边缘的检测。Sobel 算子对噪声具有平滑作用,提供较为精确的边缘方向信息,但它同时也会检测出许多伪边缘,边缘定位精度不够高。当对精度要求不是很高时,它是一种较为常用的边缘检测方法。


(4)Prewitt 边缘检测算子

         Prewitt 边缘检测算子是一种边缘样板算子。这些算子样板由理想的边缘子图像构成。依次用边缘样板去检测图像,与被检测区域最为相似的样板给出最大值。用这个最大值作为算子的输出值 P(i, j),这样可将边缘像素检测出来。

     定义 Prewitt 边缘检测算子模板如下:

   

8个算子样板所对应的边缘方向如图 所示。适当选取门限 TH,并作如下判断:如果 P(i,j)>TH,则(i,j)为阶跃状边缘点,{P(i,j)}为边缘图像。



(5)Robinson 边缘检测算子

     Robinson 边缘检测算子也是一种边缘样板算子,其算法和 Prewitt 边缘检测算子相似,只是 8 个样板不同,如图所示。


(6)Laplace 边缘检测算子

     Laplace 边缘检测算子是一种二阶微分算子,对于数字图像{ f (i,j)},它在图像中的位置(i,j)的 Laplace 定义如下:

             Laplace 边缘检测算子是无方向性的算子,它比前面所述的多个方向导数算子的计算量要小,因为只用一个模板,且不必综合各模板的值。计算数字图像的 Laplace 值也是借助各种模板卷积实现的。实现 Laplace 运算的几种模板可见下图。在数字图像中,可用差分来近似微分运算,若选用图 7-4 中的第一个检测模板,则 f (i,j)的 Laplace 算子为:

几种常用的实现 Laplace 运算的检测模板如图所示。


         由于 Laplace 算子是一种二阶导数算子,对图像中的噪声相当敏感。另外它常产生双像素宽的边缘,且也不能提供边缘方向的信息。由于以上原因,Laplace 算子很少直接用于检测边缘,而主要用于已知边缘像素后确定该像素是在图像的暗区或明区一边。



2.各种边缘检测算子的 MATLAB 实现及效果比较

在 MATLAB 中可以由 edge 函数实现各算子对边缘的检测,以 Roberts 算子为例,其语法格式如下:

     BW=edge(I,’roberts’)
     BW=edge(I,‘roberts’,thresh)
     [BW,thresh]=edge(I,‘roberts’,⋯)
     BW=edge(I,‘roberts’)自动选择阈值用 Robert 算子进行边缘检测。
     BW=edge(I,‘roberts’,thresh)根据所指定的敏感阈值 thresh 用 Robert 算子进行边缘检测,它忽略了所有小于阈值的边缘。当 thresh 为空时,自动选择阈值

     [BW,thresh]=edge(I,‘roberts’,⋯)返回阈值。

     edge 函数对灰度图像 I 进行边缘检测,返回与 I 同样大的二值图像 BW,其中 1 表示边缘,0 表示非边缘。I 是 unit8 型、unit16 型,或者是 double 型,BW 是 unit8 型。

     其余 Sobel 算子、Prewitt 算子、LOG 算子、Canny 算子的实现仅需将‘roberts’用‘sobel’、‘prewitt’、‘log’、‘canny’代替即可。

例:具体实现这几个算子的一个例程

I=imread('cameraman.tif');
BW1 = edge(I,'sobel'); %应用 Sobel 算子进行滤波
BW2 = edge(I,'roberts'); %应用 Roberts 算子进行滤波
BW3 = edge(I,'prewitt'); %应用 Prewitt 算子进行滤波
BW4 = edge(I,'log'); %应用 LOG 算子进行滤波
BW5 = edge(I,'canny'); %应用 Canny 算子进行滤波
subplot(2,3,1),imshow(I),title('原图');
>> subplot(2,3,2),imshow(BW1),title('Sobel算子边缘检测');
>> subplot(2,3,3),imshow(BW2),title('Roberts算子');
>> subplot(2,3,4),imshow(BW3),title('Priwitt算子');
>> subplot(2,3,5),imshow(BW4),title('LOG算子');
>> subplot(2,3,6),imshow(BW5),title('Canny算子');


更多MATLAB图像处理视频请点击  http://study.163.com/course/courseMain.htm?courseId=1003594013


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

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

相关文章

python可以实现哪些功能_Python中实现机器学习功能的四种方法介绍

本篇文章给大家带来的内容是关于Python中实现机器学习功能的四种方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在本文中,我们将介绍从数据集中选择要素的不同方法; 并使用Scikit-learn(skl…

Nature子刊批判人工神经网络:先天结构比后天训练更重要,应该借鉴动物大脑...

来源:凹非寺人工神经网络可以从动物大脑中学到什么?最新一期Nature子刊上,就刊登了这样一篇文章。美国冷泉港实验室的神经科学家Anthony M. Zador,对当下人工神经网络的研究思路进行了深刻反思与批判:大多数动物行为不…

C++初始化vector<vector<int>>

假设dps是一个mn维的vector&#xff0c;则初始化dps为全零的方法为&#xff1a; vector<vector<int>> dps(m, vector<int>(n,0));

matlab的傅里叶变换

更多MATLAB图像处理视频请点击 http://study.163.com/course/courseMain.htm?courseId1003594013 图像变换&#xff1a; 更多MATLAB图像处理视频请点击 http://study.163.com/course/courseMain.htm?courseId1003594013 在 MATLAB 中&#xff0c;一般用二元函数…

python在另一个函数中使用其他函数的变量_在另一个函数中访问函数的变量,如function() . var in python...

我在寻找一种正确的方法来访问另一个函数中的函数变量时遇到了一些问题 . 我正在制作远程操作类工具&#xff0c;因此我需要处理接收的命令[如exit或nircmdc.exe或telnet等] . 下面的代码不完整&#xff0c;但它是核心&#xff1a; def regular(): global data datac.recv(1024…

笔记一 Redis基础

在cmd 命令中运行redis 运行redis命令 &#xff1a;redis-cli Reids数据结构初探 数据结构有五种 string(字符串)、 list(列表)、set&#xff08;集合&#xff09;、hash&#xff08;散列&#xff09;、zset(有序集合) redis各类型的简单介绍 和最基础的命令 1.string&a…

C++获取指向二维数组的首元素指针

假设一个二维数组int a[][4] { { 3, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };&#xff0c;获取指向其首个元素&#xff08;即3&#xff09;的指针方法为&#xff1a; int*pa[0]&a[0][0]*a; 说明&#xff1a; &#xff08;1&#xff09;二维…

matlab的四维图像数据可视化

1.颜色来表示第四维 前面已经学了三维图形可视化&#xff0c;所谓三维就是指x轴&#xff0c;y轴&#xff0c;z轴组成了我们的三维&#xff0c;那么第四维用什么来表示呢&#xff0c;我们这里要用颜色来表示第四维&#xff0c;所谓四维图形可视化就是在三维图形可视化的基础上&…

Mybatis 入门之resultMap与resultType讲解实例

resultMap&#xff1a;适合使用返回值是自定义实体类的情况 resultType&#xff1a;适合使用返回值得数据类型是非自定义的&#xff0c;即jdk的提供的类型 resultMap &#xff1a; type&#xff1a;映射实体类的数据类型 id&#xff1a;resultMap的唯一标识 column:库表的字段…

全球半导体产业60年兴衰启示录!

本文来自华泰证券&#xff0c;研究员张馨元、钱海、陈莉敏&#xff0c;感谢分享&#xff01;科技是当前行业配置不能忽视的主线&#xff0c;我们在今年 5 月 10 日发布的中期策略报告《无科技不牛市&#xff0c;以时间换空间》中提出&#xff0c;5G 时代物联网技术革命带来的是…

手机上python编程工具3和3h有区别吗_Python3.5内置模块之time与datetime模块用法实例分析...

本文实例讲述了Python3.5内置模块之time与datetime模块用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 1、模块的分类 a、标准库&#xff08;Python自带&#xff09;&#xff1a;sys、os模块 b、开源模块&#xff08;第三方模块&#xff09; c、自定义模块 2、内…

c++ string后面会添加‘\0‘

string类后面会添加\0&#xff0c;但这个\0不算入length里面 以一个例子就能说明&#xff1a; int main() {string s "hhh";cout << (s[3] \0)<<endl;cout << s.length() << endl;return 0; } 输出&#xff1a; 1 3

在visual studio code中配置python以及解决中文乱码问题

安装好 visual stuido code &#xff08;下面简称 “ VSC ”&#xff09;后&#xff0c;要想使用它运行调试 python 代码还需要做一些工作以解决下列问题&#xff1a; 搭建 python 环境print 打印中文出现乱码一、搭建 python 环境 在 VSC 中点击 F1 键&#xff0c;弹出控制台&…

华为加码布局 VR/AR趁势启航

来源&#xff1a;VR每日必看乘5G东风&#xff0c;VR/AR空间打开。随着5G的到来&#xff0c;5G高速和超低时延的特性将完美应对VR/AR发展的短板&#xff0c;商用牌照的发放将带领5G逐渐进入放量阶段&#xff0c;内外巨头均已开始大力布局。分析人士认为&#xff1a;第一阶段场景…

linux系列之常用运维命令整理笔录

本博客记录工作中需要的linux运维命令&#xff0c;大学时候开始接触linux&#xff0c;会一些基本操作&#xff0c;可是都没有整理起来&#xff0c;加上是做开发&#xff0c;不做运维&#xff0c;有些命令忘记了&#xff0c;所以现在整理成博客&#xff0c;当然vi&#xff0c;文…

C++ 传递字符串数组给函数参数

C 传数组给一个函数&#xff0c;数组类型自动转换为指针类型&#xff0c;因而传的实际是地址。 对于传入字符串数组同理&#xff0c;所以如果在函数中对传入的字符串数组进行改变&#xff0c;函数外的字符串数组也会同时改变 举个简单的例子&#xff1a; void change(char s…

Android高德地图自定义Markers的例子

下文为各位重点介绍关于Android高德地图自定义Markers的例子&#xff0c;希望这篇文章能够让各位理解到Android高德地图自定义Markers的方法。 之前的博客里说了地图的嵌入和定位&#xff0c;今天就说说在地图上显示一些我们想要的。在地图中有自带的Markers&#xff08;标记&a…

javaweb教务管理系统_基于Java web的教务管理系统

源码编号&#xff1a;B-E00033 点击查看(分类规则)项目类型&#xff1a;Java EE项目(非开源)项目名称&#xff1a;基于Java web的教务管理系统(TeachingSystem)当前版本&#xff1a;V1.0.1版本难度等级&#xff1a;✩✩复杂程度&#xff1a;✩✩ 点击查看难度等级用户类型&…

Science揭秘:为什么“好记性不如烂笔头”?

来源&#xff1a;中国生物技术网你还能记起你小学班长的名字吗&#xff1f;但我相信你肯定能记得同桌的名字&#xff0c;和与其共同经历的种种。但要再问你昨天新来同事的名字&#xff0c;你是否可以不假思索的回答出来&#xff1f;是不是有点儿困难&#xff1f;那为什么你能脱…

十个不可不看的Matlab GUI

截止到2012年6月2日&#xff0c;MatlabCentral上一共有1743个与"gui"有关的program。经过浏览前800个&#xff0c;选出以下比较有趣的程序。其中大部分没有经过测试&#xff0c;有可能无法使用或者功能不够理想&#xff0c;但至少可以作为一个starting point 吧。 Al…