当前位置:   article > 正文

双边滤波器—— Matlab实现_双边滤波算法matlab

双边滤波算法matlab

例:先用双边滤波器(BF)对原图像进行滤波得到低频部分,原图和低频作差后得到高频分量高频分量和低频分量分别增强后再进行合成。

双边滤波的特点是保边去噪,相较于高斯滤波,在平滑图像的同时,增加了对图像边缘的保护,其主要原因是由于该滤波器由两部分组成,一部分与像素空间距离相关,另一部分与像素点的像素差值相关。

下面结合公式来说说为什么双边滤波在模糊图像的时候具有保边功能,双边滤波器公式为:

其中,空间邻近度因子为

亮度相似度因子为

双边滤波器的权重等于空间邻近度因子和亮度相似度因子的乘积

空间邻近度因子为高斯滤波器系数,像素距离越远,权重越小,当越大时,平滑效果越明显。

亮度相似度因子与空间像素差值相关,像素差值越大,权重越小,这也是为什么双边滤波器能够保边去噪的原因。当 越大时,对同等灰度差的像素平滑作用越大,保边效果越差,论文中给出的参考是 一般取高斯噪声标准差的2倍。

下面列出matlab代码,这部分代码既可以处理灰度图像,也可以处理彩色图像,代码下载地址,需要有Mathworks账号:

https://cn.mathworks.com/matlabcentral/fileexchange/12191-bilateral-filtering

