代码语言:javascript复制
import cv2
o=cv2.imread('C:/Users/xpp/Desktop/Lena.png',cv2.IMREAD_GRAYSCALE)#原始图像
Scharrx=cv2.Sobel(o,cv2.CV_64F,1,0,-1)#x轴方向的求导阶数
Scharry=cv2.Sobel(o,cv2.CV_64F,0,1,-1)#y轴方向的求导阶数
Scharrx=cv2.convertScaleAbs(Scharrx)#x轴方向的计算结果取绝对值
Scharry=cv2.convertScaleAbs(Scharry)#y轴方向的计算结果取绝对值
cv2.imshow("original",o)
cv2.imshow("x",Scharrx)
cv2.imshow("y",Scharry)
cv2.waitKey()
cv2.destroyAllWindows()
算法:Scharr算子和Sobel算子具有同样速度且精度更高。当Sobel核结构不大时,精度不高,而Scharr算子具有更高的精度,Scharr算子是Sobel算子的改进。
dst=cv2.Scharr(src, ddepth, dx, dy[, scale[, delta[, borderType]]])
- src表示输入图像
- ddepth表示输出图像的深度
- dx表示x轴方向的导数阶数
- dy表示y轴方向的导数阶数
- scale表示计算导数值所采用的缩放因子,默认值是1
- delta表示加在输出图像的值,默认值是0
- borderType表示边界样式
注意:在cv2.Sobel()中,ksize的值为-1时表示使用Scharr算子运算。与cv2.Sobel()不同的是cv2.Scharr()的参数dx和dy的值不可以同时设置为1,没有ksize参数。如果处理的图像是8位图类型且ddepth参数值为-1时,那么所有负数会自动截断为0,发生信息丢失。为了避免信息丢失,在计算时要先使用更高的数据类型cv2.CV_64F,再通过取绝对值将其映射为cv2.CV_8U(8位图)类型。通常将函数cv2.Sobel()内参数ddepth的值设置为cv2.CV_64F。