双边滤波

双边滤波

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

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

Gs=exp(−∥p−q∥22σ2s)Gs=exp(−∥p−q∥22σs2) G_{s}=exp(-\frac{\left \| p-q \right \|^{2}}{2\sigma _{s}^{2}}) Gs​=exp(−2σs2​∥p−q∥2​)
Gr=exp(−∥Ip−Iq∥22σ2r)Gr=exp(−∥Ip−Iq∥22σr2) G_{r}=exp(-\frac{\left \| I_{p}-I_{q} \right \|^{2}}{2\sigma _{r}^{2}}) Gr​=exp(−2σr2​∥Ip​−Iq​∥2​)

  那么整个滤波器可以表示为BFBF BF BF,那么滤波结果为;
BF=1Wq∑p∈SGs(p)Gr(p)∗Ip=1Wq∑p∈Sexp(−∥p−q∥22σ2s)exp(−∥Ip−Iq∥22σ2r)∗IpBF=1Wq∑p∈SGs(p)Gr(p)∗Ip=1Wq∑p∈Sexp(−∥p−q∥22σs2)exp(−∥Ip−Iq∥22σr2)∗Ip \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​=Wq​1​p∈S∑​Gs​(p)Gr​(p)∗Ip​=Wq​1​p∈S∑​exp(−2σs2​∥p−q∥2​)exp(−2σr2​∥Ip​−Iq​∥2​)∗Ip​​
  其中WqWq {W_{q}} Wq​ 为滤波窗口内每个像素值的权重和,用于权重的归一化;
