python opencv学习(六)图像梯度计算

sobel算子

Sobel算子算法的优点是计算简单,速度快。但是由于只采用了2个方向的模板,只能检测水平和垂直方向的边缘,因此这种算法对于纹理较为复杂的图像,其边缘检测效果就不是很理想。该算法认为:凡灰度新值大于或等于阈值的像素点时都是边缘点。这种判断欠合理,会造成边缘点的误判,因为许多噪声点的灰度值也很大。

右边-左边,差异值作为水平方向

下面-上面,差异值作为垂直方向

dst= cv2.Sobel(src,ddepth,dx,dy,ksize)
  • ddepth:图像深度,都是默认-1,表示输入输出深度一样
  • dx,dy:分别表示水平和竖直方向
  • ksize:是Sobel算子的大小  ,表示核的大小
import cv2
import numpy as np


img = cv2.imread('F:/picture/desk/1.jpg')
def cv_imshow(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()

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

# cv2.CV_64F能表示负数的形式,白-黑是正数,黑-白就是负数了,
# 所有的负数会被截断0,所以要取绝对值
# dx=1,dy=0  表示计算水平方向的,不计算竖直方向,谁为1,计算谁

cv_imshow(sobelx,'sobelx')

 在滤波函数第二个参数,当我们使用-1表示输出图像与输入图像的数据类型一致时,如果原始图像是uint8型的,那么在经过算子计算以后,得到的图像可能会有负值,如果与原图像数据类型一致,那么负值就会被截断变成0或者255,使得结果错误,那么针对这种问题有两种方式改变(上述程序中都有):一种就是改变输出图像的数据类型(第二个参数cv2.CV_64F),另一种就是改变原始图像的数据类型(此时第二个参数可以为-1,与原始图像一致)。

img = cv2.imread('F:/pictu
  • 13
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值