本文主要是介绍边缘检测算子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
边缘是指图像中像素值突变的地方。图像的显著变化部位通常反映了图像的重要特征。
边缘检测方法可以大致分为两大类:基于查找和基于零穿越。基于查找的方法是通过寻找图像中一阶导数中的最大和最小值来检测边缘,通常将边界定位在梯度值最大的方向。基于零穿越的方法是通过寻找图像二阶导数零穿越来寻找边界。
一阶微分算子
一阶微分边缘算子也称为梯度边缘算子,它是利用图像在边缘处的阶跃性,即图像梯度在边缘取得极大值的特性进行边缘检测。梯度是
一个矢量,它具有方向和模:
梯度的方向提供了边缘的趋势信息,因为梯度方向始终是垂直于边缘方向,梯度的模值大小提供了边缘的强度信息。
在实际使用中,通常利用有限差分进行梯度近似:
Roberts边缘检测算子
1963年,Roberts提出了这种寻找边缘的算子。Roberts边缘算子是一个2x2的模板,采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,边缘定位较准,对噪声敏感。在Roberts检测算子中:
可以导出Roberts在点(i+1/2,j+1/2)(i+1/2,j+1/2)处的水平与竖直边缘检测卷积核为:
Prewitt边缘检测算子
Prewitt利用周围邻域8个点的灰度值来估计中心的梯度,是一种平均滤波,它的梯度计算公式如下:
所以,Prewitt的卷积核为:
Sobel算子
以离散型的差分算子计算图像亮度函数梯度的近似值,是一种基于一阶导数的边缘检测算子。由于该算子引入了类似局部平均的运算,因此对噪声具有平滑的作用。
比起Prewitt算子,Sobel也是用周围8个像素来估计中心像素的梯度,是一种加权平均滤波,但是Sobel算子认为靠近中心像素的点应该给予更高的权重,所以Sobel算子把与中心像素4邻接的像素的权重设置为2或-2。
Sobel边缘检测算子的卷积核为:
Canny边缘检测算子
Canny提出了边缘检测算子优劣评判的三条标准:
- 高的检测率。边缘检测算子应该只对边缘进行响应,检测算子不漏检任何边缘,也不应该将非边缘标记为边缘。
- 精确定位。检测到的边缘与实际边缘之间的距离要尽可能的小。
- 明确的响应。对每一条边缘只有一次响应,只得到一个点。
Canny边缘检测主要分四步进行:
1.去噪;
2.计算梯度和方向角;
3.非极大值抑制;
4.滞后阈值化。
非极大值抑制
根据上图可知,要进行非极大值抑制,就首先要确定像素点C的灰度值在其8值邻域内是否为最大。图中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大值肯定分布在这条线上,也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值。因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点。如果经过判断,C点灰度值小于这两个点中的任一个,那就说明C点不是局部极大值,那么则可以排除C点为边缘。这就是非极大值抑制的工作原理。
滞后阈值化
由于噪声的影响,经常会在本应该连续的边缘出现断裂的问题。滞后阈值化设定两个阈值:一个为高阈值ThTh,一个为低阈值TlTl。如果任何像素边缘算子的影响超过高阈值,将这些像素标记为边缘;响应超过低阈值(高低阈值之间)的像素,如果与已经标记为边缘的像素4-邻接或8-邻接,则将这些像素也标记为边缘。所以不整个过程描述如下:
- 如果该像素的梯度值小于TlTl,则该像素为非边缘像素;
- 如果该像素的梯度值大于ThTh,则该像素为边缘像素;
- 如果该像素的梯度值介于TlTl与ThTh之间,需要进一步检测该像素的3×33×3邻域内的8个点,如果这8个点内有一个或以上的点梯度超过了ThTh,则该像素为边缘像素,否则不是边缘像素。
二阶微分算子
边缘是图像的一阶导数局部最大值的地方,那么也意味着该点的二阶导数为零。二阶微分边缘检测算子就是利用图像在边缘处的阶跃性导致图像二阶微分在边缘处出现零值这一特性进行边缘检测的。
Laplace边缘检测算子
近似为:
对应的二阶微分卷积核为:
所以二阶微分检测边缘的方法就分两步:1)用上面的Laplace核与图像进行卷积;2)对卷积后的图像,取得那些卷积结果为0的点。
虽然上述使用二阶微分检测边缘的方法简单,但它的缺点是对噪声十分敏感,同时也没有能够提供边缘的方向信息。
LOG方法
为了实现对噪声的抑制,Marr等提出了LOG的方法。
为了减少噪声对边缘的影响,首先图像要进行低通滤波,LOG采用了高斯函数作为低通滤波器。高斯函数为:
参考:
[1] https://www.cnblogs.com/ronny/p/4001910.html
这篇关于边缘检测算子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!