OpenCV CUDA模块图像过滤------创建一个盒式滤波器(Box Filter)函数createBoxFilter()
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
cv::cuda::createBoxFilter 是 OpenCV CUDA 模块中的一个工厂函数,用于创建一个 盒式滤波器(Box Filter),它在 GPU 上对图像进行卷积操作。这个滤波器常用于图像平滑(模糊),其原理是对图像中每个像素的邻域区域取平均值。
函数原型
cv::Ptr<cv::cuda::Filter> cv::cuda::createBoxFilter
(int srcType, // 输入图像类型int dstType, // 输出图像类型(通常设为 -1 表示与输入相同)cv::Size ksize, // 卷积核大小(例如 Size(5, 5))cv::Point anchor = cv::Point(-1, -1), // 锚点位置,默认为中心点int borderMode = cv::BORDER_DEFAULT, // 边界填充方式cv::Scalar borderVal = cv::Scalar::all(0) // 常量边界时的填充值
);
参数说明
参数名 | 类型 | 描述 |
---|---|---|
srcType | int | 输入图像的数据类型,如 CV_8UC3(8位无符号三通道图像)。 |
dstType | int | 输出图像的数据类型。若为 -1,表示与输入图像相同。 |
ksize | cv::Size | 卷积核大小(宽 x 高),例如 cv::Size(5, 5)。建议使用奇数尺寸以保证锚点居中。 |
anchor | cv::Point | 卷积核的锚点位置,默认是 (-1, -1),即中心点。 |
borderMode | int | 边界扩展模式,常用值:cv::BORDER_DEFAULT, cv::BORDER_CONSTANT, cv::BORDER_REPLICATE 等。 |
borderVal | cv::Scalar | 如果 borderMode == BORDER_CONSTANT,则用该值填充边界,默认为黑色(全零)。 |
代码示例
#include <iostream>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/cudafilters.hpp>int main()
{// 读取图像cv::Mat h_img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_COLOR );if ( h_img.empty() ){std::cerr << "Error: Image not found!" << std::endl;return -1;}// 将图像转换为支持的数据类型cv::Mat h_gray;if ( h_img.channels() == 3 ){cv::cvtColor( h_img, h_gray, cv::COLOR_BGR2GRAY ); // 转换为灰度图像}else if ( h_img.channels() == 4 ){std::vector< cv::Mat > channels;cv::split( h_img, channels );h_gray = channels[ 0 ]; // 使用第一个通道作为灰度图像}else{h_gray = h_img; // 如果已经是单通道,则直接使用}// 上传图像到 GPUcv::cuda::GpuMat d_src, d_dst;d_src.upload( h_gray );// 创建 Box Filtercv::Ptr< cv::cuda::Filter > boxFilter = cv::cuda::createBoxFilter( d_src.type(), // 输入图像类型-1, // 输出类型与输入一致cv::Size( 5, 5 ), // 卷积核大小cv::Point( -1, -1 ), // 锚点默认为中心cv::BORDER_DEFAULT // 默认边界处理);// 应用滤波器boxFilter->apply( d_src, d_dst );// 下载结果回 CPUcv::Mat h_dst;d_dst.download( h_dst );// 显示结果cv::imshow( "Original", h_img );cv::imshow( "Box Filtered", h_dst );cv::waitKey( 0 );return 0;
}