【数字图像处理】Bilateral Filters
【数字图像处理】Bilateral Filters
简单介绍
双边滤波是一种非线性的可以模糊图像并且能保留一定的边缘信息的技术。
它能够将图像分解成不同的尺度,而不会在修改后产生光晕(haloes),这使得它在计算摄影应用中无处不在(ubiquitous),例如调色,风格转换,重调光照,去噪(tone mapping, style transfer, relighting, and denoising)。
双边滤波的成功主要有以下一些:
- 它的公式很简单:每个像素被它的邻居的加权平均值代替。这方面很重要,因为很容易获得关于其行为的直观理解,从而适应特定于应用程序的需求并实现它。
- 它只依赖于两个参数,这两个参数表示要保留的特征的大小和对比度。
- 它可以以非迭代的方式使用。这使得参数很容易设置,因为它们的影响不是通过多次迭代累积的。
- 由于高效的数值策略,以及,甚至在图形硬件可用的情况下,它可以以交互速度在大的图像上进行计算。
具体表达
双边滤波和一般的高斯滤波(卷积)有着密切的关联。
Gaussian Convolution

- \(I_p\)表示图像在像素位置p上的值,对于灰度图,则表示单个数值
- \(F[I]\)表示图像\(I\)经过滤波器\(F\)处理后的输出
- \(S\)表示所有可能的图像位置集合,将其命名为spatial domain
- \(R\)表示所有可能的像素值集合,将其命名为range domain
- \(\sum_{p \in S}\)表示对于所有的使用p索引的图像像素进行加和
- \(| \cdot |\)表示绝对值
- \(|| \cdot ||\)表示L2范数,这里使用\(||p-q||\)表示对应于位置p和q的两个像素之间的欧氏距离
- \(\sigma\)表示邻域范围

Bilateral Filtering
双边滤波以一种类似于高斯卷积的方法定义为邻近像素的加权平均。不同的是,双边滤波考虑了邻居的值的差异,在平滑的时候可以保留边缘信息。
双边滤波的关键想法在于,对于一个影响其他像素的像素,它应该不只出现在相近的位置,也应该有着相似的值。
双边滤波的一个重要特征是权值相乘:如果任一权值接近于零,则不发生平滑作用。以大的空间高斯分布与小的范围高斯分布相结合的算法为例,尽管空间范围很大,但只能实现有限的平滑效果。范围权重会强制保留轮廓。

- \(\sigma_s\)和\(\sigma_r\)表示对于图像\(I\)的滤波的量(也就是滤波器范围)
- \(G_{\sigma_s}\)表示空间高斯加权,以降低远处像素的影响
- \(G_{\sigma_r}\)表示范围高斯加权,以降低像素q在亮度值与像素p差异较大的时候,造成的影响

相关链接
- Bilateral Filtering: Theory and Applications:http://people.csail.mit.edu/sparis/publi/2009/fntcgv/Paris_09_Bilateral_filtering.pdf
- A Gentle Introduction to Bilateral Filtering and its Applications:http://people.csail.mit.edu/sparis/bf_course/
【数字图像处理】Bilateral Filters的更多相关文章
- python数字图像处理(1):环境安装与配置
一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...
- 初始----python数字图像处理--:环境安装与配置
一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...
- 基于小波变换的数字图像处理(MATLAB源代码)
基于小波变换的数字图像处理(MATLAB源代码) clear all; close all; clc;M=256;%原图像长度N=64; %水印长度[filename1,pathname]=uiget ...
- 数字图像处理作业使用OpenCV - 使用笔记
数字图像处理作业的输入图像全部都是灰度图像,所以汇总一下自己遇到的问题答案. OCV的图像容器是Mat<typename>,可以用imread(filename)读取图像,filename ...
- python数字图像处理(17):边缘与轮廓
在前面的python数字图像处理(10):图像简单滤波 中,我们已经讲解了很多算子用来检测边缘,其中用得最多的canny算子边缘检测. 本篇我们讲解一些其它方法来检测轮廓. 1.查找轮廓(find_c ...
- 数字图像处理之sobel边缘检测
在前两部文章介绍了几种边缘检测算法,和位图的内存结构.如果对前两篇文章已经理解透彻 了,那么本文将带你进入数字图像处理的世界. 本文通过C代码实现基本的sobel边缘检测,包括8个方向和垂直方向: 代 ...
- 《数字图像处理原理与实践(MATLAB版)》一书之代码Part6
本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part6,辑录该书第281至第374页之代码,供有须要读者下载研究使用.代码运行结果请參见原书配图,建议下载代码前阅读下 ...
- 《数字图像处理原理与实践(MATLAB版)》一书之代码Part2
本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part2(P43~80),代码运行结果请參见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MA ...
- 《数字图像处理原理与实践(MATLAB文本)》书代码Part7
这篇文章是<数字图像处理原理与实践(MATLAB文本)>一本书的代码系列Part7(由于调整先前宣布订单,请读者注意分页程序,而不仅仅是基于标题数的一系列文章),第一本书特色186经225 ...
随机推荐
- 【VUE】Vue 源码解析
Vue 源码解析 Vue 的工作机制 在 new vue() 之后,Vue 会调用进行初始化,会初始化生命周期.事件.props.methods.data.computed和watch等.其中最重要的 ...
- POJ1059Glass Beads
Once upon a time there was a famous actress. As you may expect, she played mostly Antique Comedies m ...
- K8S网络模型
一.网络模型概述 k8s的网络中主要存在四种类型的通信:同一pod内的容器间通信.各pod彼此之间的通信.pod与service间的通信.以及集群外部的流量同service之间的通信. k8s为pod ...
- Phaserjs怎样用ES6开发游戏
想用ES6语法开发phaserjs游戏,是phaserCE,但是不知道怎么导入,总是报错,后来经过多次尝试,解决方法如下: 干脆不导入,直接暴露到window里,然后模块化的代码全部在window.o ...
- re.compile 函数
re.compile 函数 compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用. 语法格式为: re.com ...
- ztree复选框
var setting = { check: { enable: true // chkboxType : { "Y" : "", "N" ...
- 关于int,bool,str
今日主要内容 基本数据类型(int,bool,str) 1.基本数据数据类型: int 整数 str 字符串. 一般不存放大量的数据 bool 布尔值. 用来判断. True, False list ...
- Struts初学
自我概述 今天看了Struts,感觉这是个非常好用的东西!虽然它已经过时了,被springMVC取代了,但是仍然有了解的价值. 可是在学习过程中遇到了很多问题,比如其中一些原理很是抽象,有一些问题莫名 ...
- LeetCode 74. 搜索二维矩阵(Search a 2D Matrix)
题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: ma ...
- LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)
题目描述 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...