双边滤波器

  1. function B = bfilter2(A,w,sigma)    
  2. %A为给定图像,归一化到[0,1]的double矩阵    
  3. %W为双边滤波器(核)的边长/2    
  4. %定义域方差σd记为SIGMA(1),值域方差σr记为SIGMA(2)   
  5. %    This function implements 2-D bilateral filtering using  
  6. %    the method outlined in:  
  7. %  
  8. %       C. Tomasi and R. Manduchi. Bilateral Filtering for   
  9. %       Gray and Color Images. In Proceedings of the IEEE   
  10. %       International Conference on Computer Vision, 1998.   
  11. %  
  12. %    B = bfilter2(A,W,SIGMA) performs 2-D bilateral filtering  
  13. %    for the grayscale or color image A. A should be a double  
  14. %    precision matrix of size NxMx1 or NxMx3 (i.e., grayscale  
  15. %    or color images, respectively) with normalized values in  
  16. %    the closed interval [0,1]. The half-size of the Gaussian  
  17. %    bilateral filter window is defined by W. The standard  
  18. %    deviations of the bilateral filter are given by SIGMA,  
  19. %    where the spatial-domain standard deviation is given by  
  20. %    SIGMA(1) and the intensity-domain standard deviation is  
  21. %    given by SIGMA(2).  
  22. %  
  23. % Douglas R. Lanman, Brown University, September 2006.  
  24. % dlanman@brown.edu, http://mesh.brown.edu/dlanman  
  25.   
  26. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  27. % Pre-process input and select appropriate filter.  
  28.   
  29. % Verify that the input image exists and is valid.  
  30. if ~exist('A','var') || isempty(A)  
  31.    error('Input image A is undefined or invalid.');  
  32. end  
  33. if ~isfloat(A) || ~sum([1,3== size(A,3)) || ...  
  34.       min(A(:)) < 0 || max(A(:)) > 1  
  35.    error(['Input image A must be a double precision ',...  
  36.           'matrix of size NxMx1 or NxMx3 on the closed ',...  
  37.           'interval [0,1].']);        
  38. end  
  39.   
  40. % Verify bilateral filter window size.  
  41. if ~exist('w','var') || isempty(w) || ...  
  42.       numel(w) ~= 1 || w < 1    %计算数组中的元素个数  
  43.    w = 5;  
  44. end  
  45. = ceil(w);    %大于w的最小整数  
  46.   
  47. % Verify bilateral filter standard deviations.  
  48. if ~exist('sigma','var') || isempty(sigma) || ...  
  49.       numel(sigma) ~= 2 || sigma(1) <= 0 || sigma(2) <= 0  
  50.    sigma = [3 0.1];  
  51. end  
  52.   
  53. % Apply either grayscale or color bilateral filtering.  
  54. if size(A,3== 1       %如果输入图像为灰度图像,则调用灰度图像滤波方法  
  55.    B = bfltGray(A,w,sigma(1),sigma(2));  
  56. else                    %如果输入图像为彩色图像,则调用彩色图像滤波方法  
  57.    B = bfltColor(A,w,sigma(1),sigma(2));  
  58. end  
  59.   
  60.   
  61. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  62. % Implements bilateral filtering for grayscale images.  
  63. function B = bfltGray(A,w,sigma_d,sigma_r)  
  64.   
  65. % Pre-compute Gaussian distance weights.  
  66. [X,Y] = meshgrid(-w:w,-w:w);  
  67. %创建核距离矩阵,e.g.    
  68. %  [x,y]=meshgrid(-1:1,-1:1)    
  69. %     
  70. % x =    
  71. %     
  72. %     -1     0     1    
  73. %     -1     0     1    
  74. %     -1     0     1    
  75. %     
  76. %     
  77. % y =    
  78. %     
  79. %     -1    -1    -1    
  80. %      0     0     0    
  81. %      1     1     1    
  82. %计算定义域核    
  83. = exp(-(X.^2+Y.^2)/(2*sigma_d^2));  
  84.   
  85. % Create waitbar.计算过程比较慢,创建waitbar可实时看到进度  
  86. = waitbar(0,'Applying bilateral filter...');  
  87. set(h,'Name','Bilateral Filter Progress');  
  88.   
  89. % Apply bilateral filter.  
  90. %计算值域核H 并与定义域核G 乘积得到双边权重函数F  
  91. dim = size(A);      %得到输入图像的width和height  
  92. = zeros(dim);  
  93. for i = 1:dim(1)  
  94.    for j = 1:dim(2)       
  95.          % Extract local region.  
  96.          iMin = max(i-w,1);  
  97.          iMax = min(i+w,dim(1));  
  98.          jMin = max(j-w,1);  
  99.          jMax = min(j+w,dim(2));  
  100.          %定义当前核所作用的区域为(iMin:iMax,jMin:jMax)   
  101.          I = A(iMin:iMax,jMin:jMax);    %提取该区域的源图像值赋给I  
  102.         
  103.          % Compute Gaussian intensity weights.  
  104.          H = exp(-(I-A(i,j)).^2/(2*sigma_r^2));  
  105.         
  106.          % Calculate bilateral filter response.  
  107.          F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);  
  108.          B(i,j) = sum(F(:).*I(:))/sum(F(:));  
  109.                  
  110.    end  
  111.    waitbar(i/dim(1));  
  112. end  
  113.   
  114. Close waitbar.  
  115. close(h);  
  116.   
  117.   
  118. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  119. % Implements bilateral filter for color images.  
  120. function B = bfltColor(A,w,sigma_d,sigma_r)  
  121.   
  122. % Convert input sRGB image to CIELab color space.  
  123. if exist('applycform','file')  
  124.    A = applycform(A,makecform('srgb2lab'));  
  125. else  
  126.    A = colorspace('Lab<-RGB',A);  
  127. end  
  128.   
  129. % Pre-compute Gaussian domain weights.  
  130. [X,Y] = meshgrid(-w:w,-w:w);  
  131. = exp(-(X.^2+Y.^2)/(2*sigma_d^2));  
  132.   
  133. % Rescale range variance (using maximum luminance).  
  134. sigma_r = 100*sigma_r;  
  135.   
  136. % Create waitbar.  
  137. = waitbar(0,'Applying bilateral filter...');  
  138. set(h,'Name','Bilateral Filter Progress');  
  139.   
  140. % Apply bilateral filter.  
  141. dim = size(A);  
  142. = zeros(dim);  
  143. for i = 1:dim(1)  
  144.    for j = 1:dim(2)  
  145.         
  146.          % Extract local region.  
  147.          iMin = max(i-w,1);  
  148.          iMax = min(i+w,dim(1));  
  149.          jMin = max(j-w,1);  
  150.          jMax = min(j+w,dim(2));  
  151.          I = A(iMin:iMax,jMin:jMax,:);  
  152.         
  153.          % Compute Gaussian range weights.  
  154.          dL = I(:,:,1)-A(i,j,1);  
  155.          da = I(:,:,2)-A(i,j,2);  
  156.          db = I(:,:,3)-A(i,j,3);  
  157.          H = exp(-(dL.^2+da.^2+db.^2)/(2*sigma_r^2));  
  158.         
  159.          % Calculate bilateral filter response.  
  160.          F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);  
  161.          norm_F = sum(F(:));  
  162.          B(i,j,1= sum(sum(F.*I(:,:,1)))/norm_F;  
  163.          B(i,j,2= sum(sum(F.*I(:,:,2)))/norm_F;  
  164.          B(i,j,3= sum(sum(F.*I(:,:,3)))/norm_F;  
  165.                   
  166.    end  
  167.    waitbar(i/dim(1));  
  168. end  
  169.   
  170. % Convert filtered image back to sRGB color space.  
  171. if exist('applycform','file')  
  172.    B = applycform(B,makecform('lab2srgb'));  
  173. else    
  174.    B = colorspace('RGB<-Lab',B);  
  175. end  
  176.   
  177. Close waitbar.  
  178. close(h);  

主函数:

 

  1. clear all;  
  2. Image_pri = imread('academy.jpg');  
  3. Image_normalized = im2double(Image_pri);  
  4. = 5;      %窗口大小  
  5. sigma = [3 0.1];    %方差  
  6. Image_bf = bfilter2(Image_normalized,w,sigma);  
  7. Image_bfOut = uint8(Image_bf*255);  
  8. figure(1);  
  9. subplot(1,2,1);  
  10. imshow(Image_pri);  
  11. subplot(1,2,2);  
  12. imshow(Image_bfOut);  
  13.   
  14. filter_gaussian = fspecial('gaussian',[5,5],3);   %生成gaussian空间波波器  
  15. gaussian_image = imfilter(Image_pri,filter_gaussian,'replicate');  
  16. figure(2);  
  17. subplot(1,2,1);  
  18. imshow(Image_pri);  
  19. subplot(1,2,2);  
  20. imshow(gaussian_image);  

 

输入图像为512×512的Lena灰度图像

双边滤波

高斯滤波

输入图像为512×512的Lena彩色图像

双边滤波

高斯滤波

注意看双边滤波图像,帽子边缘,模糊的效果很明显,但皮肤和背景处,仍然比较清晰,说明起到了保边平滑的作用。

下面给出一些测试结果

输入图像为256×256 Einstein灰度图像

双边滤波,滤波后黑色领带与白色衬衫区域轮廓清晰。

高斯滤波,滤波后图像整体模糊。

 

输入图像为256×256 大沸沸彩色图像

双边滤波

高斯滤波

 

输入图像为400×300的彩色图像

双边滤波

高斯滤波

此处代码运算速度很慢,2007年,麻省理工学院学者提出了快速双边滤波算法,并且给出了matlab代码,下载地址:

http://people.csail.mit.edu/jiawen/#code

 

参考资料:

1. http://blog.csdn.net/abcjennifer/article/details/7616663

2. http://blog.csdn.net/bugrunner/article/details/7170471

3. Bilateral Filtering for Gray and Color Images

4. Fast Bilateral Filtering for the Display of High-Dynamic-Range Images       

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/563874
推荐阅读
相关标签
  

闽ICP备14008679号