Sobel算子

2022-05-28 16:15:35 浏览数 (2)

代码语言: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。

0 人点赞