前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Sobel算子

Sobel算子

作者头像
裴来凡
发布2022-05-28 16:15:35
2970
发布2022-05-28 16:15:35
举报
文章被收录于专栏:图像处理与模式识别研究所
代码语言:javascript
复制
import cv2
o=cv2.imread("C:/Users/xpp/Desktop/Lena.png",cv2.IMREAD_GRAYSCALE)#原始图像
Sobelx=cv2.Sobel(o,cv2.CV_64F,1,0)#x轴方向的求导阶数
Sobely=cv2.Sobel(o,cv2.CV_64F,0,1)#y轴方向的求导阶数
Sobelx=cv2.convertScaleAbs(Sobelx)#x轴方向的计算结果取绝对值
Sobely=cv2.convertScaleAbs(Sobely)#y轴方向的计算结果取绝对值
Sobelxy=cv2.addWeighted(Sobelx,0.5,Sobely,0.5,0)#x轴方向和y轴方向的边缘叠加
Sobelxy11=cv2.Sobel(o,cv2.CV_64F,1,1)#当dx=1,dy=1时,Sobel运算
Sobelxy11=cv2.convertScaleAbs(Sobelxy11)#x轴方向和y轴方向的计算结果取绝对值
cv2.imshow("original",o)
cv2.imshow("xy",Sobelxy)
cv2.imshow("xy11",Sobelxy11)
cv2.waitKey()
cv2.destroyAllWindows()

算法:Sobel算子是离散的微分算子,结合了高斯平滑和微分求导运算,利用局部差分寻找边缘,计算所得的值是一个梯度的近似值。

水平边界:

P5x=(P3-P1)+2x(P6-P4)+(P9-P7)

  • 对于线条A和线条B,右侧像素值与左侧像素值的差值不为零,因此是边界
  • 对于其余列,其右侧像素值与左侧像素值的差值均为零,因此不是边界

垂直边界:

P5y=(P7-P1)+2x(P8-P2)+(P9-P3)

  • 对于线条A和线条B,下侧像素值与上侧像素值的差值不为零,因此是边界
  • 对于其余行,其下侧像素值与上侧像素值的差值均为零,因此不是边界 |P5x|=|(P3-P1)+2x(P6-P4)+(P9-P7)| |P5y|=|(P7-P1)+2x(P8-P2)+(P9-P3)| P5Sobel=|P5x|+|P5y|=|(P3-P1)+2x(P6-P4)+(P9-P7)|+|(P7-P1)+2x(P8-P2)+(P9-P3)|

dst=cv2.Sobel( src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]] )

  • src表示输入图像
  • ddepth表示输出图像的深度
  • dx表示x轴方向的求导阶数
  • dy表示y轴方向的求导阶数
  • ksize表示Sobel核的大小
  • scale表示计算导数值所采用的缩放因子,默认值是1
  • delta表示加在输出图像的值,默认值是0
  • borderType表示边界样式

注意:ksize的值为-1时表示使用Scharr算子运算。如果处理的图像是8位图类型且ddepth参数值为-1时,那么所有负数会自动截断为0,发生信息丢失。为了避免信息丢失,在计算时要先使用更高的数据类型cv2.CV_64F,再通过取绝对值将其映射为cv2.CV_8U(8位图)类型。通常将函数cv2.Sobel()内参数ddepth的值设置为cv2.CV_64F。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 图像处理与模式识别研究所 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档