Opencv3学习笔记(C++&Python双语)---图像梯度

原理

参照教程《学习Opencv3》第十章卷积与滤波

梯度本质就是求导数,Opencv中都是近似求导数,至于算子模板为什么要设置特定的矩阵,参考以下两篇文章

https://www.zhihu.com/question/26822364/answer/1168914135  

https://blog.csdn.net/yanghan742915081/article/details/84679629

1.Sobel算子与Scharr算子

Sobel算子是高斯平滑与微分操作的结合体,它的抗噪音能力很好。可以设定求导的方向(xorder或yorder)。还可以设定使用的卷积核的大小(ksize),如果ksize=-1,会使用3x3的Scharr滤波器,效果会更好,若速度相同,在使用3x3滤波器时尽量使用Scharr。

2.Laplancian算子

拉普拉斯算子可以使用二阶导数的形式定义,可假设其离散实现类似于二阶Sobel导数,事实上OpenCV在计算拉普拉斯算子时直接调用Sobel算子。

拉普拉斯滤波器使用的卷积核:

0 1 0
1 -4 1
0 1 0

 

python代码

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()

输出效果

Opencv3学习笔记(C++&Python双语)---图像梯度_第1张图片

 

你可能感兴趣的:(opencv,人工智能,计算机视觉)