版权声明:如需转载请标注 https://blog.csdn.net/weixin_40973138/article/details/88707761
import cv2 as cv
def sobel_gradient(image):
src = cv.imread(image)
#grad_x = cv.Sobel(src, cv.CV_32F, 1, 0)
#grad_y = cv.Sobel(src, cv.CV_32F, 0, 1)
grad_x = cv.Scharr(src, cv.CV_32F, 1, 0)
grad_y = cv.Scharr(src, cv.CV_32F, 0, 1)
gradx = cv.convertScaleAbs(grad_x)
grady = cv.convertScaleAbs(grad_y)
gradxy = cv.addWeighted(gradx, 0.5, grady, 0.5, 0)
#cv.imshow('gradx', gradx)
#cv.imshow('grady', grady)
cv.imshow('customary', src)
cv.imshow('gradxy', gradxy)
sobel_gradient('/home/pi/Desktop/apple.jpg')
cv.waitKey(0)
cv.destroyAllWindows()
(其中gradx 和grady 也是可输出图像,为图像分别在x,y 方向上的梯度图像)
在此实际运用为Scharr 算子,注释内为Sobel 算子
拉普拉斯梯度:
def laplacian_gradient(image):
src = cv.imread(image)
dst = cv.Laplacian(src, cv.CV_32F)
lpls = cv.convertScaleAbs(dst)
cv.imshow('customary', src)
cv.imshow('lpls', lpls)
除此之外,我们还可自定义算子进行梯度计算:
def custom_gradient(image):
src = cv.imread(image)
kernel = np.array([[1,1,1], [1,-8,1], [1,1,1]])
dst = cv.filter2D(src, cv.CV_32F, kernel=kernel)
result = cv.convertScaleAbs(dst)
cv.imshow('customary', src)
cv.imshow('result', result)
并且从试验得知,拉普拉斯算子是:
[0, 1, 0]
[1,-4, 1]
[0, 1, 0]