在本教程中,我们将学习如何在 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() |
结论
恭喜!您刚刚学习了如何获取图像的渐变。希望你喜欢它!😇
喜欢该教程吗?无论如何,我建议您查看下面提到的教程:
感谢您抽出宝贵时间!希望你学到新东西!😄