使用 Python 求图像的梯度

在本教程中,我们将学习如何在 Python 中查找图片的梯度。完成本课程后,您将能够识别图片在 X、Y 和两个方向上的渐变,并利用几个有用的库。

渐变图片只不过是图像颜色强度在 X、Y 或两个方向上的变化。

图片的梯度可以使用图像的索贝尔和拉普拉斯导数来确定。Sobel 可以在 X 或 Y 方向或两个方向上使用,但拉普拉斯算子可以在两个方向上提供帮助。


导入所需的模块

首先,我们导入 OpenCV cv2 库、Numpy 和 Matplotlib。接下来,我们使用 cv2 的 imread() 方法和两个参数来读取我们的图片。

第一个是带有扩展名的图片名称(确保它与图像位于同一文件夹中),第二个是比例类型,仅以数字形式为 0,1,-1。灰度、彩色和无变化是三种比例类型。

1
2
3
4
import cv2
import numpy as np
import matplotlib.pyplot as plot
image = cv2.imread("fig.jpg",0)
图像输入的梯度

使用 Python 求图像的梯度

接下来,我们将使用 Python Laplacian() 通过给出三个参数来确定图像的拉普拉斯导数。第一个是我们的图像变量,第二个是 cv2 的数据类型 CV 64F,第三个是内核大小。3 表示 ksize(确保始终使用奇数)

ksize 的值会增加边缘的厚度。ksize 3 将获得最佳结果。接下来,我们将该值转换为 Numpy 的 uint8 类型的无符号 8 位整数。

之后,我们使用 cv2 的 Sobel() 计算图片在 x 或 y 方向上的梯度,提供四个参数:第一个是图像源,第二个是深度,第三个是 x 导数,第四个是 y y 方向的导数 dy。

1
2
3
4
5
6
7
8
lap = cv2.Laplacian(image,cv2.CV_64F,ksize=3)
lap = np.uint8(np.absolute(lap))
 
sobelx= cv2.Sobel(image,0, dx=1,dy=0)
sobelx= np.uint8(np.absolute(sobelx))
 
sobely= cv2.Sobel(image,0, dx=0,dy=1)
sobely = np.uint8(np.absolute(sobely))

最后,我们列出两个列表:一个用于标题,另一个用于由 laplacian、sobelx 和 sobely 创建的图片。

使用 matplotlib 后,我们使用 imshow() 函数在屏幕上绘图,提供两个参数:一个用于图像源,一个用于背景。yticks() 和 xticks() 可以与列表(可以为空)一起使用来设置 x 和 y 方向的标签。

1
2
3
4
5
6
7
8
9
10
11
results = [lap,sobelx,sobely]
images =["Gradient Img","Gradient_X","Gradient_Y"]
plt.figure(figsize=(10,10))
for i in range(3):
    plot.title(results[i])
    plot.subplot(1,3,i+1)
    plot.imshow(results[i],"plasma")
    plot.xticks([])
    plot.yticks([])
 
plot.show()
图像输出的梯度

结论

恭喜!您刚刚学习了如何获取图像的渐变。希望你喜欢它!😇

喜欢该教程吗?无论如何,我建议您查看下面提到的教程:

  1. 梯度提升模型 – 用 Python 实现
  2. 使用 Python XGBoost 进行梯度提升

感谢您抽出宝贵时间!希望你学到新东西!😄