使用微分的方法即可完成边缘检测的任务,也就是说卷积模板锐化的方法都可以拿来做边缘检测,但像Sobel算子存在一些问题:
- 没有充分利用边缘梯度方向
- 阈值设定会极大影响检测效果,阈值设定过大,会丢失很多边缘信息;阈值设定过小,会有很多噪声
Canny边缘检测做了两个改进:
- 基于边缘梯度方向的非极大值抑制
- 双阈值的滞后阈值处理
Canny边缘检测算法介绍
- 通常来讲,第一步是要对图像做平滑处理,过滤掉噪声
- 使用x方向和y方向的两个Sobel卷积核,与图像进行卷积运算,分别得到
和
。然后计算边缘强度(梯度幅值)
3. Canny不像Sobel那样对magnitude做255的截断,而是利用
其中,
要注意坐标轴的方向
![28de19e429f3eb02015f840c150a3781.png](https://i-blog.csdnimg.cn/blog_migrate/31a1be720fcd2db32574a6dafcd066ba.png)
4. 对每一个位置做非极大值抑制NMS处理,保留当前点邻域内梯度方向上的最大的梯度,其余的置零,在比较梯度的时候实际上是当前点与梯度方向的两侧的点的梯度加权相比。
具体的比较方法要分为四种情况:
- 第一种情况:
![e6ec35bd19ea46a2db7d5c5aa5a0df24.png](https://i-blog.csdnimg.cn/blog_migrate/cc7945f1c65f26a479dd1f2e72da68c3.png)
这种情况下,
左上和上面的两个像素点的梯度加权可表示为
- 第二种情况:
![604ec89fbc69e8afd9c4435808ffb9a2.png](https://i-blog.csdnimg.cn/blog_migrate/a472a582efdb85015a1c9c890e15707e.png)
同样,
则右上角和上面两个像素点的梯度加权可表示为
左下和下面的两个像素点的梯度加权可表示为
- 第三种情况:
![0f925600e6ef5f8908e18d9fef87714f.png](https://i-blog.csdnimg.cn/blog_migrate/b5dbd88732f6dbadc7894cec956f654d.png)
则左上角和左面两个像素点的梯度加权可表示为
右下和右面的两个像素点的梯度加权可表示为
- 第四种情况:
![ef7a479bb118270e007e8dc04bd1489c.png](https://i-blog.csdnimg.cn/blog_migrate/b5c6eb186fc0999012c17e775eb31c5c.png)
同样,
则左下角和左面两个像素点的梯度加权可表示为
右上和右面的两个像素点的梯度加权可表示为
以上就是四种情况的介绍,接下来要与两个加权做比较
如果
需要注意的是,如果
5. 双阈值的滞后处理。使用的是两个阈值,高阈值和低阈值。按照三个规则进行阈值化处理:
- 边缘强度大于高阈值的作为边缘点
- 边缘强度小于低阈值的点直接剔除
- 边缘强度在双阈值之间的点,需要判断该点邻域的八个点是否能和当前点连通,即八个点中是否包含足够数量的边缘点,数量设定为1即可
代码
import
![7a15367613bbf2e26270eb54702eb710.png](https://i-blog.csdnimg.cn/blog_migrate/d8b9d6931e8103e1f593312246f74eda.jpeg)
从图中可以看出,40-150的双阈值消去了0-150单阈值的一些杂乱的边缘细节,同时比40-255的细节更完整