Bilateral Filter:保护边缘的平滑滤波器

来源:互联网 发布:轩辕剑昆仑镜进阶数据 编辑:程序博客网 时间:2024/05/24 23:11

转自:http://blog.163.com/yuyang_tech/blog/static/21605008320130242441886/

原理
滤波器是图像处理和计算机视觉中最基础的运算。而Bilateral Filter又是十分经典的一种滤波器,这主要得益于它的一个突出的特点,就是对图像进行平滑时,能进行边缘保护。
而Bilateral Flter的这个特性主要是因为他在平滑滤波时同时考虑了像素间的几何距离和色彩距离。
下面将详细具体讲述原因。
通俗的讲,对图像进行滤波就是一个加权平均的运算过程,滤波后图像中的每个像素点都是由其原图像中该点临域内多个像素点值的加权平均。不同的滤波器,最根本的差异就是权值不同。
Bilateral Filter具有两个权重,分别与几何距离和色彩距离相关,它的一般表达式为:

Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理
式中,权重Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理和邻域像素点Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理与中心像素点Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理之间的几何距离相关,权重和邻域像素点Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理与中心像素点Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理之间的色彩距离相关。
也就是说,随着Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理之间几何距离和色彩距离的变化,像素点Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理的权重Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理和随之变化。这样的一个滤波器是一个智能的可自动调节权重的滤波器。至于如何自动调节,就取决于权重函数Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理和的具体表达式了。
最简单和常见的一种Bilteral Filter是两个权重函数均为高斯函数,即:
 Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理

其中,||x-y||求的是两个值x,y之间的欧式距离。
采用高斯函数之后,当邻域像素点Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理与中心像素点Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理的欧式距离比较大,或是两个像素值相差比较大时,该像素点的权重就比较小,导致该像素点对滤波后的像素点的影响较小。更进一步,每个滤波后像素点的值,受与他色彩相近并且距离较近的像素点的影响较大,而受其他临域像素点的影响较小,这样保护了图像中原像素点的色彩,滤掉了少数存在的“噪声点”,起到了平滑的作用,同时又保护了边缘。
举个例子,如下图所示:

Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理
(a)为图像中的一个patch,图中用高度代表该像素点的像素值。
(b)为求得(a)中右侧边缘上的一个像素点的权重Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理(图中用高度代表权重的大小),可以看到,颜色越相近值越大,距离越近Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理值越大,那么最终两个权重的积就如图中分布。
(c)对(a)图中的每一个像素点都进行Bilateral滤波,结果如图(c)所示,可以看到滤波的结果即保护了边缘,同时平滑了图像。
实验&Code
对于灰度图像进行bilateral滤波,matlab代码如下:

function out_img = bilateral_filter(in_img,w,sigma_c,sigma_s);
% matlab code for bilateral filter

% Pre-compute Gaussian distance weights.
[X,Y] = meshgrid(-w:w,-w:w);
C = exp(-(X.^2+Y.^2)/(2*sigma_c^2));

% Apply bilateral filter.
[m,n,c] = size(in_img);
out_img = zeros(m,n,c);
for i = 1:m
   for j = 1:n
       % Extract local region.
       I = in_img(max(i-w,1):min(i+w,m),max(j-w,1):min(j+w,n));
       % Compute Gaussian intensity weights.
       S = exp(-(I-in_img(i,j)).^2/(2*sigma_s^2));
       % Calculate bilateral filter response.
       F = S.*C((max(i-w,1):min(i+w,m))-i+w+1,(max(j-w,1):min(j+w,n))-j+w+1);
       out_img(i,j) = sum(F(:).*I(:))/sum(F(:));        
   end
end

对于彩色图像进行bilateral滤波,matlab代码如下:

function out_img = bilateral_filter(in_img,w,sigma_c,sigma_s);
% matlab code for bilateral filter]

% Convert input sRGB image to CIELab color space.
% in_img = colorspace('Lab<-RGB',in_img);

% Pre-compute Gaussian distance weights.
[X,Y] = meshgrid(-w:w,-w:w);
C = exp(-(X.^2+Y.^2)/(2*sigma_c^2));

