参照教程《学习Opencv3》第十章卷积与滤波
梯度本质就是求导数,Opencv中都是近似求导数,至于算子模板为什么要设置特定的矩阵,参考以下两篇文章
https://www.zhihu.com/question/26822364/answer/1168914135
https://blog.csdn.net/yanghan742915081/article/details/84679629
Sobel算子是高斯平滑与微分操作的结合体,它的抗噪音能力很好。可以设定求导的方向(xorder或yorder)。还可以设定使用的卷积核的大小(ksize),如果ksize=-1,会使用3x3的Scharr滤波器,效果会更好,若速度相同,在使用3x3滤波器时尽量使用Scharr。
拉普拉斯算子可以使用二阶导数的形式定义,可假设其离散实现类似于二阶Sobel导数,事实上OpenCV在计算拉普拉斯算子时直接调用Sobel算子。
拉普拉斯滤波器使用的卷积核:
0 | 1 | 0 |
1 | -4 | 1 |
0 | 1 | 0 |
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
%matplotlib qt5
#通道转换函数,使用plt显示opencv读取的图像
def bgr2rgb(img):
h,w,c = img.shape
b,g,r = cv.split(img)
img_rgb=cv.merge([r,g,b])
return img_rgb
img = cv.imread("E:\\opencv2020\\picture\\mudan.jpg")
laplacian = cv.Laplacian(img,cv.CV_64F)
sobelx = cv.Sobel(img,cv.CV_64F,1,0,ksize = 5)
sobely = cv.Sobel(img,cv.CV_64F,0,1,ksize = 5)
imgs=[img,laplacian,sobelx,sobely]
imgs = [bgr2rgb(img) for img in imgs]
titles= ["input","laplacian","sobelx","sobely"]
for i in range(4):
plt.subplot(2,2,i+1)
plt.imshow(imgs[i])
plt.title(titles[i])
plt.xticks([])
plt.yticks([])
plt.show()
输出效果