Canny算子
Canny算子对边缘处理的会比Sobel等算子更加细致,他的边缘细致到单个像素的层面
为什么通过比较梯度的大小就可以判断边缘:梯度往往会比周围的点更加明亮,所以在求导后即梯度较其他点大。
流程:转灰度图 —> 平滑处理(高斯滤波) —> 计算每点的梯度和梯度方向(Sobel算子等)—>非极大值抑制(筛选边缘)—>双阈值进一步筛选边缘
1.非极大值抑制
在用Sobel等算子计算出每个点的梯度后,需要筛选这些点是否可能属于边缘,放入候选
以3*3卷积核为例,如上图,一共有9个像素点,现在求得中心点C的梯度以及方向如蓝色线所示。易知梯度方向和边缘方向肯定是垂直的,如果点C的值在梯度方向上是这个3 * 3的卷积核的最大值(即局部极大值),则C可能属于边缘,放入候选进入下一步。如果C不是极大值,则置0。
一种方法是采用线性插值法,如上图所示,C所在的梯度方向并没有经过像素点,而是交于dTmp1,dTmp2两点,这时需要通过交点两边的点来按距离远近加权平均求得dTmp1,dTmp2的值,再来与C比较,具体公式如下