非极大值抑制#
因为后续的边缘检测算子计算结果均是梯度幅值图,若要得到最终的边缘图,需要对梯度幅值图进行非极大值抑制
非极大值抑制的核心思想是:对于每个像素点,比较其梯度幅值与其在梯度方向上的两个邻居的梯度幅值,如果该像素点的梯度幅值不是最大的,则将其设为0
目的就是找出局部最大值,保留边缘的细节,同时抑制非边缘的噪声
Sobel算子#
Sobel算子通过计算图像在水平和垂直方向上的梯度来检测边缘
垂直方向卷积核:
Gx=−1−2−1000121水平方向卷积核:
Gy=10−120−210−1图像任意一点的总梯度强度(梯度幅值):
G=Gx2+Gy2绝对值近似G≈∣Gx∣+∣Gy∣,计算更快
Prewitt算子#
Prewitt算子与Sobel算子类似,也是通过计算图像在水平和垂直方向上的梯度来检测边缘,但Prewitt不考虑更近的像素的权重,权重均为1
垂直方向卷积核:
Gx=−1−1−1000111水平方向卷积核:
Gy=10−110−110−1后续和Sobel算子一样
Laplacian算子#
Laplacian算子通过计算图像的二阶导数来检测边缘,能够检测到图像中灰度值变化较大的区域
Kernel=0101−41010计算的是中心像素与其四个邻居像素的灰度值之差的总和,因此对变化非常敏感,能检测出非常细的边缘,但导致对噪声也非常敏感
Canny算子#
Canny算子是一种多阶段的边缘检测算法,包含以下步骤:
- 使用高斯滤波器对图像进行平滑,减少噪声的影响
- 计算图像的梯度幅值和方向,使用Sobel算子或Prewitt算子
- 进行非极大值抑制,保留局部最大值,抑制非边缘的噪声
- 使用双阈值算法连接边缘,确定哪些边缘是强边缘,哪些是弱边缘,并连接强边缘和弱边缘
- 滞后边界追踪,连接强边缘和弱边缘,形成完整的边缘图
双阈值算法#
边缘分为强边缘和弱边缘
强边缘={(x,y)∣G(x,y)≥Thigh}弱(潜在)边缘={(x,y)∣Tlow≤G(x,y)<Thigh}丢弃={(x,y)∣G(x,y)<Tlow}滞后边界追踪#
对于每个强边缘像素,检查其8邻域,如果邻域内有弱边缘像素,则将该弱边缘像素也标记为强边缘,继续检查该弱边缘像素的8邻域,直到没有更多的弱边缘像素被连接为止