OpenCV 图形API(39)图像滤波----同时计算图像在 X 和 Y 方向上的一阶导数函数SobelXY()

  • 操作系统: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 cv::gapi::SobelXY ( const GMat & src, int ddepth, int order, int ksize = 3, double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT, const Scalar & borderValue = Scalar(0) ) ``` ### 参数 * 参数 src: 输入图像。 * 参数 ddepth: 输出图像深度,参见组合;对于8位输入图像,导数可能会被截断。 * 参数 order: 导数的阶数。 * 参数 ksize: 扩展 Sobel 核的大小;必须为奇数。 * 参数 scale: 计算导数值的可选比例因子;默认情况下,不应用缩放(详情参见 cv::getDerivKernels)。 * 参数 delta: 在存储到 dst 前添加到结果中的可选增量值。 * 参数 borderType: 像素外推方法,参见 cv::BorderTypes。 * 参数 borderValue: 在常量边界类型的情况下的边界值。 ### 代码示例 ```cpp #include #include #include int main() { // 读取输入图像 cv::Mat src = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_GRAYSCALE ); if ( src.empty() ) { std::cerr << "无法读取图像" << std::endl; return -1; } // 定义G-API网络 cv::GMat in; auto sobelXY = cv::gapi::SobelXY( in, CV_16S, 1 ); // 计算X和Y方向的一阶导数 cv::GComputation comp( cv::GIn( in ), cv::GOut( std::get< 0 >( sobelXY ), std::get< 1 >( sobelXY ) ) ); // 应用到源图像并获取结果 cv::Mat sobelX, sobelY; comp.apply( cv::gin( src ), cv::gout( sobelX, sobelY ) ); // 将结果转换为 CV_8U 并进行归一化以便显示 cv::Mat sobelXAbs, sobelYAbs; cv::convertScaleAbs( sobelX, sobelXAbs ); // 转换为 CV_8U 并取绝对值 cv::convertScaleAbs( sobelY, sobelYAbs ); // 转换为 CV_8U 并取绝对值 // 显示结果 cv::imshow( "Original Image", src ); cv::imshow( "Sobel X", sobelXAbs ); cv::imshow( "Sobel Y", sobelYAbs ); cv::waitKey( 0 ); return 0; } ``` ### 运行结果 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/58b7f71e9e994a42965e47989ebeeb8e.png)

相关推荐
F_D_Z11 分钟前
【PyTorch】图像多分类项目部署
人工智能·pytorch·python·深度学习·分类
音视频牛哥2 小时前
打通视频到AI的第一公里:轻量RTSP服务如何重塑边缘感知入口?
人工智能·计算机视觉·音视频·大牛直播sdk·机器视觉·轻量级rtsp服务·ai人工智能
Wendy14413 小时前
【灰度实验】——图像预处理(OpenCV)
人工智能·opencv·计算机视觉
中杯可乐多加冰3 小时前
五大低代码平台横向深度测评:smardaten 2.0领衔AI原型设计
人工智能
无线图像传输研究探索3 小时前
单兵图传终端:移动场景中的 “实时感知神经”
网络·人工智能·5g·无线图传·5g单兵图传
zzywxc7874 小时前
AI在编程、测试、数据分析等领域的前沿应用(技术报告)
人工智能·深度学习·机器学习·数据挖掘·数据分析·自动化·ai编程
铭keny5 小时前
YOLOv8 基于RTSP流目标检测
人工智能·yolo·目标检测
墨尘游子5 小时前
11-大语言模型—Transformer 盖楼,BERT 装修,RoBERTa 直接 “拎包入住”|预训练白话指南
人工智能·语言模型·自然语言处理
金井PRATHAMA5 小时前
主要分布于内侧内嗅皮层的层Ⅲ的网格-速度联合细胞(Grid × Speed Conjunctive Cells)对NLP中的深层语义分析的积极影响和启示
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·知识图谱
天道哥哥5 小时前
InsightFace(RetinaFace + ArcFace)人脸识别项目(预训练模型,鲁棒性很好)
人工智能·目标检测