目录
简介
实现步骤
代码
原图
效果图
简介
Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法。
实现步骤
step1:去噪。噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉。
方法:图像边缘容易受到噪声的干扰,因此为了避免检测到错误的边缘信息,通常需要使用滤波去噪,平滑一些纹理弱的非边缘区域,从而得到更准确的边缘,通常使用高斯噪声。
step2:计算梯度的幅度与方向。
方法:梯度的方向与边缘总是垂直的,通常就近取值为水平(左右)、垂直(上下)、对角线(右上,左上,左下,右下)等8个不同方向。因此在计算梯度时会得到梯度的幅度和角度(代表梯度的方向)。
step3:非极大值抑制,即适当地让边缘“变瘦”。
方法:逐一遍历像素点,判断当前像素点是否是周围像素点中具有相同梯度方向的最大值,并根据判断结果决定是否抑制该点。如果该点是正/负梯度方向上的局部最大值,则保留该点。如果不是,则抑制该点(归零)。
step4:确定边缘。使用双阈值算法确定最终的边缘信息。
方法:完成上述步骤后,图像内的强边缘已经在当前获取的边缘图像内,但是一些虚边缘可能也在边缘图像内,这些虚边缘可能是真实图像产生的,也可能是由于噪声所产生的。对于后者,必须将其剔除。
设置两个阈值,其中一个为MaxVal,另外一个为低阈值minVal,根据梯度幅度,与两个阈值之间的关系,判断边缘的属性,具体步骤为:
(1)如果当前的边缘像素的梯度值大于或等于maxVal,则将当前边缘像素标记为强边缘;
(2)如果当前边缘像素的梯度值介于maxVal与minVal之间,则将当前边缘像素标记为虚边缘(需要保留);
(3)如果当前边缘像素的梯度值小于或等于minVal,则抑制当前边缘像素。
经过上述过程,获得虚边缘,此时通过判断虚边缘与强边缘是否连接,如果与强边缘连接,则将该边缘处理为边缘,如果与强边缘无连接,则该边缘为弱连接,将其抑制。
代码
import cv2
test = cv2.imread('test.jpg',cv2.IMREAD_GRAYSCALE)
r = cv2.Canny(test,128,200)
cv2.imshow('test',r)
cv2.waitKey(0)
原图
效果图
|