【图像处理】——双边滤波

article/2025/10/25 10:17:55

【fishing-pan:https://blog.csdn.net/u013921430 转载请注明出处】

双边滤波

   高斯滤波是最常用的图像去噪方法之一,它能很好地滤除掉图像中随机出现的高斯噪声,但是在之前的博客中提到过,高斯滤波是一种低通滤波(有兴趣的点击这里,查看之前的博客),它在滤除图像中噪声信号的同时,也会对图像中的边缘信息进行平滑,表现出来的结果就是图像变得模糊,如下图所示;
在这里插入图片描述
   高斯滤波之所以会导致图像变得模糊,是因为它在滤波过程中只关注了位置信息;例如,以 q q q 为中心的窗口中,某一点 p p p 在高斯滤波过程中的权重的计算方法如下式;
G ( p ) = 1 2 π σ 2 e − ∥ p − q ∥ 2 2 σ 2 G(p)=\frac{1}{2\pi \sigma ^{2}} e^{-\frac{\left \| p-q \right \|^{2}}{2\sigma ^{2}}} G(p)=2πσ21e2σ2pq2
  即在滤波窗口内,距离中心点越近的点的权重越大;这种只关注距离的思想在某些情况下是可行的,例如在平坦的区域,距离越近的区域其像素分布也越相近,自然地,这些点的像素值对滤波中心点的像素值更有参考价值。但是在像素值出现跃变的边缘区域,这种方法会适得其反,损失掉有用的边缘信息。此时就出现了一类算法——边缘保护滤波方法双边滤波就是最常用的边缘保护滤波方法(另一种常用来与双边滤波对比的边缘保护滤波方法——引导滤波)。

  双边滤波的思想很简单,在高斯滤波的基础上加入了像素值权重项,也就是说既要考虑距离因素,也要考虑像素值差异的影响,像素值越相近,权重越大。将像素值权重表示为 G r G_{r} Gr ,空间距离权重表示为 G s G_{s} Gs

G s = e x p ( − ∥ p − q ∥ 2 2 σ s 2 ) G_{s}=exp(-\frac{\left \| p-q \right \|^{2}}{2\sigma _{s}^{2}}) Gs=exp(2σs2pq2)
G r = e x p ( − ∥ I p − I q ∥ 2 2 σ r 2 ) G_{r}=exp(-\frac{\left \| I_{p}-I_{q} \right \|^{2}}{2\sigma _{r}^{2}}) Gr=exp(2σr2IpIq2)

  那么整个滤波器可以表示为 B F BF BF,那么滤波结果为;
B F = 1 W q ∑ p ∈ S G s ( p ) G r ( p ) ∗ I p = 1 W q ∑ p ∈ S e x p ( − ∥ p − q ∥ 2 2 σ s 2 ) e x p ( − ∥ I p − I q ∥ 2 2 σ r 2 ) ∗ I p \begin{aligned} BF&=\frac{1}{W_{q}}\sum_{p\in S}G_{s}(p)G_{r}(p)*I_{p}\\ &=\frac{1}{W_{q}}\sum_{p\in S}exp(-\frac{\left \| p-q \right \|^{2}}{2\sigma _{s}^{2}})exp(-\frac{\left \| I_{p}-I_{q} \right \|^{2}}{2\sigma _{r}^{2}})*I_{p} \end{aligned} BF=Wq1pSGs(p)Gr(p)Ip=Wq1pSexp(2σs2pq2)exp(2σr2IpIq2)Ip
  其中 W q {W_{q}} Wq 为滤波窗口内每个像素值的权重和,用于权重的归一化;
