计算机视觉实战(五)图像梯度计算

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

图像梯度-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}= \begin{bmatrix} {-1}&{0}&{1}\\ {-2}&{0}&{2}\\ {-1}&{0}&{1}\\ \end{bmatrix}, G_{y} = \begin{bmatrix} {-1}&{-2}&{-1}\\ {0}&{0}&{0}\\ {1}&{2}&{1}\\ \end{bmatrix} Gx= 121000121 ,Gy= 101202101

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

img = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

原始图片

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

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()

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

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

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

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

  结果显示如下图所示:

水平方向梯度提取图

  • 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')

竖直方向梯度提取结果

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

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

水平和竖直方向梯度提取

  不建议直接计算:

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

直接计算结果

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}= \begin{bmatrix} {-3}&{0}&{3}\\ {-10}&{0}&{10}\\ {-3}&{0}&{3}\\ \end{bmatrix}, G_{y} = \begin{bmatrix} {-3}&{-10}&{-3}\\ {0}&{0}&{0}\\ {3}&{10}&{3}\\ \end{bmatrix} Gx= 31030003103 ,Gy= 30310010303

Laplacian算子

  图像梯度-laplacian算子:
G = [ 0 1 0 1 − 4 1 0 1 0 ] G=\begin{bmatrix} {0}&{1}&{0}\\ {1}&{-4}&{1}\\ {0}&{1}&{0}\\ \end{bmatrix} 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')

  结果显示如下图所示:

不同算子对应的结果

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值