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

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

算法描述

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

函数原型

void cv::cuda::bilateralFilter
(
InputArray src,
OutputArray dst,
int kernel_size,
float sigma_color,
float sigma_spatial,
int borderMode = BORDER_DEFAULT,
Stream & stream = Stream::Null(
)
)

参数

  • 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(),则函数为同步执行。

代码示例

#
include <iostream>
  #
  include <opencv2/cudaimgproc.hpp>
    #
    include <opencv2/opencv.hpp>
      int main(
      )
      {
      // Step 1: 读取图像
      cv::Mat h_img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png"
      , cv::IMREAD_COLOR )
      ;
      if ( h_img.empty(
      )
      )
      {
      std::cerr <<
      "Failed to load image!" << std::endl;
      return -1
      ;
      }
      // Step 2: 将图像上传到 GPU
      cv::cuda::GpuMat d_img, d_dst;
      d_img.upload( h_img )
      ;
      // Step 3: 执行双边滤波
      int kernel_size = 5
      ;
      float sigma_color = 25.0f
      ;
      float sigma_spatial = 30.0f
      ;
      int borderMode = cv::BORDER_DEFAULT;
      cv::cuda::bilateralFilter( d_img, d_dst, kernel_size, sigma_color, sigma_spatial, borderMode )
      ;
      // Step 4: 下载结果并显示
      cv::Mat h_dst;
      d_dst.download( h_dst )
      ;
      cv::imshow( "Original"
      , h_img )
      ;
      cv::imshow( "Denoised (Bilateral)"
      , h_dst )
      ;
      cv::waitKey( 0
      )
      ;
      return 0
      ;
      }

运行结果

在这里插入图片描述

posted @ 2025-10-07 15:44  yxysuanfa  阅读(6)  评论(0)    收藏  举报