图像梯度即求导数,导数能反映出图像变化最大的地方,图像变化最大的地方也就是图像的边缘。
详细见代码注释,通俗易懂
在sobel算子不能明显反映图像边缘时就换用scharr算子
import cv2 as cv
def sobel_image(img):
grad_x = cv.Sobel(img, cv.CV_32F, 1, 0)#x方向一阶导数
#图像 图像深度,支持src.depth()和ddepth的组合 x方向上差分阶数 y方向差分阶数
grad_y = cv.Sobel(img, cv.CV_32F, 0, 1)#y方向一阶导数
#print(grad_x)
gradx = cv.convertScaleAbs(grad_x)#可通过print查看区别
#线性输入数组转化为无符号(绝对值)8为整形
#print(gradx)
grady = cv.convertScaleAbs(grad_y)
cv.imshow("x", gradx)
cv.imshow("y", grady)
gradxy = cv.addWeighted(grad_x, 0.5, grad_y, 0.5, 0)#将两幅图像整合
#第一个数组 第一个数组的权重 第二个数组 第二个数组的权重 gamma
#dst = src1[I]*alpha+ src2[I]*beta + gamma;输出图像式子
cv.imshow("x&&y", gradxy)
img = cv.imread("d://work//1.jpg")
sobel_image(img)
cv.waitKey(0)
cv.destroyAllWindows()
sobel到scharr改变求导方式即可
def scharr_image(image):
grad_x = cv.Scharr(image, cv.CV_32F, 1, 0)
grad_y = cv.Scharr(image, cv.CV_32F, 0, 1)
gradx = cv.convertScaleAbs(grad_x)
grady = cv.convertScaleAbs(grad_y)
cv.imshow("x", grad_x)
cv.imshow("y", grad_y)
gradxy = cv.addWeighted(gradx, 0.5, grady, 0.5, 0)
cv.imshow("x&y_s", gradxy)
相比sobel算子把变化描述地更明显
再介绍一种lpls算子
lpls 算子有四领域和8领域的,内置函数默认是四领域
def lpls_image(image):
dst = cv.Laplacian(image, cv.CV_32F)
lpls = cv.convertScaleAbs(dst)
cv.imshow("lpls", lpls)
def lpls_image(image):
#dst = cv.Laplacian(image, cv.CV_32F)
#lpls = cv.convertScaleAbs(dst)
dst = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])
lpls = cv.filter2D(image, cv.CV_32F, dst)
lpls = cv.convertScaleAbs(lpls)
cv.imshow("lpls", lpls)
左边为4领域 ,右边为8领域suan算子
总代码:
import cv2 as cv
import numpy as np
#索贝尔算子
def sobel_image(img):
grad_x = cv.Sobel(img, cv.CV_32F, 1, 0)#x方向一阶导数
#图像 图像深度,支持src.depth()和ddepth的组合 x方向上差分阶数 y方向差分阶数
grad_y = cv.Sobel(img, cv.CV_32F, 0, 1)#y方向一阶导数
#print(grad_x)
gradx = cv.convertScaleAbs(grad_x)#可通过print查看区别
#线性输入数组转化为无符号(绝对值)8为整形
#print(gradx)
grady = cv.convertScaleAbs(grad_y)
cv.imshow("x", gradx)
cv.imshow("y", grady)
gradxy = cv.addWeighted(grad_x, 0.5, grad_y, 0.5, 0)#将两幅图像整合
#第一个数组 第一个数组的权重 第二个数组 第二个数组的权重 gamma
#dst = src1[I]*alpha+ src2[I]*beta + gamma;输出图像式子
cv.imshow("x&&y", gradxy)
def scharr_image(image):
grad_x = cv.Scharr(image, cv.CV_32F, 1, 0)
grad_y = cv.Scharr(image, cv.CV_32F, 0, 1)
gradx = cv.convertScaleAbs(grad_x)
grady = cv.convertScaleAbs(grad_y)
cv.imshow("x", grad_x)
cv.imshow("y", grad_y)
gradxy = cv.addWeighted(gradx, 0.5, grady, 0.5, 0)
cv.imshow("x&y_s", gradxy)
#拉普拉斯 内置4领域 和手动8领域写法
def lpls_image(image):
dst = cv.Laplacian(image, cv.CV_32F)
lpls = cv.convertScaleAbs(dst)
#dst = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])
#lpls = cv.filter2D(image, cv.CV_32F, dst)
#lpls = cv.convertScaleAbs(lpls)
cv.imshow("lpls", lpls)
img = cv.imread("d://work//1.jpg")
lpls_image(img)
cv.waitKey(0)
cv.destroyAllWindows()