W q = ∑ p ∈ S G s ( p ) G r ( p ) = ∑ p ∈ S e x p ( − ∥ p − q ∥ 2 2 σ s 2 ) e x p ( − ∥ I p − I q ∥ 2 2 σ r 2 ) {W_{q}}=\sum_{p\in S}G_{s}(p)G_{r}(p)=\sum_{p\in S}exp(-\frac{\left \| p-q \right \|^{2}}{2\sigma _{s}^{2}})exp(-\frac{\left \| I_{p}-I_{q} \right \|^{2}}{2\sigma _{r}^{2}}) Wq=pSGs(p)Gr(p)=pSexp(2σs2pq2)exp(2σr2IpIq2)
  在平坦区域,滤波器中每个像素点的 G r G_{r} Gr 值相近,空间距离权重 G s G_{s} Gs主导滤波效果。在边缘区域,边缘同侧的 G r G_{r} Gr 值相近,且远大于边缘另一侧的 G r G_{r} Gr 值,此时另一侧的像素点的权重对滤波结果几乎不影响,边缘信息得到保护。表现出了一定的自适应性。

  在平坦区域出现噪声点时,噪声点周围的信号的权值都很小,在进行归一化后,这些权值得到了提升,因此对噪声点也有滤除效果。
双边滤波示意图

双边滤波OpenCV实现

  在OpenCV中已经有编辑好的双边滤波的函数;

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

  函数中的参数依次表示src:输入图像,dst: 输出图像,d:滤波窗口的直径(函数注释中使用的是Diameter,那么很可能函数中选取的窗口是圆形窗口),sigmaColor:像素值域方差,sigmaSpace:空间域方差,以及边缘处理方式。

  根据算法原理,我编写了自己的双边滤波函数;其中的核心部分如下;