% Rescale range variance (using maximum luminance).
sigma_s = 100*sigma_s;

% Apply bilateral filter.
[m,n,c] = size(in_img);
out_img = zeros(m,n,c);
for i = 1:m
   for j = 1:n
       % Extract local region.
       I = in_img(max(i-w,1):min(i+w,m),max(j-w,1):min(j+w,n),:);

       % Compute Gaussian intensity weights.
       dL = I(:,:,1)-in_img(i,j,1);
       da = I(:,:,2)-in_img(i,j,2);
       db = I(:,:,3)-in_img(i,j,3);
       S = exp(-(dL.^2+da.^2+db.^2)/(2*sigma_s^2));
      
       % Calculate bilateral filter response.
       F = S.*C((max(i-w,1):min(i+w,m))-i+w+1,(max(j-w,1):min(j+w,n))-j+w+1); 
       out_img(i,j,1) = sum(sum(F.*I(:,:,1)))/sum(F(:));
       out_img(i,j,2) = sum(sum(F.*I(:,:,2)))/sum(F(:));
       out_img(i,j,3) = sum(sum(F.*I(:,:,3)))/sum(F(:));
   end
end

% Convert filtered image back to sRGB color space.
% out_img = colorspace('RGB<-Lab',out_img);

两次运行的主程序:

clear all;
close all;

in_img = imread('lena.jpg');% or in_img = rgb2gray(imread('lena.jpg'));
in_img = rgb2gray(imread('1.jpg'));
in_img = double(in_img)/255;
in_img = in_img+0.05*randn(size(in_img));
in_img(in_img<0) = 0; in_img(in_img>1) = 1;

% Set bilateral filter parameters.
w     = 10;       % bilateral filter half-width
sigma_c = 3;% bilateral filter standard deviations
sigma_s = 0.1;

out_img = bilateral_filter(in_img,w,sigma_c,sigma_s);

figure,
subplot(1,2,1),imshow(in_img,[]),title('input image');
subplot(1,2,2),imshow(out_img,[]),title('output image');

实验结果:
Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理Bilateral Filter:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理

参考文献:

C. Tomasi, R. Manduchi. “Bilateral Filtering for Gray and Color Images“, ICCV 1998.


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 删了qq好友怎么找回来怎么办 苹果5s语音控制打开了怎么办 lv迷你水桶包肩带长了怎么办 在香港买个lv包包过海关怎么办 国际快递手表被海关查应该怎么办 把档案放到人才市场后报到证怎么办 皮表带带久了有异味怎么办 英语中用词不当和拼写错误怎么办 爬楼梯的购物车车轮坏了怎么办? 帮别人买东西不给我钱怎么办 老师念错名字有同学指出来你怎么办 老公婚前买的房子婆婆想霸占怎么办 我想查我的基金收益情况怎么办 儿童票买好了但大人退票了怎么办 没有享受到国家政策的农民怎么办? 股票涨了没抛然后一直跌怎么办 苹果手机放久了开不了机怎么办 部门要辞退你你不想走该怎么办 口头说辞职现在又不想走了怎么办 网上买的理财不给退本金怎么办 买东西遇到态度不好的人你会怎么办 app在下载东西时被停用了怎么办 买东西填错地址 但已签收怎么办 网购手机受骗后电话打不通怎么办 淘宝买的东西发错了怎么办 淘宝上买的东西发错了怎么办 淘宝上买的东西发多了怎么办 淘宝上买的东西出现问题怎么办 淘宝买东西未收到货显示签收怎么办 网上一张车票两人同时付款了怎么办 微信付款时显示银行卡被锁定怎么办 微信忘记支付密码怎么办没有银行卡 支付宝赏金扫码支付不行怎么办 网购收货时发现货物已破损怎么办 货物丢失了不承认调查出来了怎么办 小米商城已签收未收到了怎么办 网购的一只荷兰猪现在怎么办 中通快递的掌中通好评怎么办 唯品会快递被签收却没收到货怎么办 拼多多快递签收了但没收到货怎么办 顺丰代收签收成功要强制退款怎么办