双边滤波器的原理及实现

CSDN如何转载别人文章啊?!!!

悲剧只能复制黏贴了

这个老兄的地址是:http://blog.csdn.net/abcjennifer/article/details/7616663

双边滤波器是什么?

双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。可以与其相比较的两个filter:高斯低通滤波器(http://en.wikipedia.org/wiki/Gaussian_filter)和α-截尾均值滤波器(去掉百分率为α的最小值和最大之后剩下像素的均值作为滤波器),后文中将结合公式做详细介绍。

双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,

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

和值域核

的乘积

同时考虑了空间域与值域的差别,而Gaussian Filter和α均值滤波分别只考虑了空间域和值域差别。

=======================================================================

双边滤波器的实现(MATLAB):function B = bfilter2(A,w,sigma)

CopyRight:

% Douglas R. Lanman, Brown University, September 2006.
% dlanman@brown.edu, http://mesh.brown.edu/dlanman

具体请见function B = bfltGray(A,w,sigma_d,sigma_r)函数说明。

[cpp] view
plain
copy

  1. %简单地说:  
  2. %A为给定图像,归一化到[0,1]的矩阵  
  3. %W为双边滤波器(核)的边长/2  
  4. %定义域方差σd记为SIGMA(1),值域方差σr记为SIGMA(2)  
  5.   
  6. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  7. % Pre-process input and select appropriate filter.  
  8. function B = bfilter2(A,w,sigma)  
  9.   
  10. % Verify that the input image exists and is valid.  
  11. if ~exist('A','var') || isempty(A)  
  12.    error('Input image A is undefined or invalid.');  
  13. end  
  14. if ~isfloat(A) || ~sum([1,3] == size(A,3)) || ...  
  15.       min(A(:)) < 0 || max(A(:)) > 1  
  16.    error(['Input image A must be a double precision ',...  
  17.           'matrix of size NxMx1 or NxMx3 on the closed ',...  
  18.           'interval [0,1].']);        
  19. end  
  20.   
  21. % Verify bilateral filter window size.  
  22. if ~exist('w','var') || isempty(w) || ...  
  23.       numel(w) ~= 1 || w < 1  
  24.    w = 5;  
  25. end  
  26. w = ceil(w);  
  27.   
  28. % Verify bilateral filter standard deviations.  
  29. if ~exist('sigma','var') || isempty(sigma) || ...  
  30.       numel(sigma) ~= 2 || sigma(1) <= 0 || sigma(2) <= 0  
  31.    sigma = [3 0.1];  
  32. end  
  33.   
  34. % Apply either grayscale or color bilateral filtering.  
  35. if size(A,3) == 1  
  36.    B = bfltGray(A,w,sigma(1),sigma(2));  
  37. else  
  38.    B = bfltColor(A,w,sigma(1),sigma(2));  
  39. end  
  40.   
  41.   
  42. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  43. % Implements bilateral filtering for grayscale images.  
  44. function B = bfltGray(A,w,sigma_d,sigma_r)  
  45.   
  46. % Pre-compute Gaussian distance weights.  
  47. [X,Y] = meshgrid(-w:w,-w:w);  
  48. %创建核距离矩阵,e.g.  
  49. %  [x,y]=meshgrid(-1:1,-1:1)  
  50. %   
  51. % x =  
  52. %   
  53. %     -1     0     1  
  54. %     -1     0     1  
  55. %     -1     0     1  
  56. %   
  57. %   
  58. % y =  
  59. %   
  60. %     -1    -1    -1  
  61. %      0     0     0  
  62. %      1     1     1  
  63. %计算定义域核  
  64. G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));  
  65.   
  66. % Create waitbar.  
  67. h = waitbar(0,'Applying bilateral filter...');  
  68. set(h,'Name','Bilateral Filter Progress');  
  69.   
  70. % Apply bilateral filter.  
  71. %计算值域核H 并与定义域核G 乘积得到双边权重函数F  
  72. dim = size(A);  
  73. B = zeros(dim);  
  74. for i = 1:dim(1)  
  75.    for j = 1:dim(2)  
  76.         
  77.          % Extract local region.  
  78.          iMin = max(i-w,1);  
  79.          iMax = min(i+w,dim(1));  
  80.          jMin = max(j-w,1);  
  81.          jMax = min(j+w,dim(2));  
  82.          %定义当前核所作用的区域为(iMin:iMax,jMin:jMax)  
  83.          I = A(iMin:iMax,jMin:jMax);%提取该区域的源图像值赋给I  
  84.         
  85.          % Compute Gaussian intensity weights.  
  86.          H = exp(-(I-A(i,j)).^2/(2*sigma_r^2));  
  87.         
  88.          % Calculate bilateral filter response.  
  89.          F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);  
  90.          B(i,j) = sum(F(:).*I(:))/sum(F(:));  
  91.                  
  92.    end  
  93.    waitbar(i/dim(1));  
  94. end  
  95.   
  96. % Close waitbar.  
  97. close(h);  
  98.   
  99.   
  100. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  101. % Implements bilateral filter for color images.  
  102. function B = bfltColor(A,w,sigma_d,sigma_r)  
  103.   
  104. % Convert input sRGB image to CIELab color space.  
  105. if exist('applycform','file')  
  106.    A = applycform(A,makecform('srgb2lab'));  
  107. else  
  108.    A = colorspace('Lab<-RGB',A);  
  109. end  
  110.   
  111. % Pre-compute Gaussian domain weights.  
  112. [X,Y] = meshgrid(-w:w,-w:w);  
  113. G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));  
  114.   
  115. % Rescale range variance (using maximum luminance).  
  116. sigma_r = 100*sigma_r;  
  117.   
  118. % Create waitbar.  
  119. h = waitbar(0,'Applying bilateral filter...');  
  120. set(h,'Name','Bilateral Filter Progress');  
  121.   
  122. % Apply bilateral filter.  
  123. dim = size(A);  
  124. B = zeros(dim);  
  125. for i = 1:dim(1)  
  126.    for j = 1:dim(2)  
  127.         
  128.          % Extract local region.  
  129.          iMin = max(i-w,1);  
  130.          iMax = min(i+w,dim(1));  
  131.          jMin = max(j-w,1);  
  132.          jMax = min(j+w,dim(2));  
  133.          I = A(iMin:iMax,jMin:jMax,:);  
  134.         
  135.          % Compute Gaussian range weights.  
  136.          dL = I(:,:,1)-A(i,j,1);  
  137.          da = I(:,:,2)-A(i,j,2);  
  138.          db = I(:,:,3)-A(i,j,3);  
  139.          H = exp(-(dL.^2+da.^2+db.^2)/(2*sigma_r^2));  
  140.         
  141.          % Calculate bilateral filter response.  
  142.          F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);  
  143.          norm_F = sum(F(:));  
  144.          B(i,j,1) = sum(sum(F.*I(:,:,1)))/norm_F;  
  145.          B(i,j,2) = sum(sum(F.*I(:,:,2)))/norm_F;  
  146.          B(i,j,3) = sum(sum(F.*I(:,:,3)))/norm_F;  
  147.                   
  148.    end  
  149.    waitbar(i/dim(1));  
  150. end  
  151.   
  152. % Convert filtered image back to sRGB color space.  
  153. if exist('applycform','file')  
  154.    B = applycform(B,makecform('lab2srgb'));  
  155. else    
  156.    B = colorspace('RGB<-Lab',B);  
  157. end  
  158.   
  159. % Close waitbar.  
  160. close(h);  

