双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。之所以能够达到保边去噪的滤波效果是因为滤波器由两个函数构成:一个函数是由几何空间距离决定滤波器系数,另一个是由像素差值决定滤波器系数。
双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,其公式如下:

权重系数w(i,j,k,l)取决于定义域核

和值域核

的乘积,也就是

通俗来讲就是双边滤波模板主要有两个模板生成,第一个是高斯模板,第二个是以灰度级的差值作为函数系数生成的模板,然后这两个模板点乘就得到了最终的双边滤波模板,第一个模板是全局模板,所以只需要生成以西,第二个模板需要对每个像素都计算一次。双边滤波器比高斯滤波器多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素,这样就能对边缘附近的像素值予以保存,但是由于保存过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤除。

opencv中提供了bilateralFilter()函数来实现双边滤波操作,其原型如下:

void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )
参数解释:
. InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
. OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
. int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
. double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
. double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
. int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.

双边滤波器可以很好的保存图像边缘细节而滤除掉低频分量的噪音,但是双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长。
对于简单的滤波而言,可以将两个sigma值设置成相同的值,如果值<10,则对滤波器影响很小,如果值>150则会对滤波器产生较大的影响,会使图片看起来像卡通。

示例代码:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>using namespace std;
using namespace cv;//定义全局变量
const int g_ndMaxValue = 100;
const int g_nsigmaColorMaxValue = 200;
const int g_nsigmaSpaceMaxValue = 200;
int g_ndValue;
int g_nsigmaColorValue;
int g_nsigmaSpaceValue;Mat g_srcImage;
Mat g_dstImage;//定义回调函数
void on_bilateralFilterTrackbar(int, void*);int main()
{g_srcImage = imread("lena.jpg");//判断图像是否加载成功if(g_srcImage.empty()){cout << "图像加载失败!" << endl;return -1;}elsecout << "图像加载成功!" << endl << endl;namedWindow("原图像", WINDOW_AUTOSIZE);imshow("原图像", g_srcImage);//定义输出图像窗口属性和轨迹条属性namedWindow("双边滤波图像", WINDOW_AUTOSIZE);g_ndValue = 10;g_nsigmaColorValue = 10;g_nsigmaSpaceValue = 10;char dName[20];sprintf(dName, "邻域直径 %d", g_ndMaxValue);char sigmaColorName[20];sprintf(sigmaColorName, "sigmaColor %d", g_nsigmaColorMaxValue);char sigmaSpaceName[20];sprintf(sigmaSpaceName, "sigmaSpace %d", g_nsigmaSpaceMaxValue);//创建轨迹条createTrackbar(dName, "双边滤波图像", &g_ndValue, g_ndMaxValue, on_bilateralFilterTrackbar);on_bilateralFilterTrackbar(g_ndValue, 0);createTrackbar(sigmaColorName, "双边滤波图像", &g_nsigmaColorValue,g_nsigmaColorMaxValue, on_bilateralFilterTrackbar);on_bilateralFilterTrackbar(g_nsigmaColorValue, 0);createTrackbar(sigmaSpaceName, "双边滤波图像", &g_nsigmaSpaceValue,g_nsigmaSpaceMaxValue, on_bilateralFilterTrackbar);on_bilateralFilterTrackbar(g_nsigmaSpaceValue, 0);waitKey(0);return 0;
}void on_bilateralFilterTrackbar(int, void*)
{bilateralFilter(g_srcImage, g_dstImage, g_ndValue, g_nsigmaColorValue, g_nsigmaSpaceValue);imshow("双边滤波图像", g_dstImage);
}

程序运行结果如下:

参考:

https://blog.csdn.net/piaoxuezhong/article/details/78302920
https://blog.csdn.net/keith_bb/article/details/54427779

