双边滤波(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