当前位置:   article > 正文

计算机视觉实战(五)图像梯度计算_水平和竖直梯度算子

水平和竖直梯度算子

  这一节我们来看一下计算图像边缘的一些算子,提取图像边缘的信息有利于之后对图像中的物品进行更进一步的处理。

图像梯度-Sobel算子

G x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] , G y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] G_{x}=

[101202101]
, G_{y} =
[121000121]
Gx= 121000121 ,Gy= 101202101

  我们首先来看以下我们需要处理的图片:

img = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4

原始图片

  这里我们写一个显示图像的函数,方便之后的调用。

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4

  这里我们沿着水平方向对其进行一下梯度的提取

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
cv_show(sobelx,'sobelx')
  • 1
  • 2

  白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx,'sobelx')
  • 1
  • 2
  • 3

  结果显示如下图所示:

水平方向梯度提取图

  • cv2.Sobel函数的参数:

  • dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

    • ddepth:图像的深度,一般取-1。
    • dx和dy分别表示水平和竖直方向
    • ksize是Sobel算子的大小

  再看一下沿着竖直方向的:

sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)  
cv_show(sobely,'sobely')
  • 1
  • 2
  • 3

竖直方向梯度提取结果

  分别计算x和y,再求和:

sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')
  • 1
  • 2

水平和竖直方向梯度提取

  不建议直接计算:

sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy) 
cv_show(sobelxy,'sobelxy')
  • 1
  • 2
  • 3

直接计算结果

Scharr算子

  图像梯度-Scharr算子,能够捕获更加细致的纹理信息。

G x = [ − 3 0 3 − 10 0 10 − 3 0 3 ] , G y = [ − 3 − 10 − 3 0 0 0 3 10 3 ] G_{x}=

[30310010303]
, G_{y} =
[31030003103]
Gx= 31030003103 ,Gy= 30310010303

Laplacian算子

  图像梯度-laplacian算子:
G = [ 0 1 0 1 − 4 1 0 1 0 ] G=

[010141010]
G= 010141010

  我们也可以查看一下各种不同算子之间的差异:

#不同算子的差异
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)   
sobely = cv2.convertScaleAbs(sobely)  
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  

scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)   
scharry = cv2.convertScaleAbs(scharry)  
scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0) 

laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)   

res = np.hstack((sobelxy,scharrxy,laplacian))
cv_show(res,'res')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

  结果显示如下图所示:

不同算子对应的结果

  • https://github.com/ZhiqiangHo/Opencv-Computer-Vision-Practice-Python-

我的微信公众号名称:小小何先生
公众号介绍:主要研究分享深度学习、机器博弈、强化学习等相关内容!期待您的关注,欢迎一起学习交流进步!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/554681
推荐阅读
相关标签
  

闽ICP备14008679号