Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论解释这项技术如何工作。
Canny边缘检测算法可以分为以下5个步骤:
- 应用高斯滤波来平滑图像,目的是去除噪声
- 找寻图像的强度梯度(intensity gradients)
- 应用非最大抑制(non-maximum suppression)技术来消除边误检(本来不是但检测出来是)
- 应用双阈值的方法来决定可能的(潜在的)边界
- 利用滞后技术来跟踪边界
Canny边缘检测的公式推导:
- 高斯滤波:对图像进行平滑处理
- 计算梯度幅度和方向(采用Sobel算子)
- 非极大值抑制
- 双阈值检测
Canny算法代码实现
#opencv读取的格式是BGR
import cv2
import numpy as np
#Matplotlib是RGB
import matplotlib.pyplot as plt
%matplotlib inline
#显示图像的函数
def cv_show(img,name):
cv2.imshow(name,img)
cv2.waitKey()
cv2.destroyAllWindows()
#读取图像
img=cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)
#80 和150 分别为最大和最小的阈值,当阈值比较的大获取较少的边缘 阈值较大获取较多的边缘信息
v1=cv2.Canny(img,80,150)
v2=cv2.Canny(img,50,100)
#hstark:横向输出两张图片
res = np.hstack((v1,v2))
cv_show(res,'res'