双边滤波

双边滤波(bilateral filter)是一种非线性滤波器,该算法结合空间信息和亮度相似性对图像进行滤波处理,在平滑滤波的同时能大量保留图像的边缘和细节特征。 定义如下:

                                                           

 其中为输出图像,为输入图像,是以像素点为中心的邻域窗口,为滤波核。双边滤波的滤波核由两部分乘积组成:空域核与值域核。两个滤波核通常都采用高斯函数形式。

其中为空域高斯函数的标准差,为值域高斯函数的标准差。空域滤波系数由像素间的空间距离决定,距离越小,系数越大。值域滤波系数由像素间的相似度决定,像素值越接近,系数越大。

在灰度变化平缓区域,值域滤波系数接近1,此时空域滤波起主要作用,双边滤波器退化为传统的高斯低通滤波器,对图像进行平滑操作。而在图像变化剧烈的部分(即图像边缘),像素间差异较大,值域滤波起主要作用,因而能保持边缘信息。

下图是双边滤波原来示意图:

 

 双边滤波原理示意

对彩色图像:[2]中将其转换至Lab空间,值域核由L、a、b三分量的差值决定:

但实验结果表明它与直接分别对R、G、B通道差别并不大。

程序:

clear all;
close all;
I=double(imread('mandrill.jpg'));
I=I/255;
w = 5;
sigma=[3 0.1];
O=bfilter2(I,w,sigma);
figure;
imshow([I,O],[]);
function B = bfilter2(A,w,sigma)
if size(A,3) == 1
   B = bfltGray(A,w,sigma(1),sigma(2));
else
   B = bfltColor(A,w,sigma(1),sigma(2));
end

function [B,K] = bfltGray(A,w,sigma_d,sigma_r)
%%
%A为给定图像,归一化到[0,1]的矩阵
%W为双边滤波器(核)的边长/2
%定义域方差σd记为SIGMA(1),值域方差σr记为SIGMA(2)
%%
%计算空域核
[X,Y] = meshgrid(-w:w,-w:w);
G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
%计算值域核H并与定义域核G乘积得到双边权重函数F
[m,n] = size(A);
B = zeros(m,n);%结果图像
K = zeros(m,n);%双边滤波器
for i = 1:m
   for j = 1:n
         %确定邻域边界
         iMin = max(i-w,1);
         iMax = min(i+w,m);
         jMin = max(j-w,1);
         jMax = min(j+w,n);
         %定义当前核所作用的区域为(iMin:iMax,jMin:jMax)
         I = A(iMin:iMax,jMin:jMax);%提取该区域的源图像值赋给I
 
         H = exp(-(I-A(i,j)).^2/(2*sigma_r^2));
         F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);
         K(i,j) = sum(F(:));
         B(i,j) = sum(F(:).*I(:))/K(i,j);
         
   end
end


function B = bfltColor(A,w,sigma_d,sigma_r)
%%
%A为给定图像,归一化到[0,1]的矩阵
%W为双边滤波器(核)的边长/2
%定义域方差σd记为SIGMA(1),值域方差σr记为SIGMA(2)
%%
%颜色空间转换:RGB-->Lab
if exist('applycform','file')
   A = applycform(A,makecform('srgb2lab'));
else
   A = colorspace('Lab<-RGB',A);
end
%计算空域核
[X,Y] = meshgrid(-w:w,-w:w);
G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
%改变值域参数以适应Lab空间的取值范围
sigma_r = 100*sigma_r;
dim = size(A);
B = zeros(dim);
for i = 1:dim(1)
   for j = 1:dim(2)
         %确定邻域边界
         iMin = max(i-w,1);
         iMax = min(i+w,dim(1));
         jMin = max(j-w,1);
         jMax = min(j+w,dim(2));
         I = A(iMin:iMax,jMin:jMax,:);
      
         % 计算值域核
         dL = I(:,:,1)-A(i,j,1);
         da = I(:,:,2)-A(i,j,2);
         db = I(:,:,3)-A(i,j,3);
         H = exp(-(dL.^2+da.^2+db.^2)/(2*sigma_r^2));
   
         F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);%双边滤波核
         norm_F = sum(F(:));
         B(i,j,1) = sum(sum(F.*I(:,:,1)))/norm_F;
         B(i,j,2) = sum(sum(F.*I(:,:,2)))/norm_F;
         B(i,j,3) = sum(sum(F.*I(:,:,3)))/norm_F;
                
   end
end

%转回RGB空间
if exist('applycform','file')
   B = applycform(B,makecform('lab2srgb'));
else  
   B = colorspace('RGB<-Lab',B);
end

结果:

参考:

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

[2] TomasiC, Manduchi R. Bilateral filtering for gray and color images[C]//ComputerVision, 1998. Sixth International Conference on. IEEE, 1998: 839-846.

[3] http://www.mathworks.com/matlabcentral/fileexchange/12191-bilateral-filtering

posted @ 2015-09-25 23:43  xiaoluo91  阅读(4541)  评论(2编辑  收藏  举报