Scharr算子是Sobel算子的改进,同样的速度但是精度更高。Laplacian算子是一种二阶导数算子,可以满足不同方向的图像边缘锐化的要求。

Scharr算子及函数使用

在使用3X3的Sobel算子时,计算结果的精度不是很高。于是有Scharr算子作为升级。

Scharr算子的3X3内核

函数使用

dst = cv2.Scharr(src, ddepth, dx, dy[,scale[,delta[,borderType]]])
  • dst表示结果图像
  • src是原始图像
  • ddepth表示输出图像的深度

数学

  • dx表示x方向上的求导阶数
  • dy表示y方向上的求导阶数
  • scale表示计算导数时的缩放因子,默认为1,表示没有缩放
  • delta表示加在目标图像中的值
  • borderType表示边界样式

dx与dy组合

1、计算x方向边缘(梯度):dx = 1,dy = 0

dst = Scharr( src, ddepth, dx=1, dy=0 )

2、计算y方向边缘(梯度):dx = 0,dy = 1

dst = Scharr( src, ddepth, dx=0, dy=1 )

3、计算x方向与y方向的叠加

dx = Scharr( src, ddepth, dx=1, dy=0 )
dy = Scharr( src, ddepth, dx=0, dy=1 )
dxy = cv2.addWeighted(dx, 0.5, dy, 0.5, 0)

dx和dy的值不能都为1。

代码演示

import cv2
from cv2 import Sobel
img1 = cv2.imread(r'E:\Blog\OpenCV\jin.png',0)

Scharrx = cv2.Scharr(img1,cv2.CV_64F,1,0)   #dx = 1,dy = 0
Scharry = cv2.Scharr(img1,cv2.CV_64F,0,1)   #dx = 0,dy = 1

Scharrx = cv2.convertScaleAbs(Scharrx)
Scharry = cv2.convertScaleAbs(Scharry)

Scharrxy = cv2.addWeighted(Scharrx,0.5,Scharry,0.5,0) #组合

cv2.imshow('ORIGINAL',img1)
cv2.imshow('ScharrX',Scharrx)
cv2.imshow('ScharrY',Scharry)
cv2.imshow('ScharrXY',Scharrxy)
cv2.waitKey()

实验效果

Laplacian算子及函数使用

是一种二阶导数算子,其具有旋转不变性。可以满足不同方向的图像边缘锐化(边缘检测)的要求。

OpenCV

下图展示了像素点与周围点的一些实例:

实例结果

需要注意的是,计算结果可能为正数,也可能为负数,所以要对计算结果取绝对值,以保证后续运算和显示都是正确的。

函数使用

dst = cv2.Laplacian(src, ddepth [,ksize[,scale[,delta[,boederType]]]])
  • dst表示结果图像
  • src是原始图像
  • ddepth表示输出图像的深度

数学实例

  • scale表示计算导数时的缩放因子,默认为1,表示没有缩放
  • delta表示加在目标图像中的值
  • borderType表示边界样式
  • ksize代表用于计算二阶导数核尺寸大小,必须为正的奇数。当为1时,就是上面的3X3的核。

案例演示

import cv2
img1 = cv2.imread(r'E:\Blog\OpenCV\jin.png',0)
LAP1 = cv2.Laplacian(img1,cv2.CV_64F)  
LAP1 = cv2.convertScaleAbs(LAP1)
cv2.imshow('ORIGINAL',img1)
cv2.imshow('ScharrX',LAP1)
cv2.waitKey()

演示效果


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV30.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 06 月 15 日
如果觉得我的文章对你有用,请随意赞赏