python下利用opencv进行梯度计算
1、梯度就是通过对二维离散函数求导,它在边缘上的灰度变化,可以通过梯度方向的最大变化率进行表达,通过求导得出梯度变化方向和幅值等信息。
3x3 Scharr滤波器一般比3x3 Sobel滤波器效果好。结合了高斯平滑与微分。
其算子如图。

2、首先还是
先计算 x,y两个方向Scharr,然后进行绝对值,因为前面变成浮点数,求导后可能出现负值。
import cv2 as cvimport numpy as npimport copyimport osfrom matplotlib import pyplot as pltfrom skimage.measure import compare_ssimimage = cv.imread("c:\\dajiangdahe.png", 1)
scharr_y = cv.Scharr(image,cv.CV_64F,dx=0,dy=1)
scharr_x = cv.Scharr(image,cv.CV_64F,dx=1,dy=0)
scharr_x = cv.convertScaleAbs(scharr_x)
scharr_y = cv.convertScaleAbs(scharr_y)



3、然后把2个方向的计算数值通过addWeighted整合为最后结果。
scharrOver = cv.addWeighted(scharr_x,0.5,scharr_y,0.5,0)
cv.imshow("image",image)
cv.imshow("scharr_x",scharr_x)
cv.imshow("scharr_y",scharr_y)
cv.imshow("picture",scharrOver)
cv.waitKey()

4、再举个例子看得比较清楚。
还是采用米框图
image = cv.imread("c:\\color_MiLine.png", 1)
scharr_x = cv.Scharr(image,cv.CV_64F,dx=1,dy=0)
scharr_x = cv.convertScaleAbs(scharr_x)
scharr_y = cv.Scharr(image,cv.CV_64F,dx=0,dy=1)
scharr_y = cv.convertScaleAbs(scharr_y)
scharrOver = cv.addWeighted(scharr_x,0.5,scharr_y,0.5,0)
cv.imshow("image",image)
cv.imshow("scharr_x",scharr_x)
cv.imshow("scharr_y",scharr_y)
cv.imshow("picture",scharrOver)
cv.waitKey()
cv.destroyAllWindows()


5、分别输出三种图像进行观察
cv.imshow("image",image)
cv.imshow("scharr_x",scharr_x)
cv.imshow("scharr_y",scharr_y)
cv.imshow("picture",scharrOver)
cv.waitKey()
cv.destroyAllWindows()



6、通过计算可以检测边缘,效果还可以