opencv 双边滤波算法(Bilateral Filters)原理及实现相关推荐

  1. Bilateral Filters(双边滤波算法)原理及实现(一)

    双边滤波算法原理 双边滤波是一种非线性滤波器,它可以达到保持边缘.降噪平滑的效果.和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高 ...

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

    摘要: 双边滤波(Bilateral Filters)是非常常用的一种滤波,它可以达到保持边缘.降噪平滑的效果.和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像 ...

  3. c语言双边滤波算法,浅析bilateral filter双边滤波器的理解

    图像去噪的方法很多,如中值滤波,高斯滤波,维纳滤波等等.但这些降噪方法容易模糊图片的边缘细节,对于高频细节的保护效果并不明显.相比较而言,bilateral filter双边滤波器可以很好的边缘保护, ...

  4. 图像处理:双边滤波算法

    今天主要是回顾一下双边滤波,我曾经在这篇--图像处理:推导五种滤波算法中推导过它,其中包含了我自己写的草稿图. 目录 双边滤波算法原理 (1)空间域核 (2)值域核 理解双边滤波 空域权重​编辑和值域 ...

  5. java 滤波算法_双边滤波算法

    1.原理 高斯滤波是以距离为权重,设计滤波模板作为滤波系数,只考虑了像素间的空间位置上的关系,因此滤波的结果会丢失边缘的信息. 高斯滤波的缺陷如下图所示:平坦区域正常滤波,图像细节没有变化,而在突变的 ...

  6. 双边滤波(Bilateral filter)

    双边滤波器(Bilateral filter)是一种可以保边去噪的滤波器.可以滤除图像数据中的噪声,且还会保留住图像的边缘.纹理等(因噪声是高频信号,边缘.纹理也是高频信息,高斯滤波会在滤除噪声的同时 ...

  7. 双边滤波(Bilateral Filter)详解

    双边滤波(Bilateral Filter)详解 转自:睁开眼就变帅 原理分析: 双边滤波与高斯滤波器相比,对于图像的边缘信息能过更好的保存.其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高 ...

  8. c语言双边滤波算法,快速双边滤波 附完整C代码

    很早之前写过<双边滤波算法的简易实现bilateralFilter>. 当时学习参考的代码来自cuda的样例. 相关代码可以参阅: https://github.com/johng12/c ...

  9. 双边滤波算法的原理、流程、实现及效果

    一.引言     双边滤波在图像处理领域中有着广泛的应用,比如去噪.去马赛克.光流估计等等,最近,比较流行的Non-Local算法也可以看成是双边滤波的一种扩展.自从Tomasi et al等人提出该 ...

最新文章

  1. python udp_如何用python方法检测UDP端口
  2. WGAN新方案:通过梯度归一化来实现L约束
  3. 标准库time,datetime,calendar,random的使用
  4. 【转】Android 4.4前后版本读取图库图片和拍照完美解决方案
  5. eclipse打包jar发布到linux下运行出错(java.lang.ClassNotFoundException: cmd.WordCount$MyMapper )
  6. 一个比较笨的全文搜索的例子(分析结构用)-模糊查找
  7. java发送会议邀请邮件模板_Spring 发送邮件 HTML邮件
  8. java求职面试_Java面试求职
  9. pycharm2019新建python文件_PyCharm 2019安装教程
  10. paip.C#.net TIMER不起作用在用户控件中
  11. 《蜗居》:海外解读中国新样本
  12. html邮件 自定义变量,CSS3中的自定义变量样式用法
  13. 用java制作扑克牌_java实现简易扑克牌游戏
  14. Java 比较图片_Java图片比对
  15. android zip格式的ndk,Android 使用NDK (JNI)容易解压7z压缩文件
  16. JAVA广度优先搜索---寻找从A点到B点最短路径
  17. 北航计算机控制系统实验报告,北航计算机控制系统实验报告详细分解.doc
  18. Dcloud课程2 什么是Dcloud
  19. Gopher China 2019 讲师专访 -探探平台技术部软件工程师于乐
  20. SpringBoot 接口层统一加密解密

热门文章

  1. 奇迹mu如何把别人的装备加到自己的游戏里面
  2. vue动态生成多个Echarts图表
  3. 用 telnet 访问网站发送 HTTP 请求
  4. 2、Canvas 的应用场景
  5. PCIe锁定事务(Locked Transactions)介绍
  6. jiamimao – 文件加密最简法门
  7. 17.4%华为用户换机选择锤子手机 罗永浩尴尬:锤粉只粉不买
  8. 东信正式挂牌成立视频研究院;浪潮集团参与“东数西算”战略工程 | 全球TMT...
  9. TIPTOP编译per档同时在4fd目录产生4fd档
  10. kali新的发行版对rtl8192eu的网卡支持有报错