1 检测流程 去噪:用高斯滤波器,平滑图像,消除噪声计算图像中每个像素点的梯度强度和方向应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散相应:只留下明显的梯度应用双阈值(Double-Threshold)检测来确定真实和潜在的边缘抑制孤立的边缘 2 相关概念 2.1 非极大值抑制本文为《OpenCV计算机视觉实战》的课程笔记。
基本思路就是将当前点和邻近进行比较,若当前点是一个极大值则保留。
2.1.1 线性插值法如图所示,g2、g3为c点的相邻像素,蓝色的斜线为梯度方向,斜线与红线的交点称亚像素(非实际存在的像素点)。
现在要判断c是否为极大值点,即比较是否M(c)>M(dTmp1)且M(c)>M(dTemp2)
设g1的梯度幅度值为M(g1),g2的梯度幅度值为M(g2),则:
M ( d T e m p 1 ) = w × M ( g 2 ) + ( 1 − w ) × M ( g 1 ) M(dTemp1)=w×M(g2)+(1-w)×M(g1) M(dTemp1)=w×M(g2)+(1−w)×M(g1)
其中 w = d i s t a n c e ( d T e m p 1 , g 2 ) d i s t a n c e ( g 1 , g 2 ) w=frac{distance(dTemp1, g2)}{distance(g1,g2)} w=distance(g1,g2)distance(dTemp1,g2), d i s t a n c e ( g 1 , g 2 ) distance(g1,g2) distance(g1,g2)为g1、g2间的距离。
2.1.2 简化方法仅比较锚点周围的8个方向中距离较近的点。
2.2 双阈值检测1、设置两个边界阈值:maxVal和minVal
2、若 梯 度 值 > m a x V a l 梯度值>maxVal 梯度值>maxVal :像素点保留为边界点
3、若 梯 度 值 < m a x V a l 梯度值 4、若 m i n V a l < 梯 度 值 < m a x V a l minVal<梯度值 当minVal、maxVal取得相对较小,则条件相对宽松,反之条件越苛刻,舍弃掉的点也就越多。 img = cv2.imread('./img/cat.jpg',cv2.IMREAD_GRAYSCALE)img = cv2.resize(img,(300, 300))v1 = cv2.Canny(img, 85, 175)v2 = cv2.Canny(img, 140, 185)cv_show('Canny',np.hstack((img, v1, v2)))