%简单地说:

%A为给定图像,归一化到[,]的矩阵

%W为双边滤波器(核)的边长/

%定义域方差σd记为SIGMA(),值域方差σr记为SIGMA()

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Pre-process input and select appropriate filter.

function B = bfilter2(A,w,sigma)

% Verify that the input image exists and is valid.

if ~exist('A','var') || isempty(A)

   error('Input image A is undefined or invalid.');

end

if ~isfloat(A) || ~sum([,] == size(A,)) || ...

      min(A(:)) <  || max(A(:)) > 

   error(['Input image A must be a double precision ',...

          'matrix of size NxMx1 or NxMx3 on the closed ',...

          'interval [0,1].']);      

end

% Verify bilateral filter window size.

if ~exist('w','var') || isempty(w) || ...

      numel(w) ~=  || w < 

   w = ;

end

w = ceil(w);

% Verify bilateral filter standard deviations.

if ~exist('sigma','var') || isempty(sigma) || ...

      numel(sigma) ~=  || sigma() <=  || sigma() <= 

   sigma = [ 0.1];

end

% Apply either grayscale or color bilateral filtering.

if size(A,) == 

   B = bfltGray(A,w,sigma(),sigma());

else

   B = bfltColor(A,w,sigma(),sigma());

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Implements bilateral filtering for grayscale images.

function B = bfltGray(A,w,sigma_d,sigma_r)

% Pre-compute Gaussian distance weights.

[X,Y] = meshgrid(-w:w,-w:w);

%创建核距离矩阵,e.g.

%  [x,y]=meshgrid(-:,-:)

% 

% x =

% 

%     -          

%     -          

%     -          

% 

% 

% y =

% 

%     -    -    -

%                

%                

%计算定义域核

G = exp(-(X.^+Y.^)/(*sigma_d^));

% Create waitbar.

h = waitbar(,'Applying bilateral filter...');

set(h,'Name','Bilateral Filter Progress');

% Apply bilateral filter.

%计算值域核H 并与定义域核G 乘积得到双边权重函数F

dim = size(A);

B = zeros(dim);

for i = :dim()

   for j = :dim()

         % Extract local region.

         iMin = max(i-w,);

         iMax = min(i+w,dim());

         jMin = max(j-w,);

         jMax = min(j+w,dim());

         %定义当前核所作用的区域为(iMin:iMax,jMin:jMax)

         I = A(iMin:iMax,jMin:jMax);%提取该区域的源图像值赋给I

         % Compute Gaussian intensity weights.

         H = exp(-(I-A(i,j)).^/(*sigma_r^));

         % Calculate bilateral filter response.

         F = H.*G((iMin:iMax)-i+w+,(jMin:jMax)-j+w+);

         B(i,j) = sum(F(:).*I(:))/sum(F(:));

   end

   waitbar(i/dim());

end

% Close waitbar.

close(h);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 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.^+Y.^)/(*sigma_d^));

% Rescale range variance (using maximum luminance).

sigma_r = *sigma_r;

% Create waitbar.

h = waitbar(,'Applying bilateral filter...');

set(h,'Name','Bilateral Filter Progress');

% Apply bilateral filter.

dim = size(A);

B = zeros(dim);

for i = :dim()

   for j = :dim()

         % Extract local region.

         iMin = max(i-w,);

         iMax = min(i+w,dim());

         jMin = max(j-w,);

         jMax = min(j+w,dim());

         I = A(iMin:iMax,jMin:jMax,:);

         % Compute Gaussian range weights.

         dL = I(:,:,)-A(i,j,);

         da = I(:,:,)-A(i,j,);

         db = I(:,:,)-A(i,j,);

         H = exp(-(dL.^+da.^+db.^)/(*sigma_r^));

         % Calculate bilateral filter response.

         F = H.*G((iMin:iMax)-i+w+,(jMin:jMax)-j+w+);

         norm_F = sum(F(:));

         B(i,j,) = sum(sum(F.*I(:,:,)))/norm_F;

         B(i,j,) = sum(sum(F.*I(:,:,)))/norm_F;

         B(i,j,) = sum(sum(F.*I(:,:,)))/norm_F;

   end

   waitbar(i/dim());

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);

