双边滤波原理

  双边滤波(Bilateral filter)是一种非线性的滤波方法,本质是基于高斯滤波,目的是解决高斯滤波造成的边缘模糊。结合图像的空间邻近度和像素值相似度的一种折处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。

  双边滤波器的好处是可以做边缘保存(edge preserving),一般用高斯滤波去降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。

  双边滤波器的输出像素依赖于当前被卷积像素的邻域。iii和jjj是当前被卷积像素的坐标点,kkk和lll是领域像素的坐标点。双边滤波公式如下所示:
g(i,j)=∑k,lf(k,l)w(i,j,k,l)∑k,lw(i,j,k.l)g(i,j) = \frac{\sum_{k,l}f(k,l)w(i,j,k,l)}{\sum_{k,l}w(i,j,k.l)} g(i,j)=∑k,l​w(i,j,k.l)∑k,l​f(k,l)w(i,j,k,l)​

  加权系数www由定义域核和值域核决定,是它们的乘积。定义域核是高斯核,如下公式所示:

d(i,j,k,l)=exp(−(i−k)2+(j−l)22σd2)d(i,j,k,l)=exp(-\frac{(i-k)^{2}+(j-l)^{2}}{2\sigma^{2}_{d}}) d(i,j,k,l)=exp(−2σd2​(i−k)2+(j−l)2​)

  而值域核就是用于“推断”是否是边缘点的方法,如下公式所示:
r(i,j,k,l)=exp(−∣∣f(i,j)−f(k,l)∣∣22σr2)r(i,j,k,l)=exp(-\frac{||f(i,j)-f(k,l)||^{2}}{2\sigma^{2}_{r}}) r(i,j,k,l)=exp(−2σr2​∣∣f(i,j)−f(k,l)∣∣2​)

  值域核的大小取决于被卷积像素的灰度值和邻域像素的灰度值的差。边缘有较大灰度变化时,则会生成较小的权值,与被卷积像素的灰度值类似的区域会生成较大的权值。

  相乘就得到加权系数www,如下公式所示:

w(i,j,k,l)=exp(−(i−k)2+(j−l)22σd2−∣∣f(i,j)−f(k,l)∣∣22σr2)w(i,j,k,l)=exp(-\frac{(i-k)^{2}+(j-l)^{2}}{2\sigma^{2}_{d}}-\frac{||f(i,j)-f(k,l)||^{2}}{2\sigma^{2}_{r}}) w(i,j,k,l)=exp(−2σd2​(i−k)2+(j−l)2​−2σr2​∣∣f(i,j)−f(k,l)∣∣2​)

  双边滤波的原理示意图如下图所示:

MatLab代码

clear all;close all;clc;
img=imread('boy_noisy.gif');
img=mat2gray(img);
[m n]=size(img);
r=15;        %模板半径
imgn=zeros(m+2*r+1,n+2*r+1);
imgn(r+1:m+r,r+1:n+r)=img;
imgn(1:r,r+1:n+r)=img(1:r,1:n);                 %扩展上边界
imgn(1:m+r,n+r+1:n+2*r+1)=imgn(1:m+r,n:n+r);    %扩展右边界
imgn(m+r+1:m+2*r+1,r+1:n+2*r+1)=imgn(m:m+r,r+1:n+2*r+1);    %扩展下边界
imgn(1:m+2*r+1,1:r)=imgn(1:m+2*r+1,r+1:2*r);       %扩展左边界
sigma_d=7; sigma_r=0.2;
[x,y] = meshgrid(-r:r,-r:r);
w1=exp(-(x.^2+y.^2)/(2*sigma_d^2));     %以距离作为自变量高斯滤波器
for i=r+1:m+r  for j=r+1:n+r          w2=exp(-(imgn(i-r:i+r,j-r:j+r)-imgn(i,j)).^2/(2*sigma_r^2)); %以周围和当前像素灰度差值作为自变量的高斯滤波器  w=w1.*w2;  s=imgn(i-r:i+r,j-r:j+r).*w;  imgn(i,j)=sum(sum(s))/sum(sum(w));  end
end
subplot(1,2,1);imshow(img);title('Origin image');  %显示原始图像
subplot(1,2,2);imshow(mat2gray(imgn(r+1:m+r,r+1:n+r)));title('Bilateral_filter');%显示滤波后的图像

实验结果

  完整实验代码,公众号后台回复:数字图像作业一。

我的微信公众号名称:深度学习与先进智能决策
微信公众号ID:MultiAgent1024
公众号介绍:主要研究分享深度学习、机器博弈、强化学习等相关内容!期待您的关注,欢迎一起学习交流进步!