Wq=∑p∈SGs(p)Gr(p)=∑p∈Sexp(−∥p−q∥22σ2s)exp(−∥Ip−Iq∥22σ2r)Wq=∑p∈SGs(p)Gr(p)=∑p∈Sexp(−∥p−q∥22σs2)exp(−∥Ip−Iq∥22σr2) {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​=p∈S∑​Gs​(p)Gr​(p)=p∈S∑​exp(−2σs2​∥p−q∥2​)exp(−2σr2​∥Ip​−Iq​∥2​)
  在平坦区域,滤波器中每个像素点的GrGr G_{r} Gr​ 值相近,空间距离权重GsGs G_{s} Gs​主导滤波效果。在边缘区域,边缘同侧的GrGr G_{r} Gr​ 值相近,且远大于边缘另一侧的GrGr G_{r} Gr​ 值,此时另一侧的像素点的权重对滤波结果几乎不影响,边缘信息得到保护。表现出了一定的自适应性。

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

双边滤波OpenCV实现

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

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

  函数中的参数依次表示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;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

测试结果

  用自己编写的代码、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://www.mzph.cn/news/461922.shtml

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

相关文章

用SQL语句更改数据库名,表名,列名

参考SQL Server联机丛书的 sp_renamedb与sp_rename一、更改数据库名sp_renamedb更改数据库的名称。语法sp_renamedb [ dbname ] old_name ,[ newname ] new_name 参数[ dbname ] old_name 是数据库的当前名称。old_name 为 sysname 类型&#xff0c;无默认值…

Gabor滤波器原理

一、什么是Gabor函数&#xff08;以下内容含部分翻译自维基百科&#xff09; 在图像处理中&#xff0c;Gabor函数是一个用于边缘提取的线性滤波器。Gabor滤波器的频率和方向表达同人类视觉系统类似。研究发现&#xff0c;Gabor滤波器十分适合纹理表达和分离。在空间域中&#x…

Linux中的MAN命令

学习Linux的同学&#xff0c;都会使用man来查阅一些命令的帮助信息&#xff0c;常见的使用方法就是“man 命令名称”这样简单的格式。本文就对man命令简要介绍一下。 l man命令的章节 man就是manual的缩写&#xff0c;用来查看系统中自带的各种参考手册&#xff0c;但是手册页分…

全局曝光和卷帘曝光的区别

全局曝光和卷帘曝光是常见的相机曝光方式。一般来说&#xff0c;CCD相机是全局曝光&#xff0c;而CMOS相机则存在卷帘曝光。那么&#xff0c;这两种方式孰优孰劣呢&#xff1f;或者说&#xff0c;他们两者的差别在哪里呢&#xff1f;那么&#xff0c;先从两者的定义说起。 全局…

Titanium 列表显示TableView

效果&#xff1a; Titanium中列表显示需要创建TableView var tableView Ti.UI.createTableView({style: Ti.UI.iPhone.TableViewCellSelectionStyle.NONE //TableView样式}); TableView的每一个行叫做TableViewRow 设置TableViewRow的hasChild为true便可显示这样的效果&#x…

discuz x2.5插件开发傻瓜图文教程,用demo说话

2019独角兽企业重金招聘Python工程师标准>>> 刚刚接触DZ的插件开发&#xff0c;记个傻瓜图文教程&#xff0c;一是分享给初学者&#xff0c;二是方便自己以后回忆。 本篇文章适合人群&#xff1a;有一定的PHP开发经验&#xff0c;想通过一个简单明了的demo快速了解…

uva 11174(排列组合+搜索)

依然是liurujia计数练习题。依然是自己想没想出来&#xff0c;在MOD是素数的情况下除以x即为乘x的逆。这个真心以前没听过&#xff0c;用了这个方法后处理就变得十分巧妙。 整个程序步骤还是很清晰的&#xff0c;先上来算阶乘与逆&#xff08;求数的逆还是有点没理解透&#xf…

S5PV210的地址映射简介

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 S5PV210属于ARM Cortex-A8架构&#xff0c;是32位的CPU&#xff0c;有32根地址线和32根数据线。 这表明该CPU的寻址空间为4G&#xff0c;地址映射关系见下述。 S5PV210的地址映射 S5PV210的地址映射…

树莓派(Raspberry Pi):完美的家用服务器

出处&#xff1a;http://linux.cn/thread/11884/1/1/ 树莓派&#xff08;Raspberry Pi&#xff09;&#xff1a;完美的家用服务器 自从树莓派发布后&#xff0c;所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒&#xff0c;但…

[NOI2019]回家路线

LOJ3156 题面就不放了 , 放一下数据范围 . 看到 \(n<2000,m<4000\) 就想到直接 \(dfs\) 到底 , 居然就过了前 \(4\)个 样例 , 最后一个要 \(2s\) . 后来写了 \(AB0\) 的 \(5\) 分 , 我知道写的是错的 , 还是交了以下这份代码 . ( LOJ 数据应该是官方数据 ) 得分 \(70\) .…

重定位——重定位的简介与操作(涉及位置无关码)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客&#xff1a;位置无关码、位置有关码 - biaohc - 博客园 一、链接地址与运行地址 1、链接地址 链接地址&#xff0c;是指程序员通过Makefile中“ -Ttext xxx ”或者在链接脚本中指定的地址…

OpenCV学习(27) 直方图(4)

我们可以利用OpenCV的直方图&#xff0c;backproject直方图和meanshift算法来跟踪物体。下面通过简单的例子来说明如何实现跟踪算法&#xff0c;我们有两幅狒狒的图片&#xff0c;如下图所示&#xff1a;我们首先在左图中框选狒狒的脸&#xff0c;计算出框选区域的色度(HSV空间…

MySQL源码编译与初始化

MySQL源码编译与初始化 链接&#xff1a;https://pan.baidu.com/s/1ANGg3Kd_28BzQrA5ya17fQ 提取码&#xff1a;ekpy 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 1.MySQL简介 1.1数据库有很多种类&#xff1a; 关系型数据库--->MySQL Oracle非关系型数据库…

uboot中的虚拟地址映射

1、DRAM有效范围 &#xff08;1&#xff09;DMC0上允许的地址范围是20000000-3FFFFFFF&#xff08;一共是512MB&#xff09;&#xff0c;而X210开发板实际只接了256MB物理内存&#xff0c;SoC允许我们给这256MB挑选地址范围。在裸机中DMC0的地址范围是0x20000000-0x2FFFFFFF&am…

.net remoting 技术

Remoting编辑目 录 1简介 2主要元素 3两种通道 4激活方式 5对象定义 6服务器 7客户 8基础补充 9小结 1简介 什么是Remoting&#xff0c;简而言之&#xff0c;我们可以将其看作是一种分布式处理方式 。从微软的产品角度来看&#xff0c;可以说Remoting就是DCOM的一种升级&#x…

浪客剑心:位图法Bitmap算法分析

看了博客园里一篇文章《一道腾讯前端试题&#xff0c;谁来试试身手》&#xff0c;正好以前了解过位图法&#xff0c;确实不错。位图法适用于大规模数据&#xff0c;但数据状态又不是很多的情况。通常是用来判断某个数据存不存在&#xff0c;如可标记1为存在&#xff0c;0为不存…

GoogLeNet结构

Inception V1 GoogLeNet结构&#xff08;Inception V1&#xff09; 输入为224x224的RGB图像&#xff0c;‘#3x3 reduce’和‘#5x5 reduce’表示3x3和5x5卷积之前1x1的卷积核的个数。 转载于:https://www.cnblogs.com/Peyton-Li/p/11201038.html

uboot的移植——移植三星官方的uboot到x210开发板

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、移植总结 二、移植过程 1、获取三星官方版本的uboot &#xff08;1&#xff09;由于X210开发板使用S5PV210这款CPU&#xff0c;因此我们应该寻找一块使用相同CPU的开发板&#xff0c;然后以这块…

Hadoop 文件命令

为什么80%的码农都做不了架构师&#xff1f;>>> * 文件操作 * 查看目录文件 * $ hadoop dfs -ls /user/cl * * 创建文件目录 * $ hadoop dfs -mkdir /user/cl/temp * * 删除文件 * $ hadoop dfs -rm /user/cl/temp/a.txt * * 删除目录与目录下所有文件 …