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

我的微信公众号名称:AI研究订阅号
微信公众号ID:MultiAgent1024
公众号介绍:主要研究强化学习、计算机视觉、深度学习、机器学习等相关内容,分享学习过程中的学习笔记和心得!期待您的关注,欢迎一起学习交流进步!

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

图像梯度-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}

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

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}

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}

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

#不同算子的差异
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')

  结果显示如下图所示:

不同算子对应的结果

发布了141 篇原创文章 · 获赞 114 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/weixin_39059031/article/details/103439648