双边滤波Matlab代码的更多相关文章

  1. 快速双边滤波 附完整C代码

    很早之前写过<双边滤波算法的简易实现bilateralFilter>. 当时学习参考的代码来自cuda的样例. 相关代码可以参阅: https://github.com/johng12/c ...

  2. opencv-12-高斯滤波-双边滤波(附C++代码实现)

    开始之前 这几天由于自己的原因没有写, 一个是因为自己懒了, 一个是感觉这里遇到点问题不想往下写了, 我们先努力结束这个章节吧, 之前介绍了比较常用而且比较好理解的均值和中值滤波, 但是呢,在例程Sm ...

  3. o(1)复杂度之双边滤波算法的原理、流程、实现及效果。

    一.引言     双边滤波在图像处理领域中有着广泛的应用,比如去噪.去马赛克.光流估计等等,最近,比较流行的Non-Local算法也可以看成是双边滤波的一种扩展.自从Tomasi et al等人提出该 ...

  4. Bilateral Filtering(双边滤波) for SSAO(转)

    原文链接:http://blog.csdn.net/bugrunner/article/details/7170471 另外一篇相似的英文资料:http://homepages.inf.ed.ac.u ...

  5. Bilateral Filtering(双边滤波) for SSAO

    原网址:http://blog.csdn.net/bugrunner/article/details/7170471 1. 简介 图像平滑是一个重要的操作,而且有多种成熟的算法.这里主要简单介绍一下B ...

  6. OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...

  7. 利用联合双边滤波或引导滤波进行升采样(Upsampling)技术提高一些耗时算法的速度。

    这十年来,在图像处理领域提出了很多新的图像分析和处理方法,包括是自动的以及一些需要有人工参与的,典型的比如stereo depth computations.image colorization.to ...

  8. 学习 opencv---(8)非线性滤波:中值滤波,双边滤波

    正如我们上一篇文章中讲到的,线性滤波可以实现很多种不同的图像变换.然而非线性滤波,如中值滤波器和双边滤波器,有时可以达到更好的实现效果. 邻域算子的其他一些例子还有对 二值图像进行操作的形态学算子,用 ...

  9. 双边滤波算法的简易实现bilateralFilter

    没怎么看过双边滤波的具体思路,动手写一写,看看能不能突破一下. 最后,感觉算法还是要分开 水平 与 垂直 方向进行分别处理,才能把速度提上去. 没耐性写下去了,发上来,给大伙做个参考好了. 先上几张效 ...

随机推荐

  1. Vue Element使用第三库icon图标

    一:引入单设图标 1.打开 阿里icon,注册 >登录>图标管理>我的项目 2.新建项目 返回阿里icon首页,点进去你想要的icon库,因为没有批量导入购物车,所以一般情况下需要一 ...

  2. JS案例经验二

    一 关键词:鼠标事件的触发 可以在函数中指定让鼠标事件自动触发,而不是必须要鼠标滑过才触发,例如: main.onmouseover(); // 可以把该语句看做是鼠标滑过的模拟动作 main是DOM ...

  3. Luogu P1315 [NOIP2012]观光公交

    题目 每次把加速器用在可以是答案减少最多的地方就即可.(这不是废话吗?) 具体而言,我们处理出: \(sum_i\)到\(i\)为止下车人数之和. \(t_i\)在\(i\)最晚的上车的人的上车时间. ...

  4. 洛谷 P1484 种树(优先队列,贪心,链表)

    传送门 解题思路 第一眼的贪心策略:每次都选最大的. 但是——不正确! 因为选了第i个树,第i-1和i-1棵树就不能选了.所以,要有一个反悔操作. 选了第i个后,我们就把a[i]的值更新为a[l[i] ...

  5. linux下定时器的实现

    简介: linux下经常有这样的需求,需要定时轮询执行某种任务,当然,用shell脚本的话,crontab和at就可以满足要求.如果从C语言的角度来看,实现定时器也是一个比较简单的任务,因为具有普遍性 ...

  6. 数塔 Medium

    Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the ...

  7. react找到对象数组中指定的值

    找到对象数组中指定的值var array = [            { label: "Custom", value: "0" },            ...

  8. MySQL存储过程、触发器、自定义函数、事务

    1.存储过程 MySQL中存储过程的参数中有IN.OUT.INOUT类型,但是函数的参数只能是IN类型的. “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参 ...

  9. Python列表(list)的方法调用

    #list# n = [12,34,"yue"]# v = n.append(27) #增加元素,注意是在尾部增加,由于列表是可修改的,所以是在原列表中增加,与字符串存在区别# p ...

  10. centos7安装mxnet

    pip install mxnet-cu90 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 安装sklearn时总报错 ...