[opencv教程(十二)]图像梯度

预备知识

梯度

        梯度方向是该点方向上变化最快的方向,沿着梯度方向可以找到最大值

        gradf(x,y) = \Delta f(x,y)=\left \{ \frac{\partial f}{\partial x},\frac{\partial f}{\partial x} \right \} = f_{x}(x,y)\overrightarrow{i}\: +\:f _{y}(x,y)\overrightarrow{j}

        整理后得到

        \left \{ \frac{\partial f}{\partial x} , \frac{\partial f}{\partial y} \right \}^{T}

矩阵卷积

  1. 将滤波器翻转180度。
  2. 将翻转后的滤波器与图像重叠。
  3. 计算重叠区域中滤波器和图像对应元素的乘积之和。
  4. 将计算结果存储在输出图像中与滤波器中心对应的位置。
  5. 将滤波器沿着图像移动,重复步骤2-4,直到覆盖整个图像。

     具体例子 可以查看这一篇原来卷积是这么计算的 - 知乎 (zhihu.com)

简介

        图像梯度是指图像中每个像素点的灰度值与其周围像素点灰度值之间的变化率。它可以用来检测图像中的边缘和纹理信息。

注意

        图像梯度和形态学梯度是两个概念。形态学梯度是膨胀-腐蚀所得到的差,而图像梯度是点与周围灰度值的变化,图像梯度是x和y方向上的偏导得到的

Sobel算子

        sobel滤波矩阵 当内核为3时

G_{x} = \begin{bmatrix} -1 & 0& 1\\ -2& 0& 2\\ -1& 0& 1 \end{bmatrix} * A\: and\,\, G_{y} = \begin{bmatrix} -1 & -2 &-1 \\ 0 &0 & 0\\ 1& 2& 1 \end{bmatrix} * A

函数解析

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

  • ddepth:图像深度
  • dx,dy:水平和竖直方向
  • ksize:内核大小

图片

                

案例

         

lenaGary = cv2.imread('Picture/Lena.png',cv2.IMREAD_GRAYSCALE)
#cv2.CV_64F,因为在计算梯度的时候会涉及到负值,
#如果单纯设置为-1
#则会把负值改为0,显然是不符合梯度要求的,
#所以一般设置为cv2.cv_64f返回结果就可以是64位的一个数值,就是[-255, 255],
#这样如果出现负梯度,我们就把负梯度也保留了
sobelX = cv2.Sobel(lenaGary,cv2.CV_64F,1,0,ksize = 3)
sobelY = cv2.Sobel(lenaGary,cv2.CV_64F,0,1,ksize = 3)
#在Sobel中 白到黑为正数,黑到白为负数,负数会被截断为0 
#导致边缘缺少,所以进行绝对值保留边缘信息
sobelX = cv2.convertScaleAbs(sobelX)
sobelY = cv2.convertScaleAbs(sobelY)
sobel = cv2.addWeighted(sobelX,0.5,sobelY,0.5,0)
cv2.imshow('Sobels',sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意 

        如果dx和dy都设置为1 有可能会出现重影 断链等现象

Scharr算子

简介

        思想和Sobel算子相同 但是Sobel算子差异性的增强,对边缘更加敏感

        因为思想相同,所以函数解析也是一样的

        G_{x} = \begin{bmatrix} -3 & 0& 3\\ -10& 0& 10\\ -3& 0& 3 \end{bmatrix} * A\: and\,\, G_{y} = \begin{bmatrix} -3 & -10 &-3 \\ 0 &0 & 0\\ 3& 10& 3\end{bmatrix} * A

案例

        

#Scharr算子
lenaGary = cv2.imread('Picture/Lena.png',cv2.IMREAD_GRAYSCALE)
scharrX = cv2.Scharr(lenaGary,cv2.CV_64F,1,0,3)
scharrY = cv2.Scharr(lenaGary,cv2.CV_64F,0,1,3)
scharrX = cv2.convertScaleAbs(scharrX)
scharrY = cv2.convertScaleAbs(scharrY)
scharr = cv2.addWeighted(scharrX,0.5,scharrY,0.5,0)
cv2.imshow('Scharr',scharr)
cv2.waitKey(0)
cv2.destroyAllWindows()

 Laplacian算子

简介

        之前在讲空间域的线性滤波的时候就提到过了 laplacian滤波不是为了去噪,而是为了边缘检测,laplacian其实在边缘检测的时候也不是特别好,因为会受到 噪音的影响,一般是和其他工具搭着使用

        G=\begin{bmatrix} 0 &1 & 0\\ 1 & -4 &1 \\ 0& 1& 0 \end{bmatrix}

案例

        

#Laplacian算子
lenaGary = cv2.imread('Picture/Lena.png',cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian(lenaGary,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
cv2.imshow('Laplacian',laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()

        

对比

         

plt.subplot(131),plt.imshow(sobel,'gray'),plt.title('Sobel'),plt.xticks([]),plt.yticks([])
plt.subplot(132),plt.imshow(scharr,'gray'),plt.title('Scharr'),plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(laplacian,'gray'),plt.title('Laplacian'),plt.xticks([]),plt.yticks([])
plt.show()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值