OpenCV CUDA模块图像过滤------创建一个盒式滤波器(Box Filter)函数creat ...

打印 上一主题 下一主题

主题 1934|帖子 1934|积分 5812


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

cv::cuda::createBoxFilter 是 OpenCV CUDA 模块中的一个工厂函数,用于创建一个 盒式滤波器(Box Filter),它在 GPU 上对图像进行卷积操纵。这个滤波器常用于图像平滑(含糊),其原理是对图像中每个像素的邻域地域取平均值。
函数原型

  1. cv::Ptr<cv::cuda::Filter> cv::cuda::createBoxFilter
  2. (
  3.     int srcType,              // 输入图像类型
  4.     int dstType,              // 输出图像类型(通常设为 -1 表示与输入相同)
  5.     cv::Size ksize,           // 卷积核大小(例如 Size(5, 5))
  6.     cv::Point anchor = cv::Point(-1, -1),  // 锚点位置,默认为中心点
  7.     int borderMode = cv::BORDER_DEFAULT,   // 边界填充方式
  8.     cv::Scalar borderVal = cv::Scalar::all(0)  // 常量边界时的填充值
  9. );
复制代码
参数说明

参数名范例描述srcTypeint输入图像的数据范例,如 CV_8UC3(8位无符号三通道图像)。dstTypeint输出图像的数据范例。若为 -1,表现与输入图像相同。ksizecv::Size卷积核巨细(宽 x 高),比方 cv::Size(5, 5)。发起使用奇数尺寸以包管锚点居中。anchorcv:oint卷积核的锚点位置,默认是 (-1, -1),即中心点。borderModeint界限扩展模式,常用值:cv::BORDER_DEFAULT, cv::BORDER_CONSTANT, cv::BORDER_REPLICATE 等。borderValcv::Scalar如果 borderMode == BORDER_CONSTANT,则用该值填充界限,默认为玄色(全零)。 代码示例

  1. #include <iostream>
  2. #include <opencv2/cudaimgproc.hpp>
  3. #include <opencv2/opencv.hpp>
  4. #include <opencv2/cudafilters.hpp>
  5. int main()
  6. {
  7.     // 读取图像
  8.     cv::Mat h_img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_COLOR );
  9.     if ( h_img.empty() )
  10.     {
  11.         std::cerr << "Error: Image not found!" << std::endl;
  12.         return -1;
  13.     }
  14.     // 将图像转换为支持的数据类型
  15.     cv::Mat h_gray;
  16.     if ( h_img.channels() == 3 )
  17.     {
  18.         cv::cvtColor( h_img, h_gray, cv::COLOR_BGR2GRAY );  // 转换为灰度图像
  19.     }
  20.     else if ( h_img.channels() == 4 )
  21.     {
  22.         std::vector< cv::Mat > channels;
  23.         cv::split( h_img, channels );
  24.         h_gray = channels[ 0 ];  // 使用第一个通道作为灰度图像
  25.     }
  26.     else
  27.     {
  28.         h_gray = h_img;  // 如果已经是单通道,则直接使用
  29.     }
  30.     // 上传图像到 GPU
  31.     cv::cuda::GpuMat d_src, d_dst;
  32.     d_src.upload( h_gray );
  33.     // 创建 Box Filter
  34.     cv::Ptr< cv::cuda::Filter > boxFilter = cv::cuda::createBoxFilter( d_src.type(),         // 输入图像类型
  35.                                                                        -1,                   // 输出类型与输入一致
  36.                                                                        cv::Size( 5, 5 ),     // 卷积核大小
  37.                                                                        cv::Point( -1, -1 ),  // 锚点默认为中心
  38.                                                                        cv::BORDER_DEFAULT    // 默认边界处理
  39.     );
  40.     // 应用滤波器
  41.     boxFilter->apply( d_src, d_dst );
  42.     // 下载结果回 CPU
  43.     cv::Mat h_dst;
  44.     d_dst.download( h_dst );
  45.     // 显示结果
  46.     cv::imshow( "Original", h_img );
  47.     cv::imshow( "Box Filtered", h_dst );
  48.     cv::waitKey( 0 );
  49.     return 0;
  50. }
复制代码
运行结果



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

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表