OpenCV(cv::bilateralFilter())

news/2024/9/19 12:55:49/文章来源:https://www.cnblogs.com/keye/p/18417408

目录
  • 1. 函数定义
  • 2. 双边滤波的工作原理
  • 3. 应用场景
  • 4. 示例
  • 5. 与其他滤波器的比较
  • 6. 性能优化
  • 7. 注意事项
  • 结论



cv::bilateralFilter() 是 OpenCV 中用于图像平滑处理。与传统的线性滤波器(如高斯滤波器)不同,它同时考虑空间邻近性和像素值相似性,从而保留边缘的细节。

1. 函数定义

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

参数:

  1. src: 输入图像,可以是 8 位或浮点型单通道或多通道图像。
  2. dst: 输出图像,与输入图像具有相同的尺寸和类型。
  3. d: 每个像素邻域的直径。如果为负值,OpenCV 会根据 sigmaSpace 自动计算。
  4. sigmaColor: 用于计算颜色距离的标准差。较大的值会使得颜色相差较大的像素也能相互影响,导致更强的平滑效果。
  5. sigmaSpace: 用于计算空间距离的标准差。较大的值意味着更远的像素会相互影响,影响范围更大。
  6. borderType: 图像边界的处理方式,默认为 BORDER_DEFAULT。其他常用的选项包括 BORDER_CONSTANTBORDER_REFLECT 等。


2. 双边滤波的工作原理

双边滤波器是一种非线性滤波器,它基于两个不同的高斯函数:

  1. 空间高斯权重(Gaussian Spatial Weight): 取决于像素在空间上的距离,距离越近的像素权重越大。
  2. 颜色高斯权重(Gaussian Color Weight): 取决于像素值(颜色)之间的差异,颜色差异越小的像素权重越大。

最终,每个像素的输出值是其邻域内所有像素值的加权平均,权重是上述两个高斯权重的乘积。这种方法可以有效地在保持边缘清晰的同时去除噪声。

数学表达式:

\[I_{out}(x) = \frac{1}{W_p} \sum_{y \in S} I(y) \cdot \exp\left(-\frac{\|x - y\|^2}{2\sigma_{space}^2}\right) \cdot \exp\left(-\frac{\|I(x) - I(y)\|^2}{2\sigma_{color}^2}\right) \]

其中:

  • \(W_p\) 是归一化系数,用于确保权重总和为 1。
  • \(S\) 是邻域内的像素集合。
  • \(\exp\left(-\frac{\|x - y\|^2}{2\sigma_{space}^2}\right)\) 是基于空间距离的高斯权重。
  • \(\exp\left(-\frac{\|I(x) - I(y)\|^2}{2\sigma_{color}^2}\right)\) 是基于颜色差异的高斯权重。


3. 应用场景

  1. 图像去噪:在去除图像噪声的同时,保留边缘细节。
  2. 边缘保持平滑:适用于需要平滑图像但不希望模糊边缘的应用,如医学图像处理。
  3. 图像增强:在某些图像增强技术中,用于平滑处理以突出重要特征。


4. 示例

以下是一个使用 cv::bilateralFilter 的示例:

#include <opencv2/opencv.hpp>
#include <iostream>int main()
{// 读取输入图像cv::Mat src = cv::imread("input.jpg");if (src.empty()){std::cerr << "无法读取图像!" << std::endl;return -1;}cv::Mat dst;// 应用双边滤波// d = 9,sigmaColor = 75,sigmaSpace = 75cv::bilateralFilter(src, dst, 9, 75, 75);// 显示结果cv::imshow("原始图像", src);cv::imshow("双边滤波结果", dst);cv::waitKey(0);return 0;
}

参数选择的影响:

  • d(邻域直径):

    • 较小的值:仅考虑局部邻域,计算量较小,但平滑效果有限。
    • 较大的值:考虑更大范围的像素,平滑效果更显著,但计算量增加。
  • sigmaColor

    • 较小的值:仅考虑颜色非常接近的像素,有助于保留更多的边缘细节。
    • 较大的值:允许颜色差异较大的像素相互影响,可能导致边缘模糊。
  • sigmaSpace

    • 较小的值:仅考虑空间上接近的像素。
    • 较大的值:允许空间上较远的像素参与计算,适用于更大范围的平滑。


5. 与其他滤波器的比较

  • 高斯滤波器(Gaussian Filter):

    • 线性滤波器,权重仅依赖于空间距离。
    • 无法有效保留边缘,可能导致边缘模糊。
  • 中值滤波器(Median Filter):

    • 非线性滤波器,常用于去除椒盐噪声。
    • 能够保留边缘,但在处理连续噪声时效果不如双边滤波。
  • 双边滤波器(Bilateral Filter):

    • 非线性滤波器,权重同时依赖于空间距离和颜色差异。
    • 能够在去噪的同时更好地保留边缘细节,但计算复杂度较高。


6. 性能优化

双边滤波器计算量较大,特别是在高分辨率图像上。以下是一些常见的优化方法:

  1. 使用快速双边滤波算法:如快速双边滤波(Fast Bilateral Filter)或双边中值滤波(Bilateral Median Filter)。
  2. 降采样处理:在较低分辨率下应用滤波,然后再上采样回原始分辨率。
  3. 并行计算:利用 GPU 或多线程加速计算。


