OpenCV CUDA模块图像过滤------创建一个 Sobel 滤波器函数createSobelFilter()

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

该函数用于创建一个 Sobel 滤波器,用于在 GPU 上进行边缘检测。它基于图像的梯度计算:

  • dx 表示对 x 方向求导的阶数(0 或 1)
  • dy 表示对 y 方向求导的阶数(0 或 1)
  • 支持核大小为 1、3、5、7 等奇数尺寸(默认为 3)

由于是 CUDA 实现,适合大规模图像的高性能处理。

参数

参数名 类型 描述
srcType int 输入图像的数据类型。例如:CV_8UC1, CV_32FC4 等。
dstType int 输出图像的数据类型。通常与输入相同或转换为更高精度(如 CV_32F)。
dx int x 方向导数的阶数。取值为 0 或 1,表示是否对 x 方向求导。
dy int y 方向导数的阶数。取值为 0 或 1,表示是否对 y 方向求导。
ksize int Sobel 核大小,必须是正奇数,默认为 3。支持 1、3、5、7。
scale double 可选比例因子,默认为 1。可用于对结果进行缩放(如归一化)。
rowBorderMode int 垂直方向(行)的边界填充方式。常用值有 BORDER_DEFAULT, BORDER_REPLICATE 等。
columnBorderMode int 水平方向(列)的边界填充方式,默认为 -1,表示与 rowBorderMode 相同。

返回值

返回一个指向 cv::cuda::Filter 的智能指针 (Ptr),可以调用 .apply() 方法在 GPU 上执行 Sobel 边缘检测操作。

代码示例

以下是一个完整的使用 createSobelFilter 提取图像 x 和 y 方向梯度的示例代码:

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudafilters.hpp>

int main() {
    // 读取图像并上传到 GPU
    cv::Mat h_input = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_GRAYSCALE);
    if (h_input.empty()) {
        std::cerr << "无法加载图像!" << std::endl;
        return -1;
    }

    cv::cuda::GpuMat d_input, d_output_x, d_output_y;
    d_input.upload(h_input);

    // 创建 Sobel 滤波器(x方向)
    cv::Ptr<cv::cuda::Filter> sobelX = cv::cuda::createSobelFilter(
        d_input.type(),       // 输入类型
        CV_32F,               // 输出设为浮点型
        1,                    // x方向导数
        0,                    // y方向不导数
        3                     // 核大小
    );

    // 创建 Sobel 滤波器(y方向)
    cv::Ptr<cv::cuda::Filter> sobelY = cv::cuda::createSobelFilter(
        d_input.type(),
        CV_32F,
        0,
        1,
        3
    );

    // 应用滤波器
    sobelX->apply(d_input, d_output_x);
    sobelY->apply(d_input, d_output_y);

    // 下载结果并归一化显示
    cv::Mat h_output_x, h_output_y;
    d_output_x.download(h_output_x);
    d_output_y.download(h_output_y);

    cv::Mat out_x_u8, out_y_u8;
    cv::normalize(h_output_x, out_x_u8, 0, 255, cv::NORM_MINMAX, CV_8U);
    cv::normalize(h_output_y, out_y_u8, 0, 255, cv::NORM_MINMAX, CV_8U);

    cv::imshow("Sobel X", out_x_u8);
    cv::imshow("Sobel Y", out_y_u8);
    cv::waitKey(0);

    return 0;
}

运行结果

相关推荐
数新网络1 小时前
The Life of a Read/Write Query for Apache Iceberg Tables
人工智能·apache·知识图谱
Yangy_Jiaojiao2 小时前
开源视觉-语言-动作(VLA)机器人项目全景图(截至 2025 年)
人工智能·机器人
gorgeous(๑>؂<๑)2 小时前
【ICLR26匿名投稿】OneTrackerV2:统一多模态目标跟踪的“通才”模型
人工智能·机器学习·计算机视觉·目标跟踪
坠星不坠2 小时前
pycharm如何导入ai大语言模型的api-key
人工智能·语言模型·自然语言处理
周杰伦_Jay2 小时前
【智能体(Agent)技术深度解析】从架构到实现细节,核心是实现“感知环境→处理信息→决策行动→影响环境”的闭环
人工智能·机器学习·微服务·架构·golang·数据挖掘
王哈哈^_^3 小时前
【完整源码+数据集】课堂行为数据集,yolo课堂行为检测数据集 2090 张,学生课堂行为识别数据集,目标检测课堂行为识别系统实战教程
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计
Elastic 中国社区官方博客3 小时前
Observability:适用于 PHP 的 OpenTelemetry:EDOT PHP 加入 OpenTelemetry 项目
大数据·开发语言·人工智能·elasticsearch·搜索引擎·全文检索·php
神仙别闹4 小时前
基于 C++和 Python 实现计算机视觉
c++·python·计算机视觉
ytttr8734 小时前
Landweber迭代算法用于一维、二维图像重建
人工智能·算法·机器学习
feifeigo1234 小时前
Matlab编写压缩感知重建算法集
人工智能·算法·matlab