边缘检测通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域,在一维空间中,类似的操作被称作步长检测。边缘是一幅图像中不同区域之间的边界线。边缘检测的目的是检测灰度急剧变化的区域。
前言
Canny边缘检测算法是由John Canny在1986年提出,它是一个多阶段的算法,由多个步骤构成。
一、Canny步骤
1、灰度化
2、高斯滤波
根据待滤波的像素点及其邻域点的灰度值按照一定的参数规则进行加权平均。这样可以有效滤去理想图像中叠加的高频噪声。重要的是需要理解,高斯卷积核大小的选择将影响Canny检测器的性能: 尺寸越大,检测器对噪声的敏感度越低,但是边缘检测的定位误差也将略有增加。一般5x5是一个比较不错的trade off。
3、检测图像中的水平、垂直、对角边缘
可以采用sobel算子等进行检测。
4、对梯度幅值进行非极大值抑制
非极大值抑制,简称为NMS算法,英文为Non-Maximum Suppression。 其思想是搜素局部最大值,抑制非极大值。
NMS算法在不同应用中的具体实现不太一样,但思想是一样的。对梯度幅值进行非极大值抑制:通俗意义上是指寻找像素点局部最大值,将非极大值点 所对应的灰度值置为0,这样可以剔除掉一大部分非边缘的点。
通俗意义上是指寻找像素点局部最大值,将非极大值点所对应的灰度值置为0,这样可以剔除掉一大部分非边缘的点。
1) 将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较。
2) 如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制(灰度值置为0)
5、双阈值算法检测和连接边缘
如果边缘像素的梯度值高于高阈值,则将其标记为强边缘像素;如果边缘像素的梯度值小于高阈值并且大于低阈值,则将其标记为弱边缘像素; 如果边缘像素的梯度值小于低阈值,则会被抑制。 双阈值检测: 大于高阈值为强边缘,小于低阈值不是边缘。介于中间是弱边缘。 阈值的选择取决于给定输入图像的内容。
二、实例
借用opencv的Canny接口进行实验
import cv2
img = cv2.imread('lenna.png',0)
img = cv2.GaussianBlur(img,(3, 3), 0) # 用高斯平滑图像
canny = cv2.Canny(img, 50, 150) # 调用Canny函数,指定最大和最小阈值,其中apertureSize默认为3。
cv2.imshow('Canny', canny)
cv2.waitKey(0)
cv2.destroyAllWindows()