- 操作体系: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;
- }
复制代码 运行结果
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|