Opencv 图像梯度计算

4.1 Sobel算子

Sobel算子主要计算图像在水平和垂直方向上的梯度,从而检测图像中的边缘。

Sobel算子通过两个3×3的卷积核分别计算水平方向和垂直方向的梯度:
G x = [ − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ] ∗ A and G y = [ − 1 − 2 − 1 0 0 0 + 1 + 2 + 1 ] ∗ A \mathbf{G}_x = \begin{bmatrix}-1 & 0 & +1 \\-2 & 0 & +2 \\-1 & 0 & +1\end{bmatrix} * \mathbf{A} \quad \text{and} \quad\mathbf{G}_y = \begin{bmatrix}-1 & -2 & -1 \\0 & 0 & 0 \\+1 & +2 & +1\end{bmatrix} * \mathbf{A} Gx= −1−2−1000+1+2+1 ∗AandGy= −10+1−20+2−10+1 ∗A

python 复制代码
img = cv2.imread('pie.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

  • ddepth:图像的深度。-1表示和输入和输出一样大小
  • dx和dy分别表示水平和竖直方向,1表示计算,0表示不计算
  • ksize是Sobel算子的大小

接下来利用Sobel算子计算水平方向上的梯度

python 复制代码
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

由于梯度计算中有可能会出现截断或溢出的现象,因此采用64位浮点类型来存储数据

python 复制代码
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize = 3)
cv_show(sobelx, 'sobelx')

为什么右边检测不到边缘呢?

注意水平方向的梯度计算是边的右边减去左边,⚪的左边计算白到黑是正数,那么右边黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值。

python 复制代码
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize = 3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx, 'sobelx')

竖直方向上的边缘检测

python 复制代码
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize = 3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely, 'sobely')

将两个方向的边缘检测合并:

python 复制代码
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5)
cv_show(sobelxy, 'sobelxy')

不建议直接计算两个方向,上下左右四个点的部分边界会不明显

python 复制代码
sobelxy = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize = 3)
sobelxy = cv2.convertScaleAbs(sobelxy)
cv_show(sobelxy, 'sobelxy')

接下来尝试对人像进行梯度计算

python 复制代码
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
cv2.show(img, 'img')
python 复制代码
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize = 3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img, cv2_CV_64F, 0, 1, ksize = 3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
# 最后一个参数gamma可以是任何实数,正值会使图像变亮,负值会使图像变暗,0表示没有影响
cv_show(sobelxy,'sobelxy')

4.2 Scharr算子

G x = [ − 3 0 3 − 10 0 10 − 3 0 3 ] ∗ A and G y = [ − 3 − 10 − 3 0 0 0 − 3 − 10 − 3 ] ∗ A \mathbf{G}_x = \begin{bmatrix}-3 & 0 & 3 \\-10 & 0 & 10 \\-3 & 0 & 3\end{bmatrix} * \mathbf{A} \quad \text{and} \quad\mathbf{G}_y = \begin{bmatrix}-3 & -10 & -3 \\0 & 0 & 0 \\-3 & -10 & -3\end{bmatrix} * \mathbf{A} Gx= −3−10−30003103 ∗AandGy= −30−3−100−10−30−3 ∗A

python 复制代码
# cv2.Scharr 函数中没有 ksize 参数,卷积核大小是固定的
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
cv_show(scharrxy, 'scharrxy')

4.3 laplacian算子

G = [ 0 1 0 1 − 4 1 0 1 0 ] \mathbf{G} = \begin{bmatrix}0 & 1 & 0 \\1 & -4 & 1 \\0 & 1 & 0\end{bmatrix} G= 0101−41010

python 复制代码
laplacian = cv2.Laplacian(img, cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
cv_show(laplacian, 'laplacian')
python 复制代码
# 比较三种不同的算子
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')

可以看出Scharr算子的边缘定位更精确,可以检测到更细的边缘。

相关推荐
CP-DD9 分钟前
PyTorch 的 Dataset 和 DataLoader
人工智能·pytorch·python
Wis4e9 分钟前
基于PyTorch的深度学习2——逐元素操作,归并,比较,矩阵
人工智能·pytorch·深度学习
老大白菜12 分钟前
PyTorch GPU显存管理与大规模张量操作
人工智能·pytorch·python
zhulu50612 分钟前
PyTorch 源码学习:GPU 内存管理之初步探索 expandable_segments
人工智能·pytorch·学习
花千树-01014 分钟前
MOE(Mixture of Experts)门控网络的实现与优化
人工智能·pytorch·自然语言处理·nlp·aigc
Jason_Orton17 分钟前
决策树(Decision Tree):机器学习中的经典算法
人工智能·算法·决策树·随机森林·机器学习
张琪杭17 分钟前
Pytorch算子介绍大白话版一
人工智能·pytorch·python
紫雾凌寒20 分钟前
计算机视觉|ConvNeXt:CNN 的复兴,Transformer 的新对手
人工智能·神经网络·机器学习·计算机视觉·transformer·动态网络·convnext
富 贵 儿 ¥39 分钟前
深度学习、宽度学习、持续学习与终身学习:全面解析与其在大模型方面的应用
人工智能·深度学习·学习
佛州小李哥40 分钟前
我代表中国受邀在亚马逊云科技全球云计算大会re:Invent中技术演讲
运维·人工智能·科技·云计算·aws·云安全·亚马逊云科技