边缘是什么?
图像的边缘是指图像局部区域中亮度变化明显的部分,边缘位于像素的灰度值产生突变的地方。
边缘的正负之分:由暗到亮为正,由亮变暗为负。
图像的高频信号和低频信号
简单理解为,图像中高频分量(高频信号)是指图像的亮度/灰度变化剧烈的地方,也就是边缘;图像中低频分量(低频信号)是指图像亮度/灰度变化平缓的地方,对应图像中大片色块的地方。
边缘检测
边缘检测主要对图像的灰度变化进行度量、检测和定位。边缘检测算法主要基于图像亮度/灰度的一阶和二阶导数来实现的。
边缘检测的一般步骤:
1. 滤波:导数的求解中,图像的噪声会造成较大影响,因此要滤波来平滑噪声,但也要注意滤波往往会淡化边缘,因此要控制好滤波的度。
2. 增强:增强算法可以将图像灰度点邻阈强度值有显著变化的点凸显出来。
3. 边缘检测:经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定应用中,这些点并不是要找的边缘点,所以应该采用某些方法对这些点进行取舍。实际工程中,常用的方法是通过阈值化的方法进行检测。
Sobel检测算子
Sobel检测算子实现简单,效率较高,但边缘检测的准确度不如Canny算子。Sobel算子是高斯平滑和微分操作的的结合体,抗噪声能力较好,在许多关注效率、细节纹理不太关注的场景中使用非常合适。
Soble算子中间的权重为2不是1的原因是如果都使用1,过于平均,计算结果会像素的细节丢失。我们改改这个系数又可以得到其它的梯度算子,比如Scharr算子如下:
Laplacian算子
Laplacian算子使用二阶导数来检测边缘。2D图像有两个维度信息,因此需要在两个方向上求导:
对于不连续的函数,可以写为:
X和Y方向都进行此运算,然后相加,因此所使用的卷积核是:
这里的-4是因为对于X和Y方向上,中心位置的像素值f(x)和f(y)是一样的,因此X和Y方向上的二阶导相加后就是-4f(x)。
Canny算子
Canny算子检测算法是非常流行的边缘检测算法,目前也被认为是最优边缘检测算法。
Canny检测算法主要分为四个步骤:
1. 去噪:利用高斯滤波进行降噪处理。
2. 计算图像梯度:使用Sobel算子计算水平方向和垂直方向的一阶导Gx和Gy,根据这两个值找到梯度的幅值和方向:
若像素在边缘上,则其梯度方向总是和边缘垂直。
3. 非极大值抑制:非极大值抑制是指寻找像素点局部最大值。sobel算子检测出来的边缘太粗了,我们需要抑制那些梯度不够大的像素点,只保留最大的梯度,从而达到瘦边的目的。沿着梯度方向,比较它前面和后面的梯度值,梯度不够大的像素点很可能是某一条边缘的过渡点,排除非边缘像素,最后保留了一些细线。
以上图为例,我们得到了一副图的梯度和方向的表格,非极大值抑制的意思就是找到同一梯度方向上的梯度最大的值(图中黄色的像素)并保留,其它同方向梯度值较小的值不被保留。
4. 双阈值边界跟踪: 设置两个阈值Min和Max,这两个值的选取要根据实际图片来调整设置的,并非固定值。
根据当前边缘像素的梯度幅度与这两个阀值之间的关系,判断边缘的类型:
①当前边缘像素的梯度幅度大于或等于高阀值,当前边缘像素标记为强边缘(保留)。
②当前边缘像素的梯度幅度介于高阀值与低阀值之间,当前边缘像素标记为虚边缘(保留)。
③当前边缘像素的梯度幅度小于或等于低阀值,抑制当前边缘像素(抑制)。
对于虚边缘,进一步处理是根据其是否和强边缘相连来决定是否抑制,如果和强边缘相连则保留,否则抑制。如上图所示,B会被抑制,C会被保留。