1.原理
梯度简单来说就是求导。OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel
,Scharr
和Laplacian
。
Sobel,Scharr 其实就是求一阶或二阶导数。Scharr 是对Sobel的优化(使用小的卷积核求解求解梯度角度时)。Laplacian 是求二阶导数。
2.Sobel算子
- cv.Sobel()
sobelx=cv2.Sobel(gray,cv2.CV_64F,1,0,ksize=5)
参数按顺序为:原图、输出图像的深度、x方向求导的阶数、y方向求导的阶数、卷积核大小。
Sobel 算子是高斯平滑与微分操作的结合体,所以它的抗噪声能力很好。如果ksize=-1,会使用3x3 的Scharr 滤波器,它的的效果要比3x3 的Sobel 滤波器好(而且速度相同,所以在使用3x3 滤波器时应该尽量使用Scharr 滤波器)。3x3 的Scharr 滤波器卷积核如下:
3.Laplacian算子
- cv.Laplacian()
laplacian=cv2.Laplacian(gray,cv2.CV_64F)
拉普拉斯算子可以使用二阶导数的形式定义,可假设其离散实现类似于二阶Sobel 导数,事实上,OpenCV 在计算拉普拉斯算子时直接调用Sobel 算子。
4.代码和效果
def gradient(self):
gray=cv2.imread(self.infile,0)