Canny边缘检测算法总结
- 格式:docx
- 大小:171.37 KB
- 文档页数:11
halcon边缘检测例子Halcon是一款功能强大的机器视觉库,其边缘检测功能可以帮助我们在图像中找出物体的边缘,从而实现目标检测和分割。
下面将以Halcon边缘检测例子为题,列举一些常用的边缘检测方法和技巧。
一、Sobel算子边缘检测Sobel算子是一种常用的边缘检测算法,它通过计算图像的一阶导数来寻找边缘。
Halcon中可以使用函数SobelA来实现Sobel算子的边缘检测,可以设置不同的参数来调整检测结果的灵敏度。
二、Canny算子边缘检测Canny算子是一种经典的边缘检测算法,它结合了高斯滤波、梯度计算和非最大值抑制等步骤,可以得到更准确的边缘检测结果。
Halcon中可以使用函数EdgesSubPix来实现Canny算子的边缘检测,可以设置不同的参数来调整检测结果的质量和灵敏度。
三、Laplacian算子边缘检测Laplacian算子是一种基于二阶导数的边缘检测算法,它可以检测出图像中的高频变化,从而找到边缘。
Halcon中可以使用函数Laplace来实现Laplacian算子的边缘检测,可以设置不同的参数来调整检测结果的灵敏度。
四、Roberts算子边缘检测Roberts算子是一种简单但有效的边缘检测算法,它通过计算图像中像素点的灰度差来判断是否存在边缘。
Halcon中可以使用函数RobertsA来实现Roberts算子的边缘检测,可以设置不同的参数来调整检测结果的灵敏度。
五、Prewitt算子边缘检测Prewitt算子是一种基于一阶导数的边缘检测算法,它通过计算图像中像素点的灰度变化来寻找边缘。
Halcon中可以使用函数PrewittA来实现Prewitt算子的边缘检测,可以设置不同的参数来调整检测结果的灵敏度。
六、Scharr算子边缘检测Scharr算子是一种改进的Sobel算子,它可以更好地抵抗噪声干扰,提供更准确的边缘检测结果。
Halcon中可以使用函数ScharrA来实现Scharr算子的边缘检测,可以设置不同的参数来调整检测结果的灵敏度。
几种常用边缘检测算法的比较边缘检测是在数字图像上寻找图像亮度变化的过程,它对于图像处理和计算机视觉任务非常重要。
常见的边缘检测算法有Sobel算子、Prewitt算子、Roberts算子和Canny边缘检测算法。
本文将对这几种算法进行比较。
1. Sobel算子:Sobel算子是一种常见的边缘检测算法,它通过计算图像像素点与其邻域像素点之间的差异来检测边缘。
Sobel算子具有简单、快速的优点,可以检测水平和垂直方向的边缘,但对于斜向边缘检测效果较差。
2. Prewitt算子:Prewitt算子也是一种常用的边缘检测算法,它类似于Sobel算子,通过计算图像像素点与其邻域像素点之间的差异来检测边缘。
Prewitt算子可以检测水平、垂直和斜向边缘,但对于斜向边缘的检测结果可能不够精确。
3. Roberts算子:Roberts算子是一种简单的边缘检测算法,它通过计算图像像素点与其对角线方向上的邻域像素点之间的差异来检测边缘。
Roberts算子计算简单,但对于噪声敏感,容易产生干扰边缘。
4. Canny边缘检测算法:Canny边缘检测算法是一种经典的边缘检测算法,它包含多个步骤:高斯滤波、计算梯度、非最大抑制和双阈值处理。
Canny算法具有良好的边缘定位能力,并且对于噪声和细节边缘具有较好的抑制效果。
但Canny算法计算复杂度较高,在处理大规模图像时可能较慢。
综上所述,不同的边缘检测算法具有各自的优缺点。
若要选择适合应用的算法,需要综合考虑图像特点、计算复杂度和应用需求等因素。
如果对图像边缘的方向要求不高,可以选择Sobel或Prewitt算子;如果对图像边缘的方向要求较高,可以选择Canny算法。
另外,为了获得更好的边缘检测结果,通常需要进行适当的预处理,如灰度化、滤波和阈值处理等。
最后,对于不同的应用场景,可能需要使用不同的算法或算法组合来满足特定需求。
网络天地171改进的Canny 图像边缘检测算法分析◆王 娟1 边缘检测的过程边缘检测主要用于解决图像边缘的真假,边缘的定向定位。
以此来初步分析图像和识别图像。
想要做好边缘检测,需要遵循以下五个方面的过程进行检测分析:(1)首先要明确的了解图像检测时图像的特性变化形式,运用合适的检测方法。
(2)根据特殊情况需求,利用多算子综合计算方法。
提取多范围的变化特性,以便检测图像上的所有特性变化。
(3)由于噪声的影响,使检测有一定的局限性。
检测时需要尽可能的滤除噪音。
还需要考虑到噪音的条件检测,进一步检测参数变化。
(4)尽可能用多种方法进行组合。
例如在检测时,先找到边缘,然后利用函数近似的放法,利用内插获得高精度定位。
(5)检测时,首先对原图像进行平滑处理,然后再进行边缘检测。
一方面可以有效地抑制噪音,另一方面也可以对边缘进行精准定位。
2 传统Canny 算子的基本工作原理由于系统固有的低筒滤波对实际的图像进行平滑,以至于边缘不明显。
所以,这就需要边缘检测通过寻找出图像局部具有最大梯度值的一些像素点。
同时由于摄影机以及周围环境的干扰,因此图片边缘检测必须满足两个条件:①逼近必须能够抑制噪音效应;②必须尽量精准的确定边缘的位置。
以高定位精准、高信噪比、单一边缘响应位判断标准。
Canny 算子的基本流程:输入原始图像→转为灰度图像→ 高斯平滑→ 梯度计算→ 非极大值抑制→ 双阈值检测→ 连接边缘→ 输出边缘图像。
作为一阶微分滤波器的Canny 算子属于边缘检测,有三大显著优点:1、最优过零点定位准则2、多峰值响应准则3、最大信噪比准则。
Canny 算子基本的工作原理首先便是利用高斯平滑滤波器对图像进行平滑处理,目的是为了去除噪音的影响,然后通过计算梯度差值,来完成领域局部强度值。
利用高阈值和低阈值以及双阈值的计算方法对图像边缘进行检测已达到增强边缘的效果。
3 Canny 算子的实现步骤Canny 算子在整体运算的过程中,其需要结合多个运算步骤进行整体的运算。
Canny边缘检测算法的⼀些改进传统的Canny边缘检测算法是⼀种有效⽽⼜相对简单的算法,可以得到很好的结果(可以参考上⼀篇)。
但是Canny算法本⾝也有⼀些缺陷,可以有改进的地⽅。
1. Canny边缘检测第⼀步⽤⾼斯模糊来去掉噪声,但是同时也会平滑边缘,使得边缘信息减弱,有可能使得在后⾯的步骤中漏掉⼀些需要的边缘,特别是弱边缘和孤⽴的边缘,可能在双阀值和联通计算中被剔除。
很⾃然地可以预见,如果加⼤⾼斯模糊的半径,对噪声的平滑⼒度加⼤,但也会使得最后得到的边缘图中的边缘明显减少。
这⾥依然⽤Lena图为例,保持Canny算法中⾼阀值100,低阀值50不变,⾼斯半径分别为2,3,5的Canny边缘⼆值图像如下。
可知⾼斯模糊把很多有⽤的边缘信息也模糊掉了,因此如何精确的选择⾼斯半径就相当重要。
⾼斯半径2 ⾼斯半径3 ⾼斯半径52. 在最初的Canny算法中是使⽤的最⼩的2x2领域来计算梯度幅值的。
这种⽅法对噪声很敏感,⽐较容易检测到伪边缘或漏掉真是边缘。
在上⼀篇算法实现中,实际上使⽤的是3x3的Sobel梯度算⼦,是⼀种⽐较好的选择。
3. 传统Canny算法的双阀值是全局固定的,因此双阀值⼤⼩的选取对最终的结果影响很⼤,也有⼀些经验,⽐如选择低阀值是⾼阀值的0.4或0.5。
然⽽这毕竟是⼀种经验选择,阀值的确定仍然很难决定⼀个最优值。
⽽且⼀个图像的不同局部区域可能需要各不相同的阀值来精确地找到真实边缘,因此全局阀值就不太合适了。
4. 传统算法仍然可能产⽣⼀条宽度⼤于1的边缘,达不到满意的⾼精度单点响应。
也就是需要继续细化边缘。
下⾯就⼀些可以改进的地⽅做⼀些讨论。
代替⾼斯模糊噪声是⾼频信号,边缘信号也属于⾼频信号。
既然⾼斯模糊不加区分的对所有的⾼频信息进⾏了模糊,效果⾃然不尽如⼈意。
那么⾃然就想到了带有保留边缘功能的各种选择性平滑⽅法,似乎在这⾥⽐⾼斯模糊会更加合适,那我们就来试⼀试。
带有保留边缘功能的平滑⽅法的基本思想不是让领域范围内的所有像素都参与该种平滑⽅法的计算,⽽是设定⼀个阀值,仅仅让和中⼼像素灰度的差值⼩于这个阀值的像素参与计算。
Canny检测算法与实现1、原理图象边缘就是图像颜⾊快速变化的位置,对于灰度图像来说,也就是灰度值有明显变化的位置。
图像边缘信息主要集中在⾼频段,图像锐化或检测边缘实质就是⾼通滤波。
数值微分可以求变化率,在图像上离散值求梯度,图像处理中有多种边缘检测(梯度)算⼦,常⽤的包括普通⼀阶差分,Robert算⼦(交叉差分),Sobel算⼦,⼆阶拉普拉斯算⼦等等,是基于寻找梯度强度。
Canny 边缘检测算法是John F. Canny 于1986年开发出来的⼀个多级边缘检测算法,也被很多⼈认为是边缘检测的最优算法, 最优边缘检测的三个主要评价标准是:低错误率: 标识出尽可能多的实际边缘,同时尽可能的减少噪声产⽣的误报。
⾼定位性: 标识出的边缘要与图像中的实际边缘尽可能接近。
最⼩响应: 图像中的边缘只能标识⼀次。
Canny算⼦求边缘点具体算法步骤如下:1. ⽤⾼斯滤波器平滑图像.2. ⽤⼀阶偏导有限差分计算梯度幅值和⽅向.3. 对梯度幅值进⾏⾮极⼤值抑制.4. ⽤双阈值算法检测和连接边缘.2、实现步骤2.1、消除噪声使⽤⾼斯平滑滤波器卷积降噪。
下⾯显⽰了⼀个 size = 5 的⾼斯内核⽰例:2.2、计算梯度幅值和⽅向按照Sobel滤波器的步骤,计算⽔平和垂直⽅向的差分Gx和Gy:在vs中可以看到sobel像素值和形状:梯度幅值和⽅向为:梯度⽅向近似到四个可能⾓度之⼀(⼀般 0, 45, 90, 135)。
2.3、⾮极⼤值抑制⾮极⼤值抑制是指寻找像素点局部最⼤值。
sobel算⼦检测出来的边缘太粗了,我们需要抑制那些梯度不够⼤的像素点,只保留最⼤的梯度,从⽽达到瘦边的⽬的。
沿着梯度⽅向,⽐较它前⾯和后⾯的梯度值,梯度不够⼤的像素点很可能是某⼀条边缘的过渡点,排除⾮边缘像素,最后保留了⼀些细线。
在John Canny提出的Canny算⼦的论⽂中,⾮最⼤值抑制就只是在0、90、45、135四个梯度⽅向上进⾏的,每个像素点梯度⽅向按照相近程度⽤这四个⽅向来代替。
一.Canny边缘检测算法原理JohnCanny于1986年提出Canny算子,属于是先平滑后求导数的方法。
其处理过程大体上分为下面四部分。
1. 对原始图像进行灰度化Canny算法通常处理的图像为灰度图,因此如果获取的是彩色图像,那首先就得进行灰度化。
对一幅彩色图进行灰度化,就是根据图像各个通道的采样值进行加权平均。
以RGB格式的彩图为例,通常灰度化采用的方法主要有:方法1:Gray=(R+G+B)/3;方法2:Gray=0.299R+0.587G+0.114B;(这种参数考虑到了人眼的生理特点)至于其他格式的彩色图像,可以根据相应的转换关系转为RGB然后再进行灰度化;在编程时要注意图像格式中RGB的顺序通常为BGR。
2. 对图像进行高斯滤波图像高斯滤波的实现可以用两个一维高斯核分别两次加权实现,也可以通过一个二维高斯核一次卷积实现。
1)高斯核实现上式为离散化的一维高斯函数,确定参数就可以得到一维核向量。
上式为离散化的二维高斯函数,确定参数就可以得到二维核向量。
在求得高斯核后,要对整个核进行归一化处理。
2)图像高斯滤波对图像进行高斯滤波,其实就是根据待滤波的像素点及其邻域点的灰度值按照一定的参数规则进行加权平均。
这样可以有效滤去理想图像中叠加的高频噪声。
通常滤波和边缘检测是矛盾的概念,抑制了噪声会使得图像边缘模糊,这会增加边缘定位的不确定性;而如果要提高边缘检测的灵敏度,同时对噪声也提高了灵敏度。
实际工程经验表明,高斯函数确定的核可以在抗噪声干扰和边缘检测精确定位之间提供较好的折衷方案。
3. 用一阶偏导的有限差分来计算梯度的幅值和方向关于图像灰度值得梯度可使用一阶有限差分来进行近似,这样就可以得图像在x和y 方向上偏导数的两个矩阵。
常用的梯度算子有如下几种:1)Roberts算子上式为其x和y方向偏导数计算模板,可用数学公式表达其每个点的梯度幅值为:2)Sobel算子上式三个矩阵分别为该算子的x向卷积模板、y向卷积模板以及待处理点的邻域点标记矩阵,据此可用数学公式表达其每个点的梯度幅值为:3)Prewitt算子和Sobel算子原理一样,在此仅给出其卷积模板。
图像处理中的边缘检测方法与性能评估边缘检测是图像处理和计算机视觉领域中的一项重要任务。
它主要用于提取图像中物体和背景之间的边界信息,便于后续的图像分割、目标识别和物体测量等应用。
在图像处理领域,边缘被定义为亮度、颜色或纹理等属性上的不连续性。
为了实现准确且可靠的边缘检测,许多不同的方法和算法被提出并广泛应用。
在本文中,我们将介绍几种常见的边缘检测方法,并对它们的性能进行评估。
1. Roberts 算子Roberts 算子是一种基于差分的边缘检测算法,它通过对图像进行水平和垂直方向的差分运算来检测边缘。
这种算法简单且易于实现,但对噪声比较敏感。
2. Sobel 算子Sobel 算子是一种常用的基于梯度的边缘检测算法。
它通过在图像上进行卷积运算,计算像素点的梯度幅值和方向,从而检测边缘。
Sobel 算子可以有效地消除噪声,并在边缘方向上提供更好的响应。
3. Canny 边缘检测Canny 边缘检测是一种经典的边缘检测算法。
它包括多个步骤,包括高斯滤波、计算梯度幅值和方向、非极大值抑制和双阈值处理。
Canny 边缘检测算法具有较高的准确性和鲁棒性,广泛应用于实际图像处理中。
除了以上提到的方法外,还存在许多其他的边缘检测算法,如拉普拉斯算子、积分图像算法等。
这些算法各有优缺点,选择合适的算法需要根据具体应用情况和要求来确定。
对于边缘检测方法的性能评估,通常使用以下几个指标来衡量:1. 精确度精确度是评估边缘检测算法结果与真实边缘之间的差异的指标。
可以通过计算检测结果与真实边缘的重叠率或者平均绝对误差来评估。
2. 召回率召回率是评估边缘检测算法是否能够正确检测到真实边缘的指标。
可以通过计算检测结果中的边缘与真实边缘的重叠率或者正确检测到的边缘像素数量与真实边缘像素数量的比值来评估。
3. 噪声鲁棒性噪声鲁棒性是评估边缘检测算法对图像噪声的抗干扰能力的指标。
可以通过在含有不同噪声水平的图像上进行测试,并比较检测到的边缘结果与真实边缘的差异来评估。
canny算子边缘检测原理
Canny算子是一种常用的边缘检测算法,其原理如下:
1. 高斯滤波:首先对图像进行高斯滤波,以减少噪声的影响。
高斯滤波是利用高斯函数对图像进行平滑操作,可以抑制高频噪声。
2. 计算梯度幅值和方向:对平滑后的图像进行梯度计算,通过计算像素点的梯度幅值和方向,可以找到图像中的边缘。
常用的梯度算子包括Sobel算子和Prewitt算子。
3. 非极大值抑制:在梯度图像中,对于每个像素点,通过比较其梯度方向上的两个相邻像素点的梯度幅值,将梯度幅值取最大值的点保留下来,其他点置为0。
这样可以剔除非边缘的像素。
4. 双阈值处理:将梯度幅值图像中的像素分为强边缘、弱边缘和非边缘三类。
设置两个阈值:高阈值和低阈值。
如果某个像素的梯度幅值大于高阈值,则将其标记为强边缘。
如果某个像素的梯度幅值小于低阈值,则将其剔除。
对于梯度幅值介于低阈值和高阈值之间的像素,如果其与某个强边缘像素相连,则将其标记为强边缘,否则将其标记为弱边缘。
5. 边缘连接:通过将强边缘和与其相连的弱边缘进行连接,找到完整的边缘。
这里通常使用8连通或4连通算法来判断两个像素是否相连。
通过以上步骤,Canny算子可以得到图像中的边缘信息,并且相对其他算法能够更好地抑制噪声和保持边缘的连续性。
一、背景介绍随着数字图像处理技术的不断发展,图像边缘检测一直是计算机视觉和图像处理领域的关键问题之一。
Canny算法作为一种经典的边缘检测算法,在实际应用中具有较高的准确性和鲁棒性,因此被广泛应用于各种图像处理任务中。
Canny算法的核心思想是利用图像的梯度信息来检测图像中的边缘,同时通过非极大值抑制和双阈值检测来提取最终的边缘信息。
二、Canny算法原理1. 高斯模糊:为了减少图像中的噪声对边缘检测的影响,Canny算法首先对图像进行高斯模糊处理,通过平滑图像来减少噪声的影响。
2. 梯度计算:接下来,Canny算法利用Sobel算子计算图像的梯度幅值和方向,得到图像的梯度信息。
3. 非极大值抑制:Canny算法通过比较图像中每个像素点的梯度方向,来抑制非边缘像素,从而得到更细化的边缘信息。
4. 双阈值检测:Canny算法利用双阈值检测来进一步筛选边缘像素,从而得到最终的边缘信息。
三、Matlab实现Canny算法1. 读取图像:使用Matlab的imread函数读取待处理的图像,并将其转换为灰度图像。
2. 高斯模糊:利用Matlab中的imgaussfilt函数对灰度图像进行高斯模糊处理,减少图像中的噪声。
3. 计算梯度:使用Matlab中的imgradient函数计算图像的梯度幅值和方向。
4. 非极大值抑制:编写代码实现对图像的非极大值抑制处理,保留图像中的边缘像素。
5. 双阈值检测:通过设定合适的高低阈值,使用Matlab中的imbinarize函数对图像进行双阈值检测,得到最终的边缘信息。
6. 显示结果:使用Matlab中的imshow函数将原始图像和处理后的边缘图像进行显示,观察算法的效果。
四、自适应阈值优化1. 传统Canny算法中,阈值的设定是一个固定的数值,对于不同图像可能会产生较大的误差。
2. 为了进一步提高Canny算法的准确性和鲁棒性,在阈值的设定上可以引入自适应阈值技术。
图像处理中的边缘检测方法边缘检测是图像处理中一项重要任务,它可以通过识别图像中的边缘来揭示物体的轮廓和边界。
在计算机视觉、模式识别和图像分析等领域,边缘检测被广泛应用于目标检测、图像分割、特征提取等方面。
本文将介绍几种常见的图像处理中的边缘检测方法,包括Sobel算子、Canny算子和Laplacian算子。
1. Sobel算子Sobel算子是一种基于差分运算的边缘检测算法,它通过计算图像中像素值的梯度来确定边缘。
Sobel算子采用了一种基于离散卷积的方法,通过在水平和垂直方向上应用两个3×3的卷积核,分别计算出水平和垂直方向的梯度值,最后将两个梯度值进行合并,得到最终的梯度幅值。
Sobel算子在图像边缘检测中表现出色,但它对噪声敏感,需要进行预处理或者使用其他滤波方法。
2. Canny算子Canny算子是一种经典的边缘检测算法,它综合了图像平滑、梯度计算、非极大值抑制和双阈值处理等步骤。
首先,Canny算子使用高斯滤波器对图像进行平滑处理,以减少噪声的影响。
然后,它计算图像中每个像素的梯度幅值和方向,并进行非极大值抑制,保留局部最大值点。
最后,通过设置低阈值和高阈值,将梯度幅值分为强边缘和弱边缘两部分,并通过迭代连接强边缘像素点来得到最终的边缘图像。
3. Laplacian算子Laplacian算子是一种基于二阶微分的边缘检测算法,它通过计算图像中像素值的二阶导数来确定边缘。
Laplacian算子可以通过二阶离散卷积来实现,它对图像中的边缘部分具有一定的抑制作用,并提供了更加精细的边缘信息。
在应用Laplacian算子之前,通常需要对图像进行灰度化处理,以减少计算量和提高边缘检测效果。
与Sobel和Canny 算子相比,Laplacian算子对噪声的影响较小,但容易产生边缘断裂和边缘响应不稳定的问题,因此在实际应用中需要进行适当的后处理。
综上所述,Sobel算子、Canny算子和Laplacian算子是图像处理中常用的边缘检测方法。
图像的边缘检测实验报告
《图像的边缘检测实验报告》
图像的边缘检测是计算机视觉领域中的重要技术之一,它可以帮助我们识别图
像中物体的边缘和轮廓,从而实现图像分割、特征提取和目标识别等应用。
在
本次实验中,我们将对几种常用的边缘检测算法进行比较和分析,以评估它们
在不同场景下的性能和适用性。
首先,我们使用了Sobel算子进行边缘检测。
Sobel算子是一种基于梯度的边缘检测方法,它通过对图像进行卷积操作来寻找像素值变化最大的地方,从而找
到图像中的边缘。
实验结果显示,Sobel算子在一些简单场景下表现良好,但
在复杂背景和噪声干扰较大的情况下效果不佳。
接着,我们尝试了Canny边缘检测算法。
Canny算法是一种多阶段的边缘检测
方法,它通过对图像进行高斯滤波、计算梯度、非极大值抑制和双阈值处理等
步骤来检测图像中的边缘。
实验结果显示,Canny算法在复杂场景下表现出色,能够有效地抑制噪声并找到图像中的真实边缘。
最后,我们还尝试了Laplacian算子和Prewitt算子等其他边缘检测算法,并对
它们的性能进行了比较和分析。
实验结果显示,不同的边缘检测算法在不同场
景下表现出各自的优势和劣势,需要根据具体的应用需求来选择合适的算法。
总的来说,本次实验对图像的边缘检测算法进行了全面的比较和分析,为我们
进一步深入理解和应用这些算法提供了重要的参考和指导。
希望通过这些实验
结果,我们能够更好地利用边缘检测技术来解决实际的图像处理问题,为计算
机视觉领域的发展做出更大的贡献。
Canny边缘检测是一种常用的图像处理算法,用于检测图像中的边缘。
以下是Canny边缘检测的基本公式和步骤:
高斯滤波:
首先对输入图像应用高斯滤波器,以减少噪声的影响。
高斯滤波器的公式如下:
G(x, y) = (1 / (2 * π* σ^2)) * exp(-(x^2 + y^2) / (2 * σ^2))
计算梯度幅值和方向:
在经过高斯滤波后的图像上,使用Sobel算子计算每个像素的梯度幅值和方向。
梯度幅值的计算公式如下:
G = sqrt(Gx^2 + Gy^2)
其中,Gx和Gy分别是在x和y方向上的梯度。
非极大值抑制:
对梯度幅值图像进行非极大值抑制,保留局部梯度幅值的峰值点,抑制非峰值点。
这样可以细化边缘。
双阈值处理:
将非极大值抑制后的图像进行阈值处理,将梯度幅值划分为强边缘、弱边缘和非边缘三个阈值区间。
根据强边缘和弱边缘之间的连通性关系,确定最终的边缘。
Canny边缘检测算法的具体参数设置和阈值选择可以根据具体应用进行调整。
这些公式和步骤提供了Canny边缘检测的基本原理和流程,但实际应用中可能还会有其他优化和改进的技术。
边缘检测之Canny1. 写在前⾯最近在做边缘检测⽅⾯的⼀些⼯作,在⽹络上也找了很多有⽤的资料,感谢那些积极分享知识的先辈们,⾃⼰在理解Canny边缘检测算法的过程中也⾛了⼀些弯路,在编程实现的过程中,也遇到了⼀个让我怀疑⼈⽣的BUG(⽇了狗狗)。
就此写下此⽂,作为后记,也希望此篇⽂章可以帮助那些在理解Canny算法的道路上暂⼊迷途的童鞋。
废话少说,上⼲货。
2. Canny边缘检测算法的发展历史Canny边缘检测于1986年由JOHN CANNY⾸次在论⽂《A Computational Approach to Edge Detection》中提出,就此拉开了Canny边缘检测算法的序幕。
Canny边缘检测是从不同视觉对象中提取有⽤的结构信息并⼤⼤减少要处理的数据量的⼀种技术,⽬前已⼴泛应⽤于各种计算机视觉系统。
Canny发现,在不同视觉系统上对边缘检测的要求较为类似,因此,可以实现⼀种具有⼴泛应⽤意义的边缘检测技术。
边缘检测的⼀般标准包括:1) 以低的错误率检测边缘,也即意味着需要尽可能准确的捕获图像中尽可能多的边缘。
2) 检测到的边缘应精确定位在真实边缘的中⼼。
3) 图像中给定的边缘应只被标记⼀次,并且在可能的情况下,图像的噪声不应产⽣假的边缘。
为了满⾜这些要求,Canny使⽤了变分法。
Canny检测器中的最优函数使⽤四个指数项的和来描述,它可以由⾼斯函数的⼀阶导数来近似。
在⽬前常⽤的边缘检测⽅法中,Canny边缘检测算法是具有严格定义的,可以提供良好可靠检测的⽅法之⼀。
由于它具有满⾜边缘检测的三个标准和实现过程简单的优势,成为边缘检测最流⾏的算法之⼀。
3. Canny边缘检测算法的处理流程Canny边缘检测算法可以分为以下5个步骤:1) 使⽤⾼斯滤波器,以平滑图像,滤除噪声。
2) 计算图像中每个像素点的梯度强度和⽅向。
3) 应⽤⾮极⼤值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
基于sobel 、canny 的边缘检测实现一.实验原理Sobel 的原理:索贝尔算子(Sobel operator )是图像处理中的算子之一,主要用作边缘检测。
在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。
在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量.该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。
如果以A 代表原始图像,Gx 及Gy 分别代表经横向及纵向边缘检测的图像,其公式如下:101202*101x G A -+⎛⎫ ⎪=-+ ⎪ ⎪-+⎝⎭121000*121y G A +++⎛⎫ ⎪= ⎪ ⎪---⎝⎭图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。
在以上例子中,如果以上的角度Θ等于零,即代表图像该处拥有纵向边缘,左方较右方暗。
在边沿检测中,常用的一种模板是Sobel 算子。
Sobel 算子有两个,一个是检测水平边沿的 ;另一个是检测垂直平边沿的 。
与 和 相比,Sobel 算子对于象素的位置的影响做了加权,因此效果更好。
Sobel 算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边沿的 ,另一个是检测垂直平边沿的 。
各向同性Sobel 算子和普通Sobel 算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。
由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性Sobel 算子的处理方法。
由于Sobel 算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数, 简单有效,因此应用广泛。
美中不足的是,Sobel 算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel 算子没有基于图像灰度进行处理,由于Sobel 算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。
Canny边缘检测算法总结
一.Canny边缘检测算法原理
JohnCanny于1986年提出Canny算子,属于是先平滑后求导数的方法。
其处理过程大体上分为下面四部分。
1. 对原始图像进行灰度化
Canny算法通常处理的图像为灰度图,因此如果获取的是彩色图像,那首先就得进行灰度化。
对一幅彩色图进行灰度化,就是根据图像各个通道的采样值进行加权平均。
以RGB格式的彩图为例,通常灰度化采用的方法主要有:方法1:Gray=(R+G+B)/3;
方法2:Gray=0.299R+0.587G+0.114B;(这种参数考虑到了人眼的生理特点)
至于其他格式的彩色图像,可以根据相应的转换关系转为RGB然后再进行灰度化;在编程时要注意图像格式中RGB的顺序通常为BGR。
2. 对图像进行高斯滤波
图像高斯滤波的实现可以用两个一维高斯核分别两次加权实现,也可以通过一个二维高斯核一次卷积实现。
1)高斯核实现
上式为离散化的一维高斯函数,确定参数就可以得到一维核向量。
上式为离散化的二维高斯函数,确定参数就可以得到二维核向量。
在求得高斯核后,要对整个核进行归一化处理。
2)图像高斯滤波
对图像进行高斯滤波,其实就是根据待滤波的像素点及其邻域点的灰度值按照一定的参
数规则进行加权平均。
这样可以有效滤去理想图像中叠加的高频噪声。
通常滤波和边缘检测是矛盾的概念,抑制了噪声会使得图像边缘模糊,这会增加边缘定位的不确定性;而如果要提高边缘检测的灵敏度,同时对噪声也提高了灵敏度。
实际工程经验表明,高斯函数确定的核可以在抗噪声干扰和边缘检测精确定位之间提供较好的折衷方案。
3. 用一阶偏导的有限差分来计算梯度的幅
值和方向
关于图像灰度值得梯度可使用一阶有限差分来进行近似,这样就可以得图像在x和y 方向上偏导数的两个矩阵。
常用的梯度算子有如下几种:
1)Roberts算子
上式为其x和y方向偏导数计算模板,可用数学公式表达其每个点的梯度幅值为:
2)Sobel算子
上式三个矩阵分别为该算子的x向卷积模板、y向卷积模板以及待处理点的邻域点标记矩阵,据此可用数学公式表达其每个点的梯度幅值为:
3)Prewitt算子
和Sobel算子原理一样,在此仅给出其卷积模板。
4)Canny算法所采用的方法
在这里实现的Canny算法中所采用的卷积算子比较简单,表达如下:
其x向、y向的一阶偏导数矩阵,梯度幅值以及梯度方向的数学表达式为:
求出这几个矩阵后,就可以进行下一步的检测过程。
4. 对梯度幅值进行非极大值抑制
图像梯度幅值矩阵中的元素值越大,说明图像中该点的梯度值越大,但这不不能说明该点就是边缘(这仅仅是属于图像增强的过程)。
在Canny算法中,非极大值抑制是进行边缘检测的重要步骤,通俗意义上是指寻找像素点局部最大值,将非极大值点所对应的灰度值置为0,这样可以剔除掉一大部分非边缘的点。
图1 非极大值抑制原理
根据图1 可知,要进行非极大值抑制,就首先要确定像素点C的灰度值在其8值邻域内是否为最大。
图1中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大值肯
定分布在这条线上,也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值。
因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点。
如果经过判断,C点灰度值小于这两个点中的任一个,那就说明C点不是局部极大值,那么则可以排除C点为边缘。
这就是非极大值抑制的工作原理。
非最大抑制是这样一个问题:“当前的梯度值在梯度方向上是一个局部最大值” 所以,要把当前位置的梯度值与梯度方向上两侧的梯度值进行比较;且梯度方向垂直于边缘方向。
但实际上,我们只能得到C点邻域的8个点的值,而dTmp1和dTmp2并不在其中,要得到这两个值就需要对该两个点两端的已知灰度进行线性插值,也即根据图1中的g1和g2对dTmp1进行插值,根据g3和g4对dTmp2进行插值,这要用到其梯度方向,这是上文
Canny算法中要求解梯度方向矩阵Thita的原因。
完成非极大值抑制后,会得到一个二值图像,非边缘的点灰度值均为0,可能为边缘的局部灰度极大值点可设置其灰度为128。
这样得到的图像可能包含了很多由噪声及其他原因造成的假边缘。
因此还需要进一步的处理。
5. 用双阈值算法检测和连接边缘
Canny算法中减少假边缘数量的方法是采用双阈值法。
选择两个阈值,根据高阈值得到一个边缘图像,这样一个图像含有很少的假边缘,但是由于阈值较高,产生的图像边缘可能不闭合,为解决这样一个问题采用了另外一个低阈值。
在高阈值图像中把边缘链接成轮廓,当到达轮廓的端点时,该算法会在断点的8邻域点中寻找满足低阈值的点,再根据此点收集新的边缘,直到整个图像边缘闭合。
二.Canny边缘检测算法实验结果
图2原图
图3 高斯模糊后
图4 sobel边缘检测后图5 非极大抑制后
图6 上阈值120,下阈值100检测结果。