1、高通滤波器
高通滤波器可去除图像中的低频成分并增强高频成分,因此当高通滤波器应用于图像时,将可去除属于低频范围的背景并增强属于高频成分的边缘,因此高通滤波器也称为边缘检测器。滤波器的系数需要改变,否则就会与上一节中的滤波器相类似。目前有许多高通滤波器可供选择,如下所示:
Sobel滤波器
Scharr滤波器
Laplacian滤波器
1.1、Sobel滤波器
Sobel算子或Sobel滤波器是一种广泛用于边缘检测应用的图像处理和计算机视觉算法,是一个3×3滤波器,近似于图像强度的梯度函数,针对水平和竖直方向的梯度提供各自独立的滤波器来计算,使用与本章前面所述相类似的图像卷积方法。水平和竖直3×3 Sobel滤波器如下:
实现这个Sobel滤波器的代码如下:
OpenCV提供了用于实现Sobel滤波器的createSobelFilter函数,它需要很多参数:前两个参数是源图像和目标图像的数据类型;第三、四个参数分别是x和y导数的阶(order),给定1和0去计算x导数或竖直边缘,并给定0和1去计算y导数或水平边缘;第五个参数是可选参数,表示内核的大小,默认值为3;还有个可选参数,作为导数的规模。
为了同时看到水平和竖直边缘,将x导数和y导数的结果相加,结果如图:
以上结果分别是原始图像、Sobel-x导数、Sobel-y导数和Sobel-xy导数输出结果。
Sobel算子提供的导数近似值虽然并不准确,但在计算机视觉应用中的边缘检测中依旧非常有用,它缺乏旋转对称性。为了克服这个问题,就需要Scharr算子的辅助。
1.2、Scharr滤波器
由于Sobel不提供旋转对称性,因此使用Scharr算子通过不同的滤波器掩码来克服此问题,如下所示:
从上面的掩码中可以看出,Scharr算子对中心行或中心列赋予更多权重以查找边缘,实现Scharr滤波器的程序如下:
OpenCV提供了用于实现Scharr滤波器的createScharrFilter函数,它需要很多参数:前两个参数是源图像和目标图像的数据类型,第三、四个参数分别是x和y导数阶,给定1,0去计算x导数或竖直边缘,并给定0,1去计算y导数或水平边缘;第五个参数是可选项,表示内核的大小,默认值为3。
为了同时看到水平和竖直边缘,将x导数和y导数的结果相加,结果如图:
以上结果分别是原始图像、Scharr-x导数、Scharr-y导数和Scharr-xy导数输出结果。
1.3、拉普拉斯滤波器
拉普拉斯滤波器也是一种用于找出图像边缘的微分算子,区别于Sobel和Scharr的一阶微分算子,拉普拉斯是一种二阶微分算子,可以同时在水平和竖直方向上找到边缘,这与Sobel和Scharr算子不同。拉普拉斯滤波器计算二阶导数,对图像中的噪声是非常敏感的,因此在使用拉普拉斯滤波器之前最好对图像进行模糊处理并去除噪声。实现拉普拉斯滤波器的代码如下:
通过createLaplacianFilter函数,生成内核大小为1和3的两种拉普拉斯滤波器来处理图像,除了内核的大小之外,该函数还需要源图像和目标图像的数据类型作为参数。使用apply方法来创建拉普拉斯滤波器,并应用于图像处理。拉普拉斯滤波器的输出如图:
总结本部分,描述了不同的高通滤波器,包括Sobel、Scharr和Laplacian三种滤波器。
其中Sobel和Scharr用一阶微分算子去计算边缘,对噪声不太敏感;
拉普拉斯算子是用二阶导数算子去计算边缘的,对噪声则是非常敏感的。