图像梯度-Sobel算子
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
- src: 图像数组变量
- ddepth: 图像的深度,一般填-1,表示与原始图像深度一致;
cv2.CV_64F表示每一个像素点值为64位浮点数,是OpenCV定义的数据类型 - dx和dy分别表示水平和竖直方向,1表示计算该方向的梯度,0表示不计算
- ksize是Sobel算子的大小,是一个整型
# Sobel算子的大小通常为3*3,其计算实质就是右边减左边、下面减上面
img = cv2.imread('F:/aixin.jpg')
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', sobelx)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 上面计算得到的图像结果中,所有的负数都会截断成0,这并不一定是我们想要的
# 通过下面的方法取绝对值,这样就可以只关注梯度计算时的变化量
img = cv2.imread('F:/aixin.jpg')
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx) # 取绝对值
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', sobelx)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 当x方向和y方向的梯度都要计算时,不建议直接将参数dx和dy的值同时设为1,因为这样会导致图像较为模糊,部分细节丢失;可以分别计算再相加
img = cv2.imread('F:/aixin.jpg')
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
sobelxy11 = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3)
sobelxy11 = cv2.convertScaleAbs(sobelxy11)
image = cv2.hconcat((sobelx, sobely, sobelxy, sobelxy11))
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像梯度-Scharr算子
# Scharr算子跟Sobel算子很相似,不同的是Scharr算子的值更大,使得梯度计算结果的差异更明显
# Scharr算子对梯度信息更敏感,能捕捉到更丰富的梯度信息
# Scharr函数中没有ksize参数
img = cv2.imread('F:/aixin.jpg')
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
image = cv2.hconcat((scharrx, scharry, scharrxy))
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像梯度-Laplacian算子
# 不建议单独使用Laplacian算子,适合与其他工具协同使用
# Laplacian算子中没有dx、dy参数,有ksize参数
img = cv2.imread('F:/aixin.jpg')
laplacian = cv2.Laplacian(img, cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()