- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
cv::gapi::SobelXY 函数是 OpenCV 的 G-API 模块中用于同时计算图像在 X 和 Y 方向上的一阶导数(即 Sobel 边缘检测)的一个便捷函数。此函数返回一个包含两个 GMat 的 std::tuple,分别代表 X 方向和 Y 方向的导数结果。
使用扩展的 Sobel 算子计算一阶、二阶、三阶或混合图像导数。
在所有情况下(除了一个),使用 ksize×ksize 可分离核来计算导数。当 ksize = 1 时,使用 3×1 或 1×3 核(即,不进行高斯平滑)。ksize = 1 仅可用于计算一阶或二阶 x- 或 y- 导数。
还有一个特殊的值 ksize = FILTER_SCHARR (-1),对应于 3×3 Scharr 滤波器,它可能比 3×3 Sobel 滤波器提供更准确的结果。Scharr 孔径为
− 3 0 3 − 10 0 10 − 3 0 3 \] \\begin{bmatrix} -3 \& 0 \& 3 \\\\ -10 \& 0 \& 10 \\\\ -3 \& 0 \& 3 \\end{bmatrix} −3−10−30003103
用于 x 导数,或者转置后用于 y 导数。
该函数通过将图像与适当的核卷积来计算图像导数:
dst = ∂ x o r d e r + y o r d e r src ∂ x x o r d e r ∂ y y o r d e r \\texttt{dst} = \\frac{\\partial\^{xorder+yorder} \\texttt{src}}{\\partial x\^{xorder} \\partial y\^{yorder}} dst=∂xxorder∂yyorder∂xorder+yordersrc
Sobel 算子结合了高斯平滑和微分,因此结果对噪声具有某种程度的抵抗性。通常,该函数被调用为 (xorder = 1, yorder = 0, ksize = 3) 或 (xorder = 0, yorder = 1, ksize = 3),以计算一阶 x 或 y 图像导数。第一种情况对应于以下核:
\[ − 1 − 2 − 1 0 0 0 1 2 1 \] \\begin{bmatrix} -1 \& -2 \& -1 \\\\ 0 \& 0 \& 0 \\\\ 1 \& 2 \& 1 \\end{bmatrix} −101−202−101
第二种情况对应于以下核:
\[ − 1 0 1 − 2 0 2 − 1 0 1 \] \\begin{bmatrix} -1 \& 0 \& 1 \\\\ -2 \& 0 \& 2 \\\\ -1 \& 0 \& 1 \\end{bmatrix} −1−2−1000121
**注意:**
第一个返回的矩阵对应于 dx 导数,而第二个对应于 dy。
如果硬件支持,则会进行向最近偶数的舍入;如果不支持,则舍入到最近。
函数文本ID是 "org.opencv.imgproc.filters.sobelxy"
### 函数原型
```cpp
std::tuple