- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
应用一个可分离的线性滤波器到一个矩阵(图像)。
该函数对矩阵应用一个可分离的线性滤波器。也就是说,首先,src 的每一行都用一维核 kernelX 进行滤波。然后,所得结果的每一列都使用一维核 kernelY 进行滤波。最终结果被返回。
支持的矩阵数据类型包括 CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1。输出图像必须与输入图像具有相同的类型、大小和通道数。
cv::gapi::sepFilter 是 OpenCV 的 G-API 模块中用于对图像应用分离过滤器(separable filter)的一个函数。这个函数可以用来执行高效的二维卷积操作,特别适用于那些可以分解为两个一维滤波器的情况。
函数原型
GMat cv::gapi::sepFilter
(
const GMat & src,
int ddepth,
const Mat & kernelX,
const Mat & kernelY,
const Point & anchor,
const Scalar & delta,
int borderType = BORDER_DEFAULT,
const Scalar & borderValue = Scalar(0)
)
注意:
在浮点计算的情况下,如果硬件支持,则会进行向最近的偶数舍入(如果没有,则舍入到最近的值)。
函数文本ID是 “org.opencv.imgproc.filters.sepfilter”。
参数
参数 src: 源图像。
参数 ddepth: 目标图像的期望深度(支持以下 src.depth() 和 ddepth 的组合:
- 当 src.depth() = CV_8U 时,ddepth 可以是 -1/CV_16S/CV_32F/CV_64F
- 当 src.depth() = CV_16U/CV_16S 时,ddepth 可以是 -1/CV_32F/CV_64F
- 当 src.depth() = CV_32F 时,ddepth 可以是 -1/CV_32F/CV_64F
- 当 src.depth() = CV_64F 时,ddepth 可以是 -1/CV_64F 如果 ddepth=-1,输出图像将具有与源相同的深度)
参数kernelX: 用于滤波每一行的系数。
参数 kernelY: 用于滤波每一列的系数。
参数 anchor: 核内的锚点位置。默认值 (-1,-1) 表示锚点位于内核中心。
参数 delta: 在存储之前添加到滤波结果中的值。
参数 borderType: 像素外推方法,参见 cv::BorderTypes。
参数 borderValue: 在常量边界类型的情况下的边界值。
代码示例
#include <opencv2/gapi/gkernel.hpp>
#include <opencv2/gapi/imgproc.hpp>
#include <opencv2/opencv.hpp>
int main()
{
// 读取输入图像
cv::Mat src = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_COLOR );
if ( src.empty() )
{
std::cerr << "无法读取图像" << std::endl;
return -1;
}
// 定义水平和垂直方向的卷积核
cv::Mat kernelX = ( cv::Mat_< float >( 1, 3 ) << 1.0, 2.0, 1.0 ); // 示例水平卷积核
cv::Mat kernelY = ( cv::Mat_< float >( 3, 1 ) << 1.0, 2.0, 1.0 ); // 示例垂直卷积核
// 设置ddepth、anchor、delta和borderType等参数
int ddepth = -1; // 输出图像将具有与src相同的深度
cv::Point anchor( -1, -1 ); // 锚点位于卷积核中心
double delta = 0; // 不添加额外值
int borderType = cv::BORDER_DEFAULT;
// 创建G-API网络
cv::GMat in;
auto out = cv::gapi::sepFilter( in, ddepth, kernelX, kernelY, anchor, cv::Scalar( delta ), borderType );
cv::GComputation comp( cv::GIn( in ), cv::GOut( out ) );
// 应用到源图像并获取结果
cv::Mat dst;
comp.apply( cv::gin( src ), cv::gout( dst ) );
// 显示结果
cv::imshow( "Original Image", src );
cv::imshow( "Filtered Image", dst );
cv::waitKey( 0 );
return 0;
}