OpenCV CUDA模块图像处理------双边滤波的GPU版本函数bilateralFilter()

[复制链接]
发表于 2025-6-28 12:59:39 | 显示全部楼层 |阅读模式

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

该函数在 GPU 上执行双边滤波操作,是一种非线性平滑滤波器,能够在 保留边缘的同时去除噪声。
函数原型

  1. void cv::cuda::bilateralFilter        
  2. (
  3.         InputArray          src,
  4.         OutputArray          dst,
  5.         int          kernel_size,
  6.         float          sigma_color,
  7.         float          sigma_spatial,
  8.         int          borderMode = BORDER_DEFAULT,
  9.         Stream &          stream = Stream::Null()
  10. )                
复制代码
参数



  • src 源图像。支持的条件为:通道数不等于 2,且图像深度不能是 CV_8S、CV_32S 和 CV_64F。
  • dst 目标图像(输出图像)。
  • kernel_size 滤波核窗口巨细。
  • sigma_color 颜色空间中的滤波参数(标准差),用于控制颜色差异的影响水平。
  • sigma_spatial 坐标空间中的滤波参数(标准差),用于控制空间距离的影响水平。
  • borderMode 边界类型。具体细节请拜见 borderInterpolate 函数。目前支持的边界模式包罗:

    • BORDER_REFLECT101
    • BORDER_REPLICATE
    • BORDER_CONSTANT
    • BORDER_REFLECT 和 BORDER_WRAP

  • stream 用于异步执行的流(Stream)。若使用默认值 Stream::Null(),则函数为同步执行。
代码示例

  1. #include <iostream>
  2. #include <opencv2/cudaimgproc.hpp>
  3. #include <opencv2/opencv.hpp>
  4. int main()
  5. {
  6.     // Step 1: 读取图像
  7.     cv::Mat h_img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_COLOR );
  8.     if ( h_img.empty() )
  9.     {
  10.         std::cerr << "Failed to load image!" << std::endl;
  11.         return -1;
  12.     }
  13.     // Step 2: 将图像上传到 GPU
  14.     cv::cuda::GpuMat d_img, d_dst;
  15.     d_img.upload( h_img );
  16.     // Step 3: 执行双边滤波
  17.     int kernel_size     = 5;
  18.     float sigma_color   = 25.0f;
  19.     float sigma_spatial = 30.0f;
  20.     int borderMode      = cv::BORDER_DEFAULT;
  21.     cv::cuda::bilateralFilter( d_img, d_dst, kernel_size, sigma_color, sigma_spatial, borderMode );
  22.     // Step 4: 下载结果并显示
  23.     cv::Mat h_dst;
  24.     d_dst.download( h_dst );
  25.     cv::imshow( "Original", h_img );
  26.     cv::imshow( "Denoised (Bilateral)", h_dst );
  27.     cv::waitKey( 0 );
  28.     return 0;
  29. }
复制代码
运行结果



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

快速回复 返回顶部 返回列表