Canny的实现
1.使用高斯滤波器,以平滑图像,滤除噪声
这一步的主要作用是去除噪声,因为噪声在边界识别上也属于高频信号,容易被识别为伪边缘。使用高斯模糊去除噪声,可降低伪边缘的识别;同时,高斯模糊的半径选择很重要,过大的半径很容易使一些弱边缘检测不到。
2.计算图中每个像素点的梯度强度和方向
此处使用Sobel算子计算梯度,近似计算为上下、左右、两个对角线,4个方向的梯度;
梯度方向角:θ=arctan(Gy/Gx)
梯度计算输出数据为二元数,包含梯度值与角度值,如(2,90)表示梯度值为2,方向为竖直向上;
根据梯度方向角的计算,梯度方向近似到上下、左右、两个对角线四个方向(考虑梯度正负,实则为8个方向)
3.应用非极大值抑制,以消除边缘检测带来的散杂相应
通常出来的梯度边缘不止一个像素宽,而是多个像素;而边缘检测的准则3要求,边缘只有一个精确的点的宽度。
非极大值抑制能帮助保留局部最大梯度,而抑制其他所有梯度值,这以为着只保留了梯度变化中最锐利的位置
方法1
方法2
4.应用双阈值检测来确定真实和潜在的边缘
dst=cv2.Canny(img,minVal,maxVal)
阈值过低会导致过多噪点被检测,阈值过高会导致部分弱边界无法检测
5.通过抑制孤立的弱边缘最终完成边缘检测
原理:弱边缘点有可能是真的边缘,也有可能是噪点或颜色变化引起的;该算法搜索所有联通的弱边缘,如果一条连通的弱边缘的任何一个点和强边缘联通,则保留这条弱边缘,否则抑制。