边缘检测算法本质上就是一种滤波算法,只是有不同的滤波器可选,如sobel,canny,拉普拉斯等。

梯度的概念

图像梯度即当前所在像素点对X轴,Y轴的偏导数。也可以把梯度理解为像素灰度值变换的速度
而且因像素性质的特殊性,微积分在图像处理表现的形式为计算当前像素点沿偏微分方向的差值,所以并不需要求导,通过加减运算就能得到梯度。
梯度的模:在其最大变化率方向上的单位距离所增加的量。

Canny算子

Canny算子一般是我们在边缘检测的首选项。
主要思路是依据以下规则,识别最优边缘:

  1. 好的检测:算法能够尽可能多的标识出图像中的实际边缘
  2. 好的定位:标识出的边缘要与实际图像中实际边缘尽可能接近
  3. 最小响应:图像中的边缘只能标识一次,并可能存在的图像噪声不应该标识为边缘

    1.Canny算子的使用步骤

  4. 先使用高斯滤波除去图像中的高频噪声。

  5. 计算梯度图像与角度图像

图像的边缘可以指向不同的方向,于是经典的Canny算子使用了四个梯度算子来分别计算水平,垂直,对角线方向的梯度。但通常都不用四个梯度算子来分别计算四个方向,常用的边缘差分算子(Rober,Prewitt,Sobel)计算水平和垂直方向的差分。

  1. 对梯度图像进行非极大值抑制

在局部选最大的梯度值,抑制其他较小的梯度值(变为0)。

  1. 使用双阀值进行边缘连接

用一个高阀值和一个低阀值来区分边缘像素,如果边缘像素点梯度值大于高阀值,则被认为是强边缘点。如果边缘梯度值小于高阀值,大于低阀值,则被标记位弱边缘点。小于低阀值的点则被抑制掉。

Marr-Hildreth算子(也叫LOG)

Marr-Hildreth是基于二阶导数法的边缘检测算子。
主要是由于一个图像灰度值在编译平稳过渡,在一阶导后会得到一个凹平面或者一个凸平面,在求二阶导数后,会得到一个高值点和一个低值点,将这两个点连接起来会得到一个与X轴的交叉点,这一点就是我们所认为的边缘点。

1.Marr-Hildreth算子的使用步骤

  1. 使用高斯滤波去除高频噪声
  2. 计算拉普拉斯(Laplacian)二阶导

拉普拉斯滤波器也称为墨西哥草帽算子,因为其中一般为较大的负数,8邻域连通点为较小的正数值。如[1 1 1 1 -8 1 1 1 1] 或[0 1 0 1 -4 1 0 1 0]

  1. 计算零交叉

零交叉意味着两个相邻像素点的像素值异号,一共可能有左右,上下,两个对象四中情况,其中如果滤波后图像的任意像素的四种情况,其中一组的差值的绝对值超过了设定的阀值,我们就可以称其位一个零交叉像素点。

sobel算子

根据像素点上下,左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。
而灰度图像中的边缘一定是变化相对比较剧烈的区域,Sobel算子就是利用这个特性,根据这个区域灰度值的一阶导来检测编译。
Sx=[-1 0 1 -2 0 2 -1 0 1] 表示对X轴的边缘检测算子。
Sy=[1 2 1 0 0 0 -1 -2 -1] 表示对Y轴的边缘检测算子。
分别使用对原始图像进行滤波,最后将两个图融合在一起则得到了我们所需的梯度图像。

1.sobel算子的缺点

噪声污染无法排除,边缘线太过于粗宽

Prewitt算子

相比较sobel算子来说,prewitt算子并不加权。
例如[1 1 1 0 0 0 -1 -1 -1]和[-1 0 1 -1 0 1 -1 0 1]

Roberts算子

Roberts算子是一种局部差分算子。
Roberts算子算是2*2的算法模板。例如[1 0 0 -1]和[0 1 -1 0]。

总结

  1. 滤波器中所有元素之和应为0,这样才能保证滤波前后图像总体灰度值不变。
  2. Roberts算子,Sobel算子,Prewitt算子运算速率高,对噪声也有一定抑制作用,但检测出的边缘质量不高,如边缘较粗,定位不准,间断点多。
  3. Canny算子不容易受噪声干扰,得到的边缘精细并且准确,缺点是运算代价较高,难以用于实时图像处理,适合运用于高精度要求的应用。
  4. Marr-Hildreth算子边缘检测效果相对较优,但对于噪声比较敏感。