OpenCV 图形API(37)图像滤波-----分离过滤器函数sepFilter()

  • 操作系统: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)的一个函数。这个函数可以用来执行高效的二维卷积操作,特别适用于那些可以分解为两个一维滤波器的情况。

函数原型

cpp 复制代码
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: 在常量边界类型的情况下的边界值。

代码示例

cpp 复制代码
#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;
}

运行结果

相关推荐
深蓝AI30 分钟前
美团 LongCat-2.5 拆解:1.6T 参数只激活 3%,1M 上下文卖 0.3 美元,Agent 模型的账变了
人工智能·llm
小和尚同志5 小时前
54.6k star 的 Multica: 集多 Agent 和看板于一体的 AI 平台
人工智能·aigc·three.js
一枕槐安4876 小时前
少样本提示(Few-shot)在业务场景的落地实践
大数据·人工智能·意图分类·mmr多样性·knn检索·动态示例选择
王中阳Go7 小时前
后端转 Agent 岗面试怎么答:8 个高频问题与应答口径
人工智能·后端·python·大语言模型
海宇AI7 小时前
零信任架构实战:基于海宇个人风险报告构建自动化分期商城信用额度初审网关
运维·人工智能·架构·自动化
tellmewhoisi7 小时前
深度学习32:卷积神经网络:卷积层(卷积运算,填充,步幅)
人工智能·深度学习·cnn
weixin_307779137 小时前
RAG 面试陷阱——混合检索并非无条件优越:一个条件反转实验
人工智能·python·面试·职场和发展
Sinokap8 小时前
OpenAI 披露 AI 安全实验:智能体如何突破隔离边界?
人工智能·安全
云和数据.ChenGuang8 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain
重生之我在番茄自学网安拯救世界8 小时前
AI 开发者日报 第1期(本周精选)| 插件市场投毒、智能体搞出“官僚饥荒村”,十年前的 CNN 打赢大模型
人工智能·网络安全·大模型·ai编程·智能体