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;
}

运行结果

相关推荐
妄想成为master13 分钟前
计算机视觉----时域频域在图像中的意义、傅里叶变换在图像中的应用、卷积核的频域解释
人工智能·计算机视觉·傅里叶
NLP小讲堂29 分钟前
LLaMA Factory 深度调参
人工智能·机器学习
不懂嵌入式35 分钟前
基于深度学习的水果识别系统设计
人工智能·深度学习
江小皮不皮44 分钟前
为何选择MCP?自建流程与Anthropic MCP的对比分析
人工智能·llm·nlp·aigc·sse·mcp·fastmcp
GIS数据转换器1 小时前
当三维地理信息遇上气象预警:电网安全如何实现“先知先觉”?
人工智能·科技·安全·gis·智慧城市·交互
网易易盾1 小时前
AIGC时代的内容安全:AI检测技术如何应对新型风险挑战?
人工智能·安全·aigc
工头阿乐1 小时前
PyTorch中的nn.Embedding应用详解
人工智能·pytorch·embedding
alpszero1 小时前
YOLO11解决方案之物体模糊探索
人工智能·python·opencv·计算机视觉·yolo11
vlln1 小时前
适应性神经树:当深度学习遇上决策树的“生长法则”
人工智能·深度学习·算法·决策树·机器学习
奋斗者1号1 小时前
机器学习之决策树与决策森林:机器学习中的强大工具
人工智能·决策树·机器学习