1、Canny边缘检测流程
a、使用高斯滤波器,以平滑图像,滤除噪声。
b、计算图像中每个像素点的梯度强度和方向。
c、应用非极大值抑制,以消除边缘检测带来的杂散效应。
d、应用双阈值检测来确定真实的和潜在的边缘。
e、通过抑制孤立的弱边缘最终完成边缘检测。
2、高斯滤波器
a、高斯核模板
b、高斯滤波计算
3、梯度和方向
上面公式中右边的表示水平方向和竖直方向的sobel模板,G表示像素点梯度,表示像素点方向,其中表示像素点水平方向和竖直方向的梯度值。
4、非极大值(NMS)抑制
a、线性插值法
假设像素点c的梯度方向为下图的蓝色直线,则该直线与像素的邻近像素点有两个交点dTmp1和dTmp2,但由于该两个点为亚像素点(实际不存在的像素点),因为需要利用线性插值法来进行插值。
如上图所示,假设的梯度幅值为、的梯度幅值为,则dTmp1为,其中
NMS抑制:像素点c如果比dTmp1和dTmp2都大就保留该像素点,否则就会被抑制掉。
b、简便方法
上面所述中,像素点的梯度方向的交点与哪个方向的邻近像素点最近,就计算哪个方向的梯度幅值。
5、双阈值检测
上面所述的连有边界是指如果与已确定的边界相连就保留,否则就舍弃。
ps:阈值设定较小则可以显示更加细致的边界信息,但过小则容易产生噪声。
6、Canny代码效果
import cv2
img=cv2.imread("car.jpg",cv2.GRAYSCALE)
v1=cv2.Canny(img,120,250)
v2=cv2.Canny(img,50,100)
res=cv2.hstack((v1,v2))
cv2.imshow("res",res)
cv2.waitKey()
cv2.destroyAllWindows()