Canny边缘检测原理与C++实现(1)原理部分
1 原理部分
1.1 滤波
1.1.1为什么要滤波?
1.1.2 高斯滤波
1.1.3 高斯核为3,7时的效果
1.2 梯度及方向角计算
1.3 非极大值抑制
在图像边缘区域,其附近梯度值往往都很大,为了满足最小响应标准,canny采用了非极大值抑制,
来去除真实边缘附近的其他梯度较大的区域。
非极大值抑制的思想是,沿着梯度方向,如果当前待检测像素的梯度不是最大值,那么,此像素就不是边缘。
为了简化计算,由于一个像素周围有八个像素,本文把一个像素的梯度方向离散为八个方向,如下图
把像素可能的360梯度方向分为8个扇区,每个扇区对应一个像素位置。这样就可以不利用插值,计算像素沿梯度方向前后的两个像素值。
这样,对于一个像素,其前后像素的计算就对应4种情况,比如像素p的梯度方向角为12.1度,
那么该像素沿着梯度方向前后的两个像素分别为(i-1,j+1),(i+1,j-1)。
高斯核分别为3,7时 ,经过非极大值抑制后的边缘
1.4 双阈值连接
经过以上3个步骤,我们已经可以得到一个经过非极大值抑制的边缘图像,如果没有什么特殊要求,这个边缘图像就可以利用了。
之所以要有双阈值连接这一步,是因为在获取图像边缘时,我们希望得到一些梯度比较大边缘,即得到一些特征较鲜明的边缘。
这样就必须设定一个阈值highThreshold来卡一下梯度值,只有图像梯度值大于highThreshold时才认为这些边缘特征鲜明。但是,
如下图, 只设定一个阈值会出现这样的问题,就是检测到的边缘不连续,
为了得到特征明显且连续的边缘,因此,canny采用了双阈值连接法。
即再设定一个低阈值,lowThreshold,用lowThreshold卡一下梯度图像,记录所用大于此阈值的像素位置,用来连接经过highThreshold阈值后
不连续的边缘。连接后图像如下,lowThreshold和highThreshold 一低 一高,为什么叫双阈值,相信一下就明白了吧。
双阈值连接效果,高斯核分别为3,7
实现部分见下篇博客