当前位置: 首页 > news >正文

OpenCV图像滤波(1)双边滤波函数bilateralFilter的使用

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

功能描述

bilateralFilter是图像处理和计算机视觉领域中的一种高级图像滤波技术,特别设计用于在去除噪声的同时保留图像的边缘和细节。相比于传统的滤波器,如均值滤波或高斯滤波,双边滤波器能够在平滑图像的同时保持重要特征的清晰度。

双边滤波器的工作原理是通过一个高斯权重函数来计算每个像素的输出值,这个函数不仅考虑到空间上的邻近度,还考虑到像素值(强度或颜色)的相似度。换句话说,每个像素的新值是由其周围像素的加权平均得出的,其中权重取决于两个因素:空间距离和像素强度差异。

函数原型

函数应用双边滤波器到输入图像上,双边滤波器能够非常好地减少不想要的噪声,同时保持边缘相当清晰。然而,与大多数滤波器相比,它的运行速度非常慢。

标准差值(Sigma values):为了简化设置,你可以将两个标准差值设置为相同。如果它们很小(< 10),滤波器的效果将不明显;而如果它们很大(> 150),滤波器的效果会非常强烈,可能会使图像呈现出“卡通化”的外观。

滤波器尺寸:大尺寸的滤波器(d > 5)运行得非常慢,因此对于实时应用,建议使用d=5;而对于需要重度降噪的离线应用,或许可以使用d=9。

此滤波器不会在原地(inplace)工作,也就是说,它不会直接修改输入图像,而是产生一个新的输出图像。

void cv::bilateralFilter	
(InputArray 	src,OutputArray 	dst,int 	d,double 	sigmaColor,double 	sigmaSpace,int 	borderType = BORDER_DEFAULT 
)		

参数

  • 参数 src 可以是8位或浮点型,单通道或三通道的图像。
  • 参数 dst 目标图像,其大小和类型与源图像src相同 。
  • 参数 d 在过滤过程中使用的每个像素邻域的直径。如果该值是非正数,它将从sigmaSpace计算得出。
  • 参数 sigmaColor 色彩空间中的滤波器标准差。参数值越大意味着在像素邻域内(参见sigmaSpace)距离较远的颜色会被更多地混合在一起,从而导致更大区域的半等色块出现。
  • 参数 sigmaSpace坐标空间中的滤波器标准差。参数值越大意味着只要颜色足够接近(参见sigmaColor),距离较远的像素也会相互影响。当d>0时,它规定了邻域的大小,不受sigmaSpace的影响。否则,d与sigmaSpace成比例。
  • 参数 borderType 用于推算图像外像素的边界模式,详情请参阅BorderTypes

代码


#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv)
{// 读取图像cv::Mat src = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/fruit_small.jpg", cv::IMREAD_COLOR);if (!src.data){std::cerr << "Error: Image cannot be loaded.\n";return -1;}// 设置双边滤波参数int d = 9;          // 直径double sigmaColor = 210; // 颜色空间标准差double sigmaSpace = 75; // 坐标空间标准差cv::Mat dst;// 应用双边滤波cv::bilateralFilter(src, dst, d, sigmaColor, sigmaSpace);// 显示原图和处理后的图像cv::namedWindow("Original Image", cv::WINDOW_NORMAL);cv::imshow("Original Image", src);cv::namedWindow("Bilateral Filtered Image", cv::WINDOW_NORMAL);cv::imshow("Bilateral Filtered Image", dst);// 等待用户按键退出cv::waitKey(0);return 0;
}

运行结果

在这里插入图片描述

你可以修改sigmaColor和sigmaSpace的值,看看运行效果有啥不同,增强对参数的理解

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 小规模的LLMS
  • C# 使用pythonnet 迁入 python 初始化错误解决办法
  • GO版本更新
  • [Meachines] Lame smbd3.0-RCE
  • 一文解决 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置
  • 可能是目前最全面的前端提测/自测标准
  • AI有关的学习和python
  • 数据结构-C语言-排序(4)
  • 测试工作中常听到的名词解释 : )
  • Java中的object类与objects类
  • paramiko 模块
  • 微信小程序-自定义tabBar
  • 认证中心:基于cookie和session实现单点登陆
  • 【后端开发实习】Python基于Quart框架实现SSE数据传输
  • 科普文:5种Linux下软件部署方式说明
  • ----------
  • [数据结构]链表的实现在PHP中
  • 2019年如何成为全栈工程师?
  • 4. 路由到控制器 - Laravel从零开始教程
  • express如何解决request entity too large问题
  • javascript面向对象之创建对象
  • Java深入 - 深入理解Java集合
  • Js基础知识(四) - js运行原理与机制
  • JS数组方法汇总
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • leetcode讲解--894. All Possible Full Binary Trees
  • Mysql数据库的条件查询语句
  • Nacos系列:Nacos的Java SDK使用
  • Protobuf3语言指南
  • python大佬养成计划----difflib模块
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 码农张的Bug人生 - 见面之礼
  • 排序(1):冒泡排序
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 入口文件开始,分析Vue源码实现
  • 一个完整Java Web项目背后的密码
  • 译米田引理
  • 原生 js 实现移动端 Touch 滑动反弹
  • 云大使推广中的常见热门问题
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 你对linux中grep命令知道多少?
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​用户画像从0到100的构建思路
  • #{} 和 ${}区别
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #NOIP 2014# day.2 T2 寻找道路
  • (12)Linux 常见的三种进程状态
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (9)STL算法之逆转旋转
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C++17) optional的使用
  • (javascript)再说document.body.scrollTop的使用问题
  • (Java入门)抽象类,接口,内部类
  • (Java入门)学生管理系统
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布