Open CV系列学习笔记(十五)图像梯度
图像梯度
图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导。
图像梯度: G(x,y) = dx(i,j) + dy(i,j);
dx(i,j) = I(i+1,j) - I(i,j);
dy(i,j) = I(i,j+1) - I(i,j);
其中,I是图像像素的值(如:RGB值),(i,j)为像素的坐标。
图像梯度一般也可以用中值差分:
dx(i,j) = [I(i+1,j) - I(i-1,j)]/2;
dy(i,j) = [I(i,j+1) - I(i,j-1)]/2;
图像边缘一般都是通过对图像进行梯度运算来实现的。
一阶导数与Soble算子


代码:
def sobel_demo(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("gradient-x",gradx)
#cv.imshow("gradient-y",grady)
gradxy = cv.addWeighted(gradx,0.5,grady,0.5,0)
cv.imshow("gradient",gradxy)
结果:


二阶导数与拉普拉斯算子


代码:
def lapalian_demo(image):#拉普拉斯算子
kernel = np.array([[1,1,1],[1,-8,1],[1,1,1]])#手动定义卷积核
dst = cv.filter2D(image,cv.CV_32F,kernel = kernel)
lpls = cv.convertScaleAbs(dst)
cv.imshow("lapalian_demo",lpls)
结果:

完整代码:
import cv2 as cv
import numpy as np
def lapalian_demo(image):#拉普拉斯算子
#dst = cv.Laplacian(image,cv.CV_32F)
#lpls = cv.convertScaleAbs(dst)
kernel = np.array([[1,1,1],[1,-8,1],[1,1,1]])#手动定义卷积核
dst = cv.filter2D(image,cv.CV_32F,kernel = kernel)
lpls = cv.convertScaleAbs(dst)
cv.imshow("lapalian_demo",lpls)
def sobel_demo(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("gradient-x",gradx)
cv.imshow("gradient-y",grady)
gradxy = cv.addWeighted(gradx,0.5,grady,0.5,0)
cv.imshow("gradient",gradxy)
print("--------HEllow Python-------")
src = cv.imread("E:/picture/30.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
sobel_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
本文介绍了图像梯度的概念及其在图像边缘检测中的作用,通过一阶导数和Sobel算子展示如何计算图像梯度。同时,讲解了二阶导数与拉普拉斯算子在图像处理中的应用,提供了相应的代码示例,展示了如何利用拉普拉斯算子检测图像边缘。最后,给出了完整的Python代码实现。
2080

被折叠的 条评论
为什么被折叠?