7. 注意事项

  • 双边滤波速度较慢,因为它需要计算每个像素与其邻域所有像素的颜色和空间差异。
  • 通常,使用较大的 sigmaSpace 和较小的 sigmaColor 值可以有效去除噪声并保留边缘。
  • 对于多通道图像(如彩色图像),双边滤波器会分别处理每个通道,可能导致颜色偏移。为避免这种情况,可以先将图像转换到其他颜色空间(如 Lab),然后进行滤波。

结论

cv::bilateralFilter() 是一个强大的图像平滑工具,能够在去除噪声的同时保持图像的边缘信息。尽管其计算复杂度较高,但通过合理的参数选择和优化技术,可以在实际应用中获得良好的效果。适用于需要边缘保留的图像处理任务,如图像去噪、图像增强和特征提取等。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/798725.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

章13——包装类——StringBuilder类

StringBuilder介绍其继承关系和 StringBuffer 是一样的。同 StringBuffer 一样,是在堆中(value[])而非在常量池中。 三种 String 的对比有关复用率高的解读:String 的内容在常量池中,相同内容的对象(或其在堆中的东西)都可以指向常量池中的同一个位置 效率问题:StringB…

章13——常用类——StringBuffer类

基本介绍即 StringBuffer 是存在堆中的而非常量池中的。(value 数组存放字符串内容) 与 String 的对比StringBuffer:不用每次更新地址,但当数组空间不够时,会扩大并且更新地址。 构造器StringBuffer stringBuffer = new StringBuffer();StringBuffer stringBuffer1 = new …

Windows的树形目录结构

一、文件、文件夹(目录)、逻辑盘、路径的概念文件:是操作系统用来存储和管理信息的基本单位文件夹也叫目录:是文件的集合体,文件夹中可包含多个文件,也可包含多个子文件夹。每个文件夹都有一个唯一的名称,用于在文件系统中标识和访问。逻辑盘,计算机的外存储器一…

高等数学 2.5 函数的微分

目录一、微分的定义二、微分的几何意义三、微分运算1、函数和、差、积、商的微分法则2、复合函数的微分法则四、微分在近似计算中的应用 一、微分的定义定义 设函数 \(y = f(x)\) 在某区间内有定义,\(x_0\) 及 \(x_0 + \Delta x\) 在这区间内,如果函数的增量 \[\Delta y = f(…

信息学奥赛初赛天天练-91-CSP-S2023基础题3-编译命令、树的重心、拓扑排序、进制转换、R进制转十进制、十进制转R进制

PDF文档公众号回复关键字:202409172023 CSP-S 选择题 1单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 11 以下哪个命令,能将一个名为 main.cpp 的 C++ 源文件,编译并生成一个名为 main 的可执行文件?( ) A g++ -o main main.cpp B g++ -o main.…

匀变速直线运动的规律

匀变速直线运动的规律 一、定义:匀变速直线运动为沿一条直线且加速度恒定不变的运动,在 \((v-t)\) 图中,其表示为一条倾斜的直线。二、关于字母的解释:\(v_0\) 表示初始速度,\(v_t\) 表示末速度,\(t\) 表示时间,\(a\) 表示加速度,\(s\) 代表位移。 三、关于匀变速直线运…

Java 性能调优:优化 GC 线程设置

垃圾回收器使用一组称为 GC 线程的线程来执行回收工作。有时 JVM 可能会分配过多或过少的 GC 线程。本文将讨论 JVM 为什么会出现这种情况、其影响以及可能的解决方案。 1 咋查找应用程序的 GC 线程数量 进行线程转储分析来确定应用程序的 GC 线程数量:从生产服务器捕获thread…

微信授权登录接口开发

微信登陆过程 在项目开发中,难免会遇到微信授权登录这一操作,本讲来讲一下微信登陆是如何实现的? 关于校验登录,有诸多方法,记录方法如下:使用Spring MVC提供的拦截器 网关服务全局过滤器 使用AOP面向横切面实现对于使用Spring MVC提供的拦截器来实现,其大致的思路如下:注…

1 计算机系统

计算机系统抽象层次6 用户 可执行程序5 高级语言 C++ Java4 汇编语言 汇编代码3 系统软件 操作系统 /库代码2 机器 指令集架构(ISA)1 控制(控制怎么执行) 微代码 /硬连线0 数字逻辑(执行) 电路、门等Language Processor: 语言处理器 语言处理器的两个阶段:分析源程序 合成目…

人工智能生成合成内容标识办法(征求 意见稿)发布

当前国家发布的关于人工智能生成合成内容标识的法律法规有:《中华人民共和国网络安全法》、《互联网信息服务算法推荐管理规定》、《互联网信息服务深度合成管理规定》、《生成式人工智能服务管理暂定办法》等。 征求意见稿 2024年9月14日,国家网信办发布关于《人工智能生成合…

南沙信奥老师解题:1167:再求f(x,n)

​ 用递归函数求解。【输入】第一数是x的值,第二个数是n的值。【输出】函数值。【输入样例】 1 2 【输出样例】 0.40#include <iostream> #include <stdlib.h> using namespace std; double f(double x,double n) {if(n==1)return x/(1+x);elsereturn x/(n+f(x,n-…

概率分布深度解析:PMF、PDF和CDF的技术指南

本文将深入探讨概率分布,详细阐述概率质量函数(PMF)、概率密度函数(PDF)和累积分布函数(CDF)这些核心概念,并通过实际示例进行说明。 在深入探讨PMF、PDF和CDF之前,有必要先简要介绍两种常用的概率分布:正态分布和均匀分布。 正态分布: 也称为高斯分布或钟形曲线,正…