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()