调用方法:

[cpp] view
plain
copy

  1. I=imread('einstein.jpg');  
  2. I=double(I)/255;  
  3.   
  4. w     = 5;       % bilateral filter half-width  
  5. sigma = [3 0.1]; % bilateral filter standard deviations  
  6.   
  7. I1=bfilter2(I,w,sigma);  
  8.   
  9. subplot(1,2,1);  
  10. imshow(I);  
  11. subplot(1,2,2);  
  12. imshow(I1)  

实验结果:

参考资料:

1.《Computer Vision Algorithms and Applications》

2. http://de.wikipedia.org/wiki/Bilaterale_Filterung

3.http://www.cs.duke.edu/~tomasi/papers/tomasi/tomasiIccv98.pdf

4. http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html

5. http://mesh.brown.edu/dlanman

时间: 2024-09-13 18:08:35

双边滤波器的原理及实现的相关文章

opencv笔记4:模板运算和常见滤波操作

time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工程--图像处理>(章毓晋)一书第3章,空域增强:模板操作.同时也有个疑问:此书第四章,频域图像增强,讲了低通滤波和高通滤波,然而这些东西和模板运算中的平滑.锐化操作有什么区别?... 以下是正文: 模板运算 首先我们把所有图像看作矩阵. 模板一般是nxn(n通常是3.5.7.9等很小的奇数)的矩阵.模板

基于图论的立体匹配方法研究----绪论

