边缘指的是图像中像素的值有突变的地方。
边缘检测一般分为三步,分别是滤波、增强、检测。基本原理都是用高斯滤波器进行去噪,之后在用卷积内核寻找像素梯度。常用有三种算法:canny算子,sobel算子,laplacian算子。
sobel算子:一阶导数算子,引入局部平均运算,对噪声具有平滑作用,抗噪声能力强,计算量较大,但定位精度不高,得到的边缘比较粗,适用于精度要求不高的场合。
laplacian算子:二阶微分算子,具有旋转不变性,容易受噪声影响,不能检测边缘的方向,一般不直接用于检测边缘,而是判断明暗变化。很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。
canny算子:一种完善的边缘检测算法,抗噪能力强,用高斯滤波平滑图像,用一阶偏导的有限差分计算梯度的幅值和方向,对梯度幅值进行非极大值抑制,采用双阈值检测和连接边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。canny 产生的边缘很细,可能就一个像素那么细,没有强弱之分。
在有些情况下,如灰度变化均匀的图像,只利用一阶导数可能找不到边界,此时二阶导数就能提供很有用的信息。二阶导数对噪声也比较敏感,解决的方法是先对图像进行平滑滤波,消除部分噪声,再进行边缘检测。不过,利用二阶导数信息的算法是基于过零检测的,因此得到的边缘点数比较少,有利于后继的处理和识别工作。
网易面试题:图像处理中边缘检测算法sobel与canny在应用上有什么区别?
答:sobel是基于梯度图像模值大小的检测算子,通常有水平和垂直两种算子。
canny算法实际上是将sobel算子应用两次,取不同于阈值,一个是低阈值,低阈值要包含像素全部的重要边缘,高阈值要尽量将全部的非重要边缘去除。首先进行去噪,寻找亮度梯度,使用滞后阈值进行,canny算子适合于用于不同的场合,不过速度较慢。 它的参数允许根据不同实现的特定要求进行调整以识别不同的边缘特性
sobel算子是其滤波算子的形式,用于提取边缘,可以利用快速卷积函数。但是sobel算子没有将图像主体与背景严格区分开来,没有基于图像灰度进行处理。
卷积一词最开始出现在信号与线性系统中,信号与线性系统中讨论的就是信号经过一个线性系统以后发生的变化。由于现实情况中常常是一个信号前一时刻的输出影响着这一时刻的输出,所在一般利用系统的单位响应与系统的输入求卷积,以求得系统的输出信号(当然要求这个系统是线性时不变的)。
卷积的定义:
卷积是两个变量在某范围内相乘后求和的结果。如果卷积的变量是序列x(n)和h(n),则卷积的结果:
对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值,这样就完成了滤波过程!
1、平滑均值滤波(平滑):
2、高斯平滑:(高斯平滑水平和垂直方向呈现高斯分布,更突出了中心点在像素平滑后的权重)
3、图像锐化(图像中的边缘信息有着比周围像素更高的对比度,而经过卷积之后进一步增强了这种对比度)
Soble与上述卷积核不同之处在于,Soble更强调了和边缘相邻的像素点对边缘的影响。
中心点 f(x, y) 是重点考虑的,它的权重应该多一些。
显然计算结果为Gx = 4,Gy = 0,也就是说该点在水平方向上两侧是存在差异的,在垂直方向上不存在差异,所以是一个竖直边缘。
G(x, y) = Gx + Gy 就是 sobel 边缘检测后的图像了
拉普拉斯是用二阶差分计算边缘的,看连续函数的情况下
在一阶微分图中极大值或极小值处,认为是边缘。
在二阶微分图中极大值和极小值之间的过 0 点,被认为是边缘。
canny计算过程
step1:用高斯滤波器平滑图象;
step2:用一阶偏导的有限差分来计算梯度的幅值和方向;
step3:对梯度幅值进行非极大值抑制;
step4:用双阈值算法检测和连接边缘。
通俗说一下
1.用高斯滤波主要是去掉图像上的噪声。
2.计算一阶差分,OpenCV 源码中也是用 sobel 算子来算的。
3.算出来的梯度值,把不是极值的点,全部置0,去掉了大部分弱的边缘。所以图像边缘会变细。
4.双阈值 t1, t2, 是这样的,t1 <= t2
大于 t2 的点肯定是边缘
小于 t1 的点肯定不是边缘
在 t1, t2 之间的点,通过已确定的边缘点,发起8领域方向的搜索(广搜),图中可达的是边缘,不可达的点不是边缘。
最后得出 canny 边缘图。
高斯平滑滤波器被使用去模糊图像,均值滤波器的核每一个值都是相等,而高斯平滑滤波器的核内的数却是呈现高斯分布的。
计算图像梯度,得到可能边缘。这里我选择Sobel算子计算梯度。
边缘细化。非最大值抑制能帮助保留局部最大梯度而抑制所有其他梯度值。这意味着只保留了梯度变化中最锐利的位置。
Canny算法应用双阀值,即一个高阀值和一个低阀值来区分边缘像素。如果边缘像素点梯度值大于高阀值,则被认为是强边缘点。如果边缘梯度值小于高阀值,大于低阀值,则标记为弱边缘点。小于低阀值的点则被抑制掉。这一步算法很简单。
1、边缘检测算法及各自优缺点https://www.jianshu.com/p/2a06c68f6c14
2、https://blog.csdn.net/u014485485/article/details/78339420
3、http://www.cnblogs.com/mightycode/p/6394810.html