OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
图像梯度

目标

理论

OpenCV 提供了三种类型的梯度滤波器或高通滤波器,Sobel、Scharr 和 Laplacian。我们将逐一了解它们。

1. Sobel 和 Scharr 导数

Sobel 算子是一种联合高斯平滑加微分运算,因此它对噪声的抵抗力更强。您可以指定要取的导数的方向,垂直或水平(分别通过参数 yorder 和 xorder)。您还可以通过参数 ksize 指定内核的大小。如果 ksize = -1,则使用 3x3 Scharr 滤波器,其结果比 3x3 Sobel 滤波器更好。请参阅文档了解使用的内核。

我们使用函数:cv.Sobel (src, dst, ddepth, dx, dy, ksize = 3, scale = 1, delta = 0, borderType = cv.BORDER_DEFAULT)

参数
src输入图像。
dst与 src 大小和通道数相同的输出图像。
ddepth输出图像深度(参见 cv.combinations);在 8 位输入图像的情况下,将导致截断的导数。
dx导数 x 的阶数。
dy导数 y 的阶数。
ksize扩展 Sobel 核的大小;它必须是 1、3、5 或 7。
scale计算的导数值的可选比例因子。
delta可选的 delta 值,该值在存储到 dst 中之前添加到结果中。
borderType像素外推方法(参见 cv.BorderTypes)。

cv.Scharr (src, dst, ddepth, dx, dy, scale = 1, delta = 0, borderType = cv.BORDER_DEFAULT)

参数
src输入图像。
dst与 src 大小和通道数相同的输出图像。
ddepth输出图像深度(参见 cv.combinations)。
dx导数 x 的阶数。
dy导数 y 的阶数。
scale计算的导数值的可选比例因子。
delta可选的 delta 值,该值在存储到 dst 中之前添加到结果中。
borderType像素外推方法(参见 cv.BorderTypes)。

尝试一下

2. Laplacian 导数

它计算图像的拉普拉斯算子,由关系式 \(\Delta src = \frac{\partial ^2{src}}{\partial x^2} + \frac{\partial ^2{src}}{\partial y^2}\) 给出,其中每个导数都使用 Sobel 导数找到。如果 ksize = 1,则以下内核用于滤波

\[kernel = \begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix}\]

我们使用函数:cv.Laplacian (src, dst, ddepth, ksize = 1, scale = 1, delta = 0, borderType = cv.BORDER_DEFAULT)

参数
src输入图像。
dst与 src 大小和通道数相同的输出图像。
ddepth输出图像深度。
ksize用于计算二阶导数滤波器的孔径大小。
scale计算的拉普拉斯值的可选比例因子。
delta可选的 delta 值,该值在存储到 dst 中之前添加到结果中。
borderType像素外推方法(参见 cv.BorderTypes)。

尝试一下

一个重要的事项!

在我们的最后一个示例中,输出数据类型是 cv.CV_8U。但是这有一个小问题。从黑色到白色的过渡被视为正斜率(它具有正值),而从白色到黑色的过渡被视为负斜率(它具有负值)。因此,当您将数据转换为 cv.CV_8U 时,所有负斜率都会变为零。简单来说,您错过了该边缘。

如果您想检测两个边缘,更好的选择是将输出数据类型保持为更高的形式,例如 cv.CV_16S、cv.CV_64F 等,取其绝对值,然后转换回 cv.CV_8U。下面的代码演示了水平 Sobel 滤波器的这个过程和结果的差异。

尝试一下