双边滤波方法原理与代码实践(附完整代码)相关推荐

  1. OpenCV使用Shi-Tomasi方法检测拐角的实例(附完整代码)

    OpenCV使用Shi-Tomasi方法检测拐角的实例 OpenCV使用Shi-Tomasi方法检测拐角的实例 OpenCV使用Shi-Tomasi方法检测拐角的实例 #include "o ...

  2. 深度:震惊世间的惊人代码(附完整代码)

    一战封神的 0x5f375a86 雷神之锤3是一款九十年代非常经典的游戏,内容画面都相当不错,作者是大名鼎鼎的约翰卡马克.由于当时游戏背景原因,如果想要高效运行游戏优化必须做的非常好,否则普通人的配置 ...

  3. html加js倒计时代码,分享最简单的JavaScript倒计时代码(附完整代码)

    工作中经常需要在页面中设置倒计时,那你知道JS倒计时代码怎么写吗?这篇文章就给大家分享一个最简单的JS倒计时代码,以及详细的倒计时JS代码的思路,,有一定的参考价值,感兴趣的朋友可以看看. 举例:设定 ...

  4. 【element-ui】 el-table 表格动态合并相同数据单元格最全教程,可指定列+自定义合并条件,附完整代码

    el-table合并单元格 1.固定合并 官方挺提供的合并具体某行列的方法:el-table合并行或列 通过给table传入span-method方法可以实现合并行或列,方法的参数是一个对象,里面包含 ...

  5. 数学分析模型(一):数据的无量纲处理方法及示例(附完整代码)

    数据的无量纲处理方法及示例(附完整代码) (1)极值化方法 (2)标准化方法 (3)均值化方法 示例 要求 建模步骤 程序 结果 备注 在对实际问题建模过程中,特别是在建立指标评价体系时,常常会面临不 ...

  6. 计算机辅助药物设计的一般原理,朱瑞新着--_计算机辅助药物设计(Ⅰ)--基本方法原理概要与实践详解.pdf...

    文档介绍: 计算机辅助药物设计 ------ 基本方法原理概要与实践详解作者朱瑞新 2011 年 1 月目录序前言第一章"计算机辅助药物设计"与 M OE 概貌一.导言二.&quo ...

  7. Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一)

    Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一) 本文目录: 一.[旋转的精灵女孩]案例运行效果 二.Three.js简介 三.Three.js代码正常运行显示条件 (1)不载入 ...

  8. Python数据可视化:2018年北上广深空气质量分析(附完整代码)

    ♚ 法纳斯特,Python爱好者,喜欢爬虫,数据分析以及可视化. 就在这周偶然看到一个学弟吐槽天津的空气,不禁想起那段厚德载雾,自强不吸的日子. 无图无真相,下图为证. 左边的图是去年2月份的时候,这 ...

  9. python代码手机壁纸_Python制作微信好友背景墙教程(附完整代码)

    引言 前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出自己的所有微信好友的头像. 效果如下图,出于隐私考虑,这里作了模糊处理. 是不是很炫,而且这还是独一无二的,毕竟 ...

  10. 怎么在html中加入特效文字,如何使用HTML5+css3实现粒子效果文字动画特效(附完整代码)...

    我们在浏览web网页的时候会发现现在的网页做的越来越美观,很多动画特效做的越来越炫酷,这离不开HTML5和css3的深入开发.今天我们要来分享一款基于HTML5和css3的文字特效--粒子效果文字动画 ...

最新文章

  1. Android 4.4(KitKat)表格管理子系统 - 骨架
  2. 利用spi发送接收信息c语言,SPI接收发送函数程序
  3. 我的计算机专业作文800字,我家的电脑作文800字
  4. gentry同态加密算法_基于Gentry全同态加密算法公钥个数优化的研究
  5. DocumentHelper用法
  6. Java 集合深入理解(15):AbstractMap
  7. 顺序队列为空的条件_C语言实现顺序队列
  8. java调用用友eai_U811.1接口EAI系列之二--生成销售出库单调用U8的EAI通用处理方法--PowerBuilder语言...
  9. php树递归算法,PHP二叉树递归算法
  10. php记录sql语句,sql语句记录
  11. 访问阿里云服务器配置的ftp后,报错227 entering passive mode
  12. mac 安装commitizen插件报错Parsing JSON at /Users/lin/.czrc for commitizen config failed
  13. 差分数组:PIPI的区间操作Ⅰ
  14. QT中自定义控件和插件大致方法
  15. 分享一个开源免费、目前最好的API接口管理平台----eoLinker
  16. 程序员最爱用的8个代码编辑器,你用哪款?
  17. 前端编程中,如何消除浏览器缓存
  18. 浙江大学PAT考试基础知识整理
  19. Python 当当网数据分析
  20. c语言调用dll实例 结构体传参,Matlab调用Dll,对于自定义结构体数组如何传参? - 程序语言 - 小木虫 - 学术 科研 互动社区...

热门文章

  1. 微软收购PhoneFactor以提高多因素身份认证应用程序的安全性
  2. Longhorn的糟糕体验!
  3. java常问算法题_Java面试中经常问到的算法题
  4. Security+ 学习笔记28 云计算
  5. Leetcode 刷题笔记(十八) —— 二叉树篇之二叉搜索树的修改与构造
  6. VMvare桥接网络连接不上解决办法
  7. Go语言 关于go error处理风格的一些讨论和个人观点(上)
  8. CentOS 6.7安装Spark 1.5.2
  9. 多线程往文件里写数据
  10. 上海.NET俱乐部聚会筹备进展