绪论 计算机视觉是一门通过研究使用计算机来模拟人的视觉系统的学科."一图胜千言",人类对于图像中的信息感知效率远超文字等其他媒介,人类获取的信息总量中更是有高达80%依靠视觉系统[1].相对于人类高效的图像信息提取能力,计算机在图像信息的理解上仍然效率低下. 计算机视觉作为一门交叉学科,综合了生物学,心理学,数学,计算机科学等学科,从20世纪60年代至今其在科学研究领域中的大量成果已经应用于工程领域,并影响了我们每个人生活的方方面面. 双目立体视觉是计算机视觉领域的重要分支,它通过模拟

立体匹配的研究背景以及意义

转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/51533549, 来自: shiter编写程序的艺术 计算机视觉是一门研究使用计算机来模拟人的视觉系统的学科."一图胜千言",人类对于图像中的信息感知效率远超文字等其他媒介,人类获取的信息总量中更是有高达80%依靠视觉系统[1].相对于人类高效的图像信息提取能力,计算机在图像信息的理解上仍然效率低下. 计算机视觉作为一门交叉学科,综合了生物学,心理学,数学,计算机科学等

OpenCV 2.4.3 C++ 平滑处理分析_C 语言

原理 平滑也称模糊, 是一项简单且使用频率很高的图像处理方法. 平滑处理时需要用到一个滤波器. 最常用的滤波器是线性滤波器,线性滤波处理的输出像素值(例如:)是输入像素值(例如:)的加权平均: 称为核, 它仅仅是一个加权系数. 均值平滑 下面是一个使用blur函数的均值平滑: 复制代码 代码如下: #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include &quo

【OpenCV归纳】5 图像处理

 一.综述 本节我们将来探讨关于图像处理方面的诸多技术和应用.在学完了第一个常用的工具包之后,学习这一节将更加轻松.废话不多说,切入正题. 二.平滑处理和图像形态学 1.滤波器 "平滑处理"或者也称为"模糊处理",英文名为blurring.对于平滑处理,我们先来介绍一个重要的函数,所有的操作都由这个函数来实现. void cvSmooth {    const CvArr* src,    CvArr* dst,    intsmoothtype=CV_GAUS

《Mastering Opencv读书笔记》第一章 实现图像卡通效果

这本书和配套代码网上都有得下载. 要实现书中的效果,只要三步:1.使用拉普拉斯算子提取轮廓  2.使用双边滤波器对图像进行平滑 3.根据第一步得到的轮廓模版图,将第二步的结果拷贝过去[填充轮廓图中全白的部分] 由于我的笔记本摄像头坏了,故我的程序读取的是手机拍摄的视频. 下面给出我整理的两段代码: 1.边缘提取: // GetMySketch.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #in

《计算机视觉度量深入解析》—第1章1.3节三维深度处理

1.3 三维深度处理 由于历史原因,在深入讨论深度感知和相关方法时,会同时涉及到一些专用词汇和它们的缩写词,所以本节会提到一些相互重叠的主题.前面的表1-1从上物理方法对深度感知进行了简要介绍.不管是哪种深度感知方法,它们之间有许多相似之处.考虑到摄像机系统的校准精度.景深的几何模型.深度数据的测量精度.深度数据中存在的任何噪声以及预期应用,深度信息的后处理是至关重要的. 本节会介绍几个深度感知的主题,这些主题之间相互关联,包括几种主题. 稀疏深度感知方法 稠密深度感知方法 光流 同步定位和映射

基于OpenCV 的美颜相机推送直播流

程序流程: 1.图像采集 先从opencv(2.4.10版本)采集回来摄像头的图像,是一帧一帧的 每一帧图像是一个矩阵,opencv中的mat 数据结构.   2.人脸的美化 人脸美化,我们用的皮肤检测,皮肤在颜色空间是特定的一个区域 检测到这个区域(感兴趣区域),完后对这个区域进行美化,就是滤波,主要是双边滤波和高斯滤波.   3.视频格式转换以及编码 处理好的矩阵颜色空间是rgb的,需要转换成yuv,yuv的颜色空间就是可以播放的,类似我们电视上面看的画面,编码就是传输时候需要发送流,只个流

基于最小生成树的实时立体匹配算法简介

转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/51533549, 来自: shiter编写程序的艺术 图割,置信传播等全局优化立体匹配算法,由于运算过程中需要迭代求精,运算时间长,无法达到实时计算立体匹配的需求,然而实时性需求却广泛存在立体匹配的应用场景中.很多基于局部匹配的算法虽然运算时间短,但由于仅考虑匹配窗内的代价聚合,效果很差,视差图只有很多稀疏的视差点,还要经过插值计算,显然无法用于汽车导航,目标拾取等需要精确结果且