图像梯度-scharr算子

sobel算子 1 2 1
scharr算子 3 10 3
两者计算量和计算速度是一样的,但是scharr算子准确度更高,在梯度检测时用的也更多。
在这里插入图片描述
函数如下所示:
在这里插入图片描述

参数解释见上一篇sobel算子。
求两个方向上的梯度:使用fx fy同时为1,这种编程方式会报错,故和sobel算子不一样 ,只能有一种编程方式,即相加,使用函数addWeighted 。

其实也可以说scharr算子是对sobel算子的改进,故
在这里插入图片描述
sobel函数的第五个值表示卷积核大小,不可能为负数,所以为-1 时,表示scharr算子。

import cv2
a=cv2.imread('image\\sobel.bmp',cv2.IMREAD_GRAYSCALE)
scharrx=cv2.Scharr(a,cv2.CV_64F,1,0)
scharrx=cv2.convertScaleAbs(scharrx)
scharry=cv2.Scharr(a,cv2.CV_64F,0,1)
scharry=cv2.convertScaleAbs(scharry)
scharrxy=cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
cv2.imshow('a',a)
cv2.imshow('scharrx',scharrx)
cv2.imshow('scharry',scharry)
cv2.imshow('scharrxy',scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

使用sobel函数来计算scharr梯度,可以看出来两者运行结果应该是一样的。

import cv2
a=cv2.imread('image\\sobel.bmp',cv2.IMREAD_GRAYSCALE)
scharrx=cv2.Sobel(a,cv2.CV_64F,1,0,-1)
scharrx=cv2.convertScaleAbs(scharrx)
scharry=cv2.Sobel(a,cv2.CV_64F,0,1,-1)
scharry=cv2.convertScaleAbs(scharry)
scharrxy=cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
cv2.imshow('a',a)
cv2.imshow('scharrx',scharrx)
cv2.imshow('scharry',scharry)
cv2.imshow('scharrxy',scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sundanping_123/article/details/86500078