双边滤波

双边滤波的基本特性:

普通的时空域的低通滤波器,在像素空间完成滤波以后,导致图像的边缘部分也变得不那么明显,

整张图像都变得同样的模糊,图像边缘细节丢失。双边滤波器(Bilateral Filter)可以很好的保

留边缘的同时消除噪声。双边滤波器能做到这些原因在于它不像普通的高斯/卷积低通滤波,只考

虑了位置对中心像素的影响,它还考虑了卷积核中像素与中心像素之间相似程度的影响,根据位置

影响与像素值之间的相似程度生成两个不同的权重表(WeightTable),在计算中心像素的时候加以

考虑这两个权重,从而实现双边低通滤波。据说AdobePhotoshop的高斯磨皮功能就是应用了

双边低通滤波算法实现。

数学公式:

\vec{h}(\vec{x}) = k^{-1}(\vec{x}) \iint^{\infty}_{\infty} \vec{f}(\vec{\xi})\, c(\vec{\xi},\vec{x})\, s(\vec{f}(\vec{\xi}),\vec{f}(\vec{x})) \, d\vec{\xi}

其中\vec{h}为输出影像,\vec{f}为输入影像,函数的值代表给定像素上的色彩资讯。 我们将输入影像\vec{h}和输出影像\vec{f}写成向量的原因是,操作的影像不限定是只有单一通道的灰阶影像,他们也可以是多通道的彩色影像。 式子中的\vec{x}代表影像中的任意一点,而\vec{\xi}代表在\vec{x}邻近的点。 而k为归一化函数:

k(\vec{x}) = \iint^{\infty}_{\infty} c(\vec{\xi},\vec{x})\, s(\vec{f}(\vec{\xi}),\vec{f}(\vec{x}))\, d\vec{\xi}

双边滤波器的目的是,对于影像中的每一个点,都要对邻近的所有点进行加权平均,以达到平滑化的目的。 而对此,双边滤波器在\vec{x}邻近的点\vec{\xi}采取了不同的权重, 策略包含了两个核心函数c(\vec{\xi},\vec{x})s(\vec{f}(\vec{\xi}),\vec{f}(\vec{x})), 这两个式子分别代表了\vec{x}\vec{\xi}在空间几何关系上的差异和光度/色彩差异上的差异。 以下将针对这两个核心函数进行说明。

matlab代码:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
% Implements bilateral filter for color images.  
function B = bfltColor(A,w,sigma_d,sigma_r)  
  
% Convert input sRGB image to CIELab color space.  
if exist('applycform','file')  
   A = applycform(A,makecform('srgb2lab'));  
else  
   A = colorspace('Lab<-RGB',A);  
end  
  
% Pre-compute Gaussian domain weights.  
[X,Y] = meshgrid(-w:w,-w:w);  
G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));  
  
% Rescale range variance (using maximum luminance).  
sigma_r = 100*sigma_r;  
  
% Create waitbar.  
h = waitbar(0,'Applying bilateral filter...');  
set(h,'Name','Bilateral Filter Progress');  
  
% Apply bilateral filter.  
dim = size(A);  
B = zeros(dim);  
for i = 1:dim(1)  
   for j = 1:dim(2)  
        
         % Extract local region.  
         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,:);  
        
         % Compute Gaussian range weights.  
         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));  
        
         % Calculate bilateral filter response.  
         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  
   waitbar(i/dim(1));  
end  
  
% Convert filtered image back to sRGB color space.  
if exist('applycform','file')  
   B = applycform(B,makecform('lab2srgb'));  
else    
   B = colorspace('RGB<-Lab',B);  
end  
  
% Close waitbar.  
close(h);  
使用代码如下:
I=imread('lena.png');  
I=double(I)/255;  
  
I1= bfltColor(I,1,5,0.1);  
  
subplot(1,2,1);  
imshow(I);  
subplot(1,2,2);  
imshow(I1) 
处理结果如下:


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值