[图像]Canny检测的Matlab实现(含代码)
来源:互联网 发布:软件前端是什么 编辑:程序博客网 时间:2024/06/06 01:24
原创文章,欢迎转载。转载请注明:转载自 祥的博客
原文链接:http://blog.csdn.net/humanking7/article/details/46606791
图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。
Canny边缘检测基本特征如下:
(1) 必须满足两个条件:①能有效地抑制噪声;②必须尽量精确确定边缘的位置。
(2) 根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。
(3) 类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。Canny边缘检测算法步骤:
步骤1:用高斯滤波器平滑处理原图像;
步骤2:用一阶偏导的有限差分进行计算梯度的幅值和方向;
步骤3:对梯度幅值进行非极大值抑制;
步骤4:用双阈值算法检测和连接边缘。步骤详解
步骤1:用高斯滤波器平滑处理原图像
使用平滑滤波的原因从根本上来说是边缘检测算子中的导数计算。导数计算对噪声十分敏感,如果不提前使用滤波器加以改善,则在导数计算后,噪声将会被放大,使得检测出来的虚假边缘变多,不利于边缘的提取。平滑滤波和边缘检测是一对矛盾的概念。一方面,平滑滤波能够有效的抑制噪声,而在此过程中会使得图像边缘模糊,增加了边缘定位的不确定性。另一方面,平滑滤波能够除去对边缘检测中导数运算敏感的噪声,有效的抑制了虚假边缘的产生。实际工程经验表明,高斯滤波器可以在抗噪声干扰和边缘检测精确定位之间提供一个较好的折中方案。
步骤2:用一阶偏导的有限差分进行计算梯度的幅值和方向
图像的边缘有方向和幅度两个属性,沿边缘方向像素变化平缓,垂直于边缘方向像素变化剧烈,边缘上的这种变化可以用微分算子检测出来,通常用一阶或二阶导数来检测边缘.
由上图可以看出,一阶导数可以用于检测图像中的一个点是否是边缘点(也就是判断一个点是否在斜坡上)。同样,二阶导数的符号可以用于判断一个边缘像素是否在亮的一边还是暗的一边。
用一阶偏导的有限差分来计算梯度的幅值和方向。下图中,图a经过梯度计算后的得到梯度三维示意图b。图b中x和y代表图像像素位置,竖轴的数值反映了梯度幅值的大小。由公式(3-17)可知,边缘方向与梯度方向是相垂直的,如图b所示。
步骤3:对梯度幅值进行非极大值抑制
步骤4:用双阈值算法检测和连接边缘
代码
主函数代码
主函数代码文件
main.m
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
Canny边缘检测函数代码
Canny边缘检测函数文件
canny1step.m
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
结果对比
对比图像
分析
图2所示的四张图片展示了整个边缘检测的过程。
- 图(a)显示的为图像的梯度值,其三维图像为图3左所示。
- 图(b)显示了经过极大值抑制之后的图像,可以看出经过非极大值抑制之后,排除非边缘的像素,仅仅保留了一些细的线条,即就是候选的边缘。
- 图(c)为经过双阈值算法处理过后的二值化图像(选用的低阈值为22,高低阈值之比为2:1),对比图(b)发现此过程有效的抑制了“虚假边缘”的产生,而且也相应的连接了一些断裂的边缘。
- 图(d)是利用Matlab自带edge函数的Canny方法,可以看出其效果优于我实现的传统Canny程序,说明Matlab在阈值选取原则和梯度算子两方面有自己相应的改进。
图3展示了梯度幅值在非极大值抑制前后的三维效果,对应于图2中的图(a)和图(b)。
注: 本文所用的图像和代码源自于本人的毕设论文。
版权声明:本文为博主原创文章,未经博主允许不得转载。
- [图像]Canny检测的Matlab实现(含代码)
- [图像]Canny检测的Matlab实现(含代码)
- [图像]Canny检测的Matlab实现(含代码)
- opencv3_java 图像的边缘检测Canny Canny
- 图像边缘检测(Canny 算法)的Java实现
- 图像边缘检测(Canny 算法)的Java实现
- Canny 边缘检测算子 MATLAB实现
- 图像边缘检测——二阶微分算子(下)Canny算子(Matlab实现)
- 基于OPENCV的CANNY边缘检测算子详细代码实现
- 【MATLAB图像处理3】 canny边缘检测 (附源码)
- Matlab图像边缘检测Roberts\Sobel\Prewitt\Canny算子
- 【MATLAB图像处理3】 canny边缘检测 (附源码)
- 图像边缘检测——canny算子原理与代码
- 利用Canny边缘检测算子进行边缘检测的原理及OpenCV代码实现
- 图像变换-用canny算子实现边缘检测
- 图像sobel、laplacian、canny边缘检测算法基础实现
- OpenCV使用Canny边缘检测器实现图像边缘检测
- Canny边缘检测算法的实现
- Eclipse tomcat启动web项目 报错 Removing obsolete files from server..Could not clean server ...
- Mysql数据库实时查看执行的sql语句
- cookie与session的区别
- java中如何用Quartz框架来实现定时任务(一)
- Android学习之友盟开发这些坑
- [图像]Canny检测的Matlab实现(含代码)
- C++ 函数原型
- 扫描格式的pdf文件怎样进行识别
- c++ 虚函数表实现多态
- 制作字库(或制作找图所要点击的元素)作为成功判断的条件之一
- Bagging and bootstrap
- 分布式助手Zookeeper(二)
- Git简介、安装及创建版本库
- 安装svn插件集成myeclipse2014的方式