一、图像梯度
概念
图像梯度类似于‘变化率、导数、加速度’。
梯度大小:一幅黑白分明的图像,黑色和白色区域之间的边界处梯度就很大,因为从黑色像素到白色像素,值变化得很剧烈。
梯度方向:梯度的方向就是像素值增长最快的方向。
通常使用差分来近似计算图像梯度。
二、垂直边缘提取
1.概念
垂直边缘提取就是在一幅图像中把垂直方向上物体的边缘找出来的过程。
2.原理
将模板与图像中对应的像素区域进行卷积运算,即对应元素相乘后求和,得到该点的垂直梯度值。
假设模版为:
图像中对应的像素区域为:
计算结果:
Gv=−a11−2a21−a31+a13+2a23+a33,这一结果就是该点的垂直梯度值。
注意:
梯度值的取值是有规定的,算出来为负数则记为0,算出来超过255,则记为255。
梯度值的范围只能是0-255。
3.API使用
cv2.filter2D(img,ddepth,kernel,)
ddepth:输出图像的深度,可以是负值(表示与原图相同)、正值或其他特定值(常用-1 表示输出与输入具有相同的深度)。
i.读图 cv2.imread()
ii.API使用 cv2.filter2D(img,-1,kernel)
iii.显示 cv2.imshow()
4.代码实现
import cv2
import numpy as np
img = cv2.imread('./src/shudu.png')
kernel = np.array([
[-1, 0, 1],
[-2, 0, 2],
[-3, 0, 3]], dtype=np.float32)
img2 = cv2.filter2D(img,-1,kernel) #垂直边缘提取
img3 = cv2.filter2D(img,-1,kernel.T) #水平边缘提取
cv2.imshow('img',img)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
三、sobel算子
1.概念
Sobel 算子是一种在数字图像处理和计算机视觉领域常用的算法,其主要功能是检测图像中的边缘。
两个方向的算子:
- 水平边缘检测(检测垂直方向的边缘):
[-1 0 1] [-2 0 2] [-1 0 1]
- 垂直边缘检测(检测水平方向的边缘):
[-1 -2 -1] [ 0 0 0] [ 1 2 1]
2.工作原理
卷积操作:将上述算子(也称为卷积核)在图像上滑动,对每个像素点及其邻域进行加权求和,得到该点在对应方向上的梯度值。
梯度合成:通过组合水平和垂直方向的梯度值,可以计算梯度的大小和方向:
梯度大小:G=Gx2+Gy2
梯度方向:θ=arctan(GxGy)
3.API使用
cv2.Sobel(img,ddepth,dx,dy,ksize)
ksize:Sobel算子的大小,可选择3、5、7,默认为3。
4.代码实现
import cv2
import numpy as np
img = cv2.imread('./src/shudu.png')
img2 = cv2.Sobel(img,-1,1,0,3) #对x求导,检测垂直方向
img3 = cv2.Sobel(img,-1,0,1,3) #对y求导,检测水平方向
cv2.imshow('img',img)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
四、Laplacian算子
1.概念
Laplacian 算子通过计算图像灰度函数的二阶偏导数来检测边缘。与 Sobel 算子等一阶导数算子不同,它对图像中的孤立点、线和边缘的响应更强烈,能突出图像中的细节信息。
常用的 Laplacian 算子模板有多种形式,其中一种常见的 3×3 模板如下:
[ 0 -1 0]
[-1 4 -1]
[ 0 -1 0]
2.原理
卷积运算:将 Laplacian 算子模板在图像上进行滑动,对每个像素点及其邻域进行卷积操作,即按照模板的权重对邻域像素的灰度值进行加权求和,得到该像素点的 Laplacian 值。
边缘判断:如果一个像素点的 Laplacian 值大于某个设定的阈值,那么该像素点被认为是边缘点。通常情况下,边缘点处的二阶导数会有较大的变化,而在图像的平坦区域,二阶导数的值较小。
3.API使用
cv2.Laplacian(img,ddepth)
4.代码实现
import cv2
import numpy as np
img = cv2.imread('./src/shudu.png')
img2 = cv2.Laplacian(img,-1)
cv2.imshow('img',img)
cv2.imshow('img2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果: