一:边缘检测代码
cv2.Canny(img, minVal, maxVal) (minVal, maxVal代表双阈值)
img=cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)
v1=cv2.Canny(img,80,150)
v2=cv2.Canny(img,50,100)
res = np.hstack((v1,v2))
cv_show(res,'res')
img=cv2.imread("car.png",cv2.IMREAD_GRAYSCALE)
v1=cv2.Canny(img,120,250)
v2=cv2.Canny(img,50,100)
res = np.hstack((v1,v2))
cv_show(res,'res')
二:原理简述
Canny边缘检测
-
1) 使用高斯滤波器,以平滑图像,滤除噪声。
-
2) 计算图像中每个像素点的梯度强度和方向。
-
3) 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
-
4) 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
-
5) 通过抑制孤立的弱边缘最终完成边缘检测。
(1)高斯滤波器(针对每个像素点进行高斯滤波)
(2)计算梯度和方向(计算方向是为了接下来的非极大值抑制)
(3)非极大值抑制
这里所谓的非极大值抑制就是先寻找梯度方向,就是下面蓝色的直线。
再通过插值法求出dTmp1和dTmp2的像素值。
判断:判断C点的像素值是否比dTmp1和dTmp2大,如果不是,则去除掉。(即抑制)
(下面还有一种简单的方法,就是不用插值法,梯度方向就近取。例如dTmp1距离g2比较近,则直接取g2计算。)
(4)双阈值(就是代码中设定的)
如下图所示,超出自己设定的maxVal,则可以直接设定为边界。
低于minVal的直接抛弃。
在minVal和maxVal之间的,则考虑是否相邻的像素值是边界,是的话,则保留。否则抛弃。