OpenCV 图形API(24)图像滤波-----双边滤波函数bilateralFilter()

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

算法描述

应用双边滤波到图像。

该函数对输入图像应用双边滤波,如 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html 所描述的那样。bilateralFilter 可以很好地减少不需要的噪声,同时保持边缘相当锐利。然而,与大多数滤波器相比,它的速度非常慢。

Sigma值:为了简单起见,你可以将两个sigma值设置为相同。如果它们较小(< 10),滤波器不会有太大效果;而如果它们较大(> 150),则会产生很强的效果,使图像看起来"卡通化"。

滤波器大小:大的滤波器(d > 5)非常慢,因此建议在实时应用中使用 d=5,在需要大量噪声过滤的离线应用中可以考虑使用 d=9。

此滤波器不支持原地操作。

注意

函数文本ID是 "org.opencv.imgproc.filters.bilateralfilter"

函数原型

cpp 复制代码
GMat cv::gapi::bilateralFilter 	
(
 	const GMat &  	src,
	int  	d,
	double  	sigmaColor,
	double  	sigmaSpace,
	int  	borderType = BORDER_DEFAULT 
) 	

参数

  • 参数 src: 源8位或浮点型,单通道或三通道图像。
  • 参数 d: 在滤波过程中使用的每个像素邻域的直径。如果它不大于零,则从 sigmaSpace 计算得出。
  • 参数 sigmaColor: 颜色空间中的滤波sigma值。该参数值越大表示颜色差异的影响越小,导致在颜色相近的像素之间混合更大的区域。
  • 参数 sigmaSpace: 坐标空间中的滤波sigma值。该参数值越大表示距离的影响越小,只要它们的颜色足够接近(参见 sigmaColor)。当 d>0 时,它指定邻域大小而不考虑 sigmaSpace。否则,d 与 sigmaSpace 成正比。
  • 参数 borderType: 边界模式用于外推图像外部的像素,请参阅 BorderTypes

返回值

返回与 src 相同大小和类型的输出图像。

代码示例

cpp 复制代码
#include <opencv2/gapi/core.hpp>     // 包含G-API核心功能
#include <opencv2/gapi/imgproc.hpp>  // 包含imgproc模块,可能需要的其他G-API模块
#include <opencv2/opencv.hpp>

int main()
{
    // 加载输入图像
    cv::Mat src = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png" );
    if ( src.empty() )
    {
        std::cerr << "Error: Image cannot be loaded!" << std::endl;
        return -1;
    }

    // 定义双边滤波参数
    int d             = 9;                   // 邻域直径
    double sigmaColor = 100;                  // 颜色空间的标准差
    double sigmaSpace = 100;                  // 坐标空间的标准差
    int borderType    = cv::BORDER_DEFAULT;  // 边界填充模式

    // 定义G-API计算图来应用双边滤波
    cv::GComputation comp( [ d, sigmaColor, sigmaSpace, borderType ]() {
        cv::GMat in;  // 输入:源图像
        cv::GMat out = cv::gapi::bilateralFilter( in, d, sigmaColor, sigmaSpace, borderType );
        return cv::GComputation( cv::GIn( in ), cv::GOut( out ) );
    } );

    // 输出结果
    cv::Mat dst;

    try
    {
        // 执行计算图并传入实际的cv::Mat数据
        comp.apply( cv::gin( src ), cv::gout( dst ) );

        // 显示结果
        cv::imshow( "Original Image", src );
        cv::imshow( "Filtered Image", dst );
        cv::waitKey( 0 );  // 等待按键事件
    }
    catch ( const std::exception& e )
    {
        std::cerr << "Exception: " << e.what() << std::endl;
        return -1;
    }

    return 0;
}

运行结果

相关推荐
OpenMiniServer2 分钟前
GitLab AI革命:如何将智能开发融入你的DevOps工作流
人工智能·gitlab·devops
寻星探路5 分钟前
【算法专题】哈希表:从“两数之和”到“最长连续序列”的深度解析
java·数据结构·人工智能·python·算法·ai·散列表
非凡ghost7 分钟前
ImageConverter(图像转换编辑工具)
图像处理·人工智能·windows·学习·计算机视觉·软件需求
猫头虎10 分钟前
Claude Code 2026 年1月9日迎来大更新:Agent 能力增强(2.1.0 详解 + 升级指南)
ide·人工智能·macos·langchain·编辑器·aigc·ai编程
子午13 分钟前
【2026原创】中草药识别系统实现~Python+深度学习+模型训练+人工智能
人工智能·python·深度学习
编码小哥21 分钟前
OpenCV特征匹配:暴力匹配与FLANN匹配实战
人工智能·opencv·计算机视觉
数字游民952726 分钟前
网站备案全流程回放(腾讯云)
人工智能·git·github·腾讯云·网站备案·waytoopc
飞哥数智坊29 分钟前
3位实战分享、6个案例展示,TRAE Friends@济南第二场圆满完成
人工智能·ai编程·trae
xiaobaishuoAI30 分钟前
全链路性能优化实战指南:从瓶颈定位到极致优化
大数据·人工智能·科技·百度·geo
人工小情绪30 分钟前
深度学习模型部署形式
人工智能·深度学习