OpenCV实战篇十八:亲手实现Sobel算子进行边缘检测指南
1. 前言
众所周知,在传统的图像边缘检测算法中,最常用的一种算法是利用Sobel算子完成的。Sobel算子一共有 个,一个是检测水平边缘的算子,另一个是检测垂直边缘的算子。
2. Sobel算子优缺点
Sobel算子的优点是可以利用快速卷积函数,简单有效,且对领域像素位置的影响做了加权,可以降低边缘模糊程度,有较好效果。然而Sobel算子并没有基于图像的灰度信息进行处理,所以在提取图像边缘信息的时候可能不会让人视觉满意。
3. 手动构造Sobel算子
我们来看一下怎么构造Sobel算子?
Sobel算子是在一个坐标轴的方向进行非归一化的高斯平滑,在另外一个坐标轴方向做一个差分, 大小的Sobel算子是由平滑算子和差分算子全卷积得到,其中 代表Sobel算子的半径,必须为奇数。
对于窗口大小为 的非归一化Sobel平滑算子等于 阶的二项式展开式的系数,而Sobel平滑算子等于 阶的二项式展开式的系数两侧补 ,然后向前差分。
举个例子:构造一个 阶的Sobel非归一化的Sobel平滑算子和Sobel差分算子:
Sobel平滑算子:取二项式的阶数为 ,然后计算展开式系数为, 也即是 ,这就是 阶的非归一化的Sobel平滑算子。
Sobel差分算子:取二项式的阶数为 ,然后计算二项展开式的系数,即为: ,两侧补 并且前向差分得到 ,第 项差分后可以直接删除。
Sobel算子:将 阶的Sobel平滑算子和Sobel差分算子进行全卷积,即可得到 的Sobel算子。
其中 方向的Sobel算子为:
而