边缘检测

Posted by zhaogs on March 7, 2022

本专题会记录一下计算机视觉课程的上课内容中的笔记,主要针对其中的一些方法进行过程描述与理解,在整体上进行理解算法的内容。

1. 边缘

边缘包括物体的边界、表面方向的改变、不同的颜色、光照明暗的变化,可以看到边缘的位置往往是图像中亮度变化比较剧烈的地方,也即图像的高频分量处于的位置,这些地方往往拥有更多的细节信息,相对而言,那些平坦区域的低频分量可以认为是冗余信息,是可以舍去的,同时这些区域没有太多的细节信息又占据了图像的大多部分,这些高频的细节信息可以代表整张图像,即作为图像的特征,因此边缘检测可以有效提取图像特征,方便做图像后续处理。

2. 边缘检测的方法

边缘处最突出的特征就是两侧亮度发生明显的变化,因此基于这个特征可以实现对图像的边缘提取。边缘检测根据检测方法可以分为两大类,第一类是一阶微分算子,即对图像求一阶导,检测最大值,最大值即为边缘所处位置,例如Prewitt、Sobel算子;另一类是二阶微分算子,对图像求二阶导,检测过零点,零点所处位置即一阶导的最大值位置,即为图像的边缘位置,例如Laplacian算子。

在真实世界中,噪声是不可避免的,同时这些噪声导致图像产生波动的一阶导会有很多局部最大值,二阶导会存在很多过零点,导致边缘检测受噪声影响很大,为了解决这个问题,就需要在边缘检测算法之前对图像进行平滑滤波,做一个简单的降噪处理,这样可以有效降低噪声的影响。

1. Prewitt

Prewitt算子设置周围像素点对中心像素点的贡献相同,因此可以可以得到如下的两个算子

edge_1

从算子的结构可以看出此算子可以用来提取图像的水平边缘与垂直边缘,同时该算子还可以平滑另一个方向上的噪声

2. Sobel

与Prewitt算子相似,Sobel算子根据距离中心像素点的位置调整了周围像素点的权重,具体如下

edge_2

3. LoG(Laplacian of Gaussian)

与上述两个算子不同,这个方法是使用二阶微分算子来实现,laplacian算子的结构如下

edge_3

由于laplacian算子对噪声比较敏感,直接使用此算子对图像进行边缘检测效果不是很好,因此在使用此算子之前可以使用Gaussian函数对图像进行平滑滤波,将这两步结合可以得到LoG算子

edge_4

可以看出Laplacian算子与LoG算子,都是使用一个算子来实现对图像的边缘提取,这使得在提取图像是边缘特征时,只能得到边缘的赋值大小,而不能得到边缘的方向信息。

4. Canny

Canny边缘检测算法的过程,

  1. 使用Sobel算子计算图像的梯度,包括赋值大小与方向。

  2. 对图像梯度进行非极大值抑制,即对图像中的任意一个点,在其梯度方向与方向上的邻域内分别找n个点,若都小于中心像素点则保留,否则将中心像素点置0。

  3. 双阈值提取边缘点,即使用一个高阈值和一个低阈值来分别对图像梯度进行分类,对于高于高阈值的像素点可以认为一定是边缘点,对于低于低阈值的像素点可以认为一定不是边缘点,对于在这两个阈值之间的还需要进一步的判断才可以,判断标准如下:对于这其中的每一个像素点,对其周围\(3\times3\)的邻域内如果存在一个边缘点,则可以把此像素点认为是边缘点,否则将其分为非边缘点。