opencv——图像梯度计算

    • Sobel算子

步骤1:读取原图像

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

ps:梯度是指图像某一个像素点两边的颜色差异值,两边颜色相同的像素点梯度为0,所以只有边界像素点才有梯度。

步骤2:Sobel算子计算图像梯度

是指水平方向色差,是指竖直方向色差,

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destrayAllWindows()
#水平方向x的sobel梯度
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#从左到右参数分别为原图像,图像深度ddepth,水平方向x,竖直方向dy,sobel模板的尺寸
sobelx=cv2.convertScaleAbs(sobelx)
cv_show(sobelx,"sobelx")
#竖直方向y的sobel梯度
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
cv_show(sobely,"sobely")
#水平方向x和竖直方向y的sobel梯度和
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,"sobelxy")

ps:白-黑是正数,黑-白就为负数,但在opencv里负数会被截断为0,即为黑,因此需要对其取绝对值。

    • scharr算子

ps:scharr模板比sobel模板对梯度更加敏感。

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)
cv_show(scharrxy,"scharrxy"0
    • laplacian(拉普拉斯)算子

ps:拉普拉斯算子运用到二阶导,与前面两种算子来说更加敏感,但对噪音点也更加敏感。

laplacian=cv2.Laplacian(img,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)
cv_show(laplacian,"laplacian")
    • Sobel、Scharr、Laplacian三种算子计算梯度间的效果比较

import numpy as np
res=np.hstack(sobelxy,scharrxy,laplacian)
cv_show(res,"res")

a、scharr算子对边界像素描述要比sobel算子更加细致,可以获得更加丰富的边界信息。

b、laplacian算子因为对噪音更加敏感,描述边界像素的效果不是特别好,因此一般不单独使用laplacian算子

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一瞬にして失う

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值