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

运行结果

相关推荐
Coovally AI模型快速验证6 分钟前
超越传统3D生成:OccScene实现感知与生成的跨任务共赢
人工智能·深度学习·机器学习·计算机视觉·3d·目标跟踪
AiTop10014 分钟前
美团LongCat-Flash-Omni上线:5600亿参数实现音视频交互“零延迟”
人工智能·ai·aigc·音视频·交互
IT_陈寒19 分钟前
Vite 5震撼发布!10个新特性让你的开发效率飙升200% 🚀
前端·人工智能·后端
万俟淋曦19 分钟前
NVIDIA DriveOS 推动新一代智能汽车实现突破
人工智能·ai·汽车·nvidia·智能汽车·driveos·driveworks
rengang6621 分钟前
14-循环神经网络(RNN):分析RNN在序列数据中的表现和特点
人工智能·rnn·深度学习
Toky丶1 小时前
具身智能(一)关于VLA模型π0
人工智能
岛屿旅人1 小时前
英国国防部推进本土化开放架构建设
网络·人工智能·安全·web安全·架构
chenchihwen1 小时前
AI代码开发宝库系列:LangChain 工具链:从LCEL到实际应用
人工智能·python·langchain·rag
TwoAnts&DingJoy1 小时前
数据分析-数据沙箱
人工智能·python·安全·数据分析·数据沙箱
FreeCode1 小时前
Agent开发:LangChain1.0快速入门(一)
人工智能·llm·agent