如何使用OpenCV Python中的Sobel和Laplacian导数查找图像梯度?
使用Sobel算子,我们可以在水平方向和垂直方向上计算图像梯度。梯度是针对灰度图像计算的。Laplacian算子使用二阶导数计算梯度。
语法
使用以下语法使用Sobel和Laplacian导数计算图像梯度 −
cv2.Sobel(img, ddepth, xorder, yorder, ksize)
cv2.Laplacian(img, ddepth)
参数
- img − 原始输入图像。
-
ddepth − 输出图像的所需深度。它包含有关输出图像中存储的数据类型的信息。我们使用 cv2.CV_64F 作为ddepth。这是一个64位浮点数形式的OpenCV。
-
xorder − 水平方向(X方向)中的导数阶数。将 xorder=1 和 yorder=0 设置为X方向上的1阶导数。
-
yorder − 垂直方向(Y方向)中的导数阶数。将xorder=0,yorder=1设置为y方向上的1阶导数。
-
ksize − 内核大小。将ksize=5设置为5×5内核大小。
步骤
您可以使用以下步骤使用Sobel和Laplacian导数查找图像梯度 −
导入所需库。在以下所有Python示例中,必须使用的Python库是 OpenCV 。确保您已经安装了它。
import cv2
使用 cv2.imread() 读取输入图像作为灰度图像。
img = cv2.imread('lines.jpg',0)
使用 cv2.Sobel() 或 cv2.Laplacian() 计算Sobel或Laplacian导数。该导数指的是图像梯度。
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
使用 cv2.imshow() 方法显示图像梯度。
cv2.imshow("Sobel X", sobelx)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将使用此图像作为以下示例中的 输入文件。
示例1
在下面的Python程序中,我们使用X和Y方向的1阶Sobel导数计算图像梯度,即水平方向和垂直方向。我们使用5×5的内核大小。
# 导入所需库
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 以灰度图像的形式读取输入图像
img = cv2.imread('lines.jpg',0)
# 计算X方向上的1级Sobel导数
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
# 计算Y方向上的1级Sobel导数
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
# 显示sobelx和sobely
cv2.imshow("Sobel X", sobelx)
cv2.waitKey(0)
cv2.imshow("Sobel Y", sobely)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出
当您运行上面的程序时,它会产生以下 两个输出窗口 。Sobel X窗口显示X方向(水平)的导数,Sobel Y窗口显示Y方向(垂直)的导数。
示例2
在下面的Python程序中,我们使用Laplacian导数计算图像梯度。
# 导入所需库
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 以灰度图像的形式读取输入图像
img = cv2.imread('lines.jpg',0)
# 计算输入图像的Laplacian导数
laplacian = cv2.Laplacian(img,cv2.CV_64F)
# 显示laplacian
cv2.imshow("Laplacian", laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出
当您运行上面的程序时,它会产生以下 输出窗口 。