//-------------------------------------------------------------
//作者:不用先生,2018.11.26
//自实现的图像双边滤波算法
//bilateral.cpp
//-------------------------------------------------------------
for (int i = 0; i < row; i++)    //对每一个点进行处理
{for (int j = 0; j < col; j++){double weightSum = 0;double filterValue = 0;for (int row_d = -(d / 2); row_d <= (d / 2); row_d++)   //以图像中的一点为中心,d为边长的方形区域内进行计算{for (int col_d = -(d / 2); col_d <= (d / 2); col_d++){double distance_Square = row_d*row_d + col_d*col_d;double value_Square = pow((scr.at<uchar>(i, j) - copyBorder_dst.at<uchar>(i + (d / 2) + row_d, j + (d / 2) + col_d)), 2);double weight = exp(-1 * (distance_Square / (2 * sigmaSpace*sigmaSpace) + value_Square / (2 * sigmaColor*sigmaColor)));weightSum += weight;               //求滤波窗口内的权重和,用于归一化;filterValue += (weight*copyBorder_dst.at<uchar>(i + (d / 2) + row_d, j + (d / 2) + col_d));}}dst.at<uchar>(i, j) = filterValue / weightSum;}
}

  从代码中可以看出,我选择的是一个方形区域而不是圆形区域进行滤波计算,大家如果觉得欠妥,在自己编写代码时可以修改成圆形区域,也很简单。完整代码,可以到这里下载,或者直接在评论区留下自己的邮箱,我看到留言后会尽快发的您的邮箱。

测试结果

  用自己编写的代码、OpenCV自带的双边滤波函数以及高斯滤波函数分别对一张彩色图像今进行处理,并对比了结果。
在这里插入图片描述
  这里出现了很奇怪的现象,所有输入参数相同时(我选取参数的是d=21;sigmaColor=10;sigmaSpace = 10;),我的函数计算的结果比OpenCV自带的 bilateralFilter 函数的处理结果更加平滑。当把 bilateralFilter 函数的sigmaColorsigmaSpace参数调整为两到三倍的时候, bilateralFilter 函数的结果与我的计算结果相近。这种差异性的结果不应该是窗口选取方式不同导致的。具体原因,我觉得可能与 bilateralFilter 函数中方差的应用有关。但是总的来说,两个函数都对图像有一定的平滑效果,并很好地保护了边缘信息。

  本博客中只讲述了双边滤波最基础的原理以及实现过程,这种计算方法比较耗时,后续的人们做了一系列的工作,用于提升双边滤波的计算效率。大家感兴趣的可以去了解一下。

参考

  1. Tomasi C, Manduchi R. Bilateral filtering for gray and color images[C]//Computer Vision, 1998. Sixth International Conference on. IEEE, 1998: 839-846.
  2. He K, Sun J, Tang X. Guided image filtering[J]. IEEE transactions on pattern analysis & machine intelligence, 2013 (6): 1397-1409.

  已完。。


http://chatgpt.dhexx.cn/article/VygcZRQW.shtml

相关文章

【八】双边滤波

1.高斯滤波 高斯滤波的定义如下&#xff1a; 其中高斯函数为&#xff1a; 高斯滤波是领域内相邻像素的加权平均&#xff0c;权重值为G(||p-q||)&#xff0c;和均值滤波&#xff0c;中值滤波一样&#xff0c;都是将噪声&#xff08;高频信息&#xff09;滤除&#xff0c;但是边…

双边滤波原理和实现

双边滤波原理 双边滤波&#xff08;Bilateral filter&#xff09;是一种非线性的滤波方法&#xff0c;是结合图像的空间邻近度和像素值相似度的一种折衷处理&#xff0c;同时考虑空域信息和灰度相似性&#xff0c;达到保边去噪的目的。 双边滤波器之所以能够做到在平滑去噪的同…

双边滤波

1 双边滤波简介 双边滤波&#xff08;Bilateral filter&#xff09;是一种非线性的滤波方法&#xff0c;是结合图像的空间邻近度和像素值相似度的一种折衷处理&#xff0c;同时考虑空域信息和灰度相似性&#xff0c;达到保边去噪的目的。具有简单、非迭代、局部的特点。 双边滤…

数字图像处理(九)双边滤波

文章目录 一、何为双边滤波&#xff1f;二、为什么要使用双边滤波&#xff1f;三、双边滤波原理1.空间域核2.值域核3.模板相乘 四、 w d w_d wd​和 w r w_r wr​和 σ \sigma σ的理解五、C代码实现1.opencv中Mat的一点小知识2.关于边界的处理3.双边滤波代码 一、何为双边滤波…

双边滤波(Bilateral Filtering)

双边滤波&#xff08;Bilateral Filtering&#xff09; 1、基本思路 双边滤波&#xff08;Bilateral Filtering&#xff09;的基本思路是同时考虑像素点的空域信息和值域信息。即先根据像素值对要用来进行滤波的邻域做一个分割或分类&#xff0c;再给该点所属的类别相对较高的…

三种经典图像滤波方法介绍——双边滤波(Bilateral filter)、导向滤波(Guided Fliter)、滚动导向滤波(RollingGuidedFilter)

文章目录 一、前言二、双边滤波(Bilateral filter)2.1 双边滤波的理论介绍及公式推导2.2 双边滤波的matlab程序实现 三、导向滤波(Guided Fliter)3.1 导向滤波的理论介绍及公式推导3.2 导向滤波matlab代码实现 四、滚动导向滤波(RollingGuidedFilter)4.1 滚动导向滤波的理论介绍…

图像处理:双边滤波算法

今天主要是回顾一下双边滤波&#xff0c;我曾经在这篇——图像处理&#xff1a;推导五种滤波算法中推导过它&#xff0c;其中包含了我自己写的草稿图。 目录 双边滤波算法原理 &#xff08;1&#xff09;空间域核 &#xff08;2&#xff09;值域核 理解双边滤波 空域权重​…

Bilateral Filters(双边滤波算法)的超简单原理,学不会你打我。

摘要&#xff1a; 双边滤波(Bilateral Filters)是非常常用的一种滤波&#xff0c;它可以达到保持边缘、降噪平滑的效果。和其他滤波原理一样&#xff0c;双边滤波也是采用加权平均的方法&#xff0c;用周边像素亮度值的加权平均代表某个像素的强度&#xff0c;所用的加权平均基…

jQuery源码分析理解

1&#xff1a; 首先我们先来看一下jquery代码的整体结构 代码从16行开始为真正的jquery源码&#xff0c;我们看到Jquery源码第一个()中是定义了一个匿名function( window, undefined ) {}&#xff1b;接着末尾有个(window)&#xff0c;就表示执行这个匿名function&#xff0c;…

jQuery源码分析(一)

jQuery源码分析&#xff08;一&#xff09; 我们知道在jQuery中在使用选择器或者给元素绑定事件的时候都是通过$来操作的。那么基于JavaScript面向对象的思想&#xff0c;我们可以把jQuery看做一个函数或者对象&#xff0c;它里边存储了大量的方法&#xff0c;是一个类库。 $代…

jQuery源码阅读(一)---jQuery源码整体架构

之前用jQuery库写了两个小例子&#xff08;结合Apache、PHP实现的简易聊天室以及音乐播放器&#xff09;&#xff0c;详见我的上两篇博客jQuery aJax技术以及PHP实现简单聊天室、 利用jQuery实现音乐播放器。为了更加深入了解jQuery库的架构以及巩固原生JS的基础和深度&#xf…

jquery源码解析

(function(a,b){})() JQuery源码的开头 (function(a,b){})(window)通常(function(){})()用来封装一些私有成员或者公共成员的导出。 1. 定义一个匿名函数&#xff0c;创建了一个“私有”的命名空间&#xff0c;该命名空间的变量和方法&#xff0c;不会破坏全局的命名空间。确…

jQuery源码下载和编译

下载 git clone https://github.com/jquery/jquery.git编译 下载完成后&#xff0c;进入jquery文件夹&#xff0c;运行如下命令&#xff1a; npm run build最后全部编译完成&#xff0c;生成的文件在目录dist文件夹下&#xff1a; 有兴趣的就可以开始研究源码了。

jQuery源码阅读

1. 立即执行函数 简化后的代码就是这样 (function(global, factory) {... })(window, function () {}); Q&#xff1a;采用立即执行函数的好处是什么呢&#xff1f; A: 通过定义一个匿名函数&#xff0c;创建了一个新的函数作用域&#xff0c;相当于创建了一个私有的命名空…

jQuery -- jQuery源码(一):核心功能

一、jQuery无new构建实例 1、$就是jQuery的别称 可以在$和jQuery对象挂在在window中&#xff0c;实现全局引用。 给Windows对象扩展一个$的属性&#xff0c;让它拿到jQuery构造函数的引用 可以用$访问到jQuery的构造函数 // jQuery.js (function(root) {var jQuery functio…

制作一个游戏编辑器玩玩(1)

今天准备着手例用空闲时间制作一个游戏编辑器&#xff0c;一是因为这些年来积累了不少的算法和制作经验&#xff0c;它们是分散的&#xff0c;零乱的&#xff0c;想搞一次规整。二是自己一起想做一个简单点的游戏编辑器&#xff0c;可以让自己的小朋友把自己的想法在上面实现&a…

游戏策划的软件与工具

游戏策划的软件与工具 UXplayer https://www.jianshu.com/p/ceddde705933 gongjutitle.png 本文修改自前公司的一份交接文档&#xff0c;分享了工作中一些常用的软件。 Axure 界面示意图/流程图制作软件 大前提&#xff1a;Windows系统、无法直连外网 Mac系统的话&#xff0c;…

Tiled游戏地图编辑器

下载 软件是免费的,直接官网下载就好了 下载链接:https://www.mapeditor.org/ 新建地图 左上角 >> 文件 >> 创建新地图 快捷键:ctrln 根据你的需求设置地图大小 导入素材新建图块集 左上角 >> 文件 >> 新图块 新建你的图集文件.png 如果你已…

Android游戏开发之地图编辑器的使用以及绘制地图 (四)

雨松MOMO带你走进游戏开发的世界之地图编辑器的使用以及绘制地图 雨松MOMO原创文章如转载&#xff0c;请注明&#xff1a;转载至我的独立域名博客雨松MOMO程序研究院&#xff0c;原文地址:http://www.xuanyusong.com/archives/211 Mappy中文地图编辑器的使用说明下载地址&#…

编辑器

问题描述 你现在要实现一个针对于数字序列的编辑器。 初始的时候&#xff0c;序列是空的。 在之后&#xff0c;有以下五种操作&#xff1a; I x 在光标之后插入x D 删除光标之前的数字 L 将光标向左移动&#xff0c;如果已经在最左&#xff0c;则不移动 R 将光标向右移动&#…