以下部分文字,图片摘自1-Canny边缘检测流程_哔哩哔哩_bilibili
Canny边缘检测流程
利用高斯滤波,使图像平滑
计算图像中的每个像素点的梯度强度与梯度方向
利用"非极大值抑制"来,消除边缘检测带来的杂散响应(即,检测某个值在一定范围内是否为极大值,是则保留,不是则舍去)
利用双阈值确定边界
排除孤立的弱边缘,完成检测
高斯滤波器
![](https://i-blog.csdnimg.cn/blog_migrate/3bd7390ced88398cfeaa88da432cc5c1.png)
计算梯度大小和方向(Sobel算子)
梯度大小:可参考opencv初学(图像07)_XUAN-John的博客-CSDN博客
梯度方向:
![](https://i-blog.csdnimg.cn/blog_migrate/7afa3c6f718c7d3ee73edbdb4460a503.png)
梯度方向与边界垂直
非极大值抑制
对每一个像素点,在其梯度方向上判断其梯度大小是否为极大值,若是则保留,不是则忽略。(这里我不知道为啥要这样,欢迎大佬指正)
线性插值法
![](https://i-blog.csdnimg.cn/blog_migrate/0e04f858cab72eba7caf6200ea362c90.jpeg)
简便平替
![](https://i-blog.csdnimg.cn/blog_migrate/c069adcb54abcd1db06ae07653415e06.png)
双阈值
若maxVal偏小,minVal偏大:边界变多,可能会出现杂散项
若maxVal偏大,minVal偏小:边界变少,可能识别不出边界
![](https://i-blog.csdnimg.cn/blog_migrate/769a13049907ca647f55af48544fdaf3.png)
代码
img_afterCanny=cv2.Canny(img,minVal,maxVal)
"""
Canny边缘检测流程
"""
import cv2
import numpy as np
def cv_show(name,image):
cv2.imshow(name,image)
cv2.waitKey()
cv2.destroyAllWindows()
img=cv2.imread('D:/BaiduNetdiskDownload/opencv/AMIYA.jpg',cv2.IMREAD_GRAYSCALE)
Canny_1=cv2.Canny(img,100,150)
Canny_2=cv2.Canny(img,50,120)
combine=np.hstack((Canny_1,Canny_2))
combine=cv2.resize(combine,(0,0),fx=0.3,fy=0.3)
cv_show('11',combine)
运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/41412f4d19a2e42ff2b64978bb44e7c6.png)