1、Canny边缘检测流程
a、使用高斯滤波器,以平滑图像,滤除噪声。
b、计算图像中每个像素点的梯度强度和方向。
c、应用非极大值抑制,以消除边缘检测带来的杂散效应。
d、应用双阈值检测来确定真实的和潜在的边缘。
e、通过抑制孤立的弱边缘最终完成边缘检测。
2、高斯滤波器
a、高斯核模板
![](https://i-blog.csdnimg.cn/blog_migrate/5cdbb2f683f7b3a81aed15f0bab2996f.png)
b、高斯滤波计算
![](https://i-blog.csdnimg.cn/blog_migrate/6d461362f7e7ff6137a3e1c28c27659d.png)
3、梯度和方向
![](https://i-blog.csdnimg.cn/blog_migrate/285f38870aa6c4a03e01ac45a8ecc967.png)
上面公式中右边的表示水平方向和竖直方向的sobel模板,G表示像素点梯度,
表示像素点方向,其中
表示像素点水平方向和竖直方向的梯度值。
![](https://i-blog.csdnimg.cn/blog_migrate/4b8a2115fb78b66c90d353d16eeb0af2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a6560f4947642bc0fc4ffa2dc16a8cf4.png)
4、非极大值(NMS)抑制
a、线性插值法
假设像素点c的梯度方向为下图的蓝色直线,则该直线与像素的邻近像素点有两个交点dTmp1和dTmp2,但由于该两个点为亚像素点(实际不存在的像素点),因为需要利用线性插值法来进行插值。
![](https://i-blog.csdnimg.cn/blog_migrate/3bce96a6af6b100119058125887b57bc.png)
如上图所示,假设的梯度幅值为
、
的梯度幅值为
,则dTmp1为
,其中
NMS抑制:像素点c如果比dTmp1和dTmp2都大就保留该像素点,否则就会被抑制掉。
b、简便方法
![](https://i-blog.csdnimg.cn/blog_migrate/04fe1b6d60c650fb425997c0746544ba.png)
上面所述中,像素点的梯度方向的交点与哪个方向的邻近像素点最近,就计算哪个方向的梯度幅值。
5、双阈值检测
![](https://i-blog.csdnimg.cn/blog_migrate/4961f0e21dc8b11b420c45cba3276ddd.png)
上面所述的连有边界是指如果与已确定的边界相连就保留,否则就舍弃。
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()
![](https://i-blog.csdnimg.cn/blog_migrate/b33210fbd5d68a8cae6c2253378b9f3e.png)