双边滤波器(Bilateral Filter)保护边缘的平滑滤波器及matlab例子

原理
滤波器是图像处理和计算机视觉中最基础的运算。而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:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理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:一种能保护边缘的平滑滤波器 - 钰央 - 计算机视觉·图像处理值越大,距离越近 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.

【转载】http://blog.163.com/yuyang_tech/blog/static/21605008320130242441886/

概念理解:对于传统的维纳滤波和高斯滤波,都只是在像素点邻域范围内进行卷积操作,而双边滤波又加入了像素点差值的限制,这样对于边缘点像素变化很大的地方,便不会受到滤波影响了,也就达到了保存边缘的滤波效果。

双边滤波器的修改:

首先说一下双边滤波器,双边滤波器的好处是可以做边缘保存edge preserving,一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显的模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分步的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。

但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波,因此我们对于双边滤波器进行了改进,由于小波分解可以把信号分解为高频和低频部分,我们对于不同频率段进行不同的滤波。首先将彩色图像RGB模式转为CIE-LAB模式,然后做一次离散二维小波变换dwt2,对于高频的HH,LH,HL部分我们用Bayes shrink的阈值做了软门限soft thresholding,对于低频部分我们把它再进行分解,然后对高频做小波阈值,对低频采用双边滤波。这样取得的恢复图像,MSE减少了30%,色差误差ciede2000减少了50%,可证明更适于滤波和人类视觉系统。

【转载】http://blog.csdn.net/henhen2002/article/details/5621733

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值