类似于在http://blog.csdn.net/piaoxuezhong/article/details/78302920中说的双边滤波算法,引导滤波算法也属于可以保持边缘的一种滤波算法。导向滤波之所以叫这个名字,大概是因为算法在进行滤波时需要一幅引导图像,引导图像可以是另外单独的图像,也可以是输入图像本身,当引导图为输入图像本省时,引导滤波就成为一个保持边缘的滤波操作。引导滤波可以用于降噪、细节平滑、HDR压缩、抠图、去雾以及联合采样等方面[1]。

相关算法比较:

像高斯滤波等线性滤波算法所用的核函数相对于待处理的图像是独立无关的,也就意味着,对任意图像都是采用相同的操作。但是,有时候我们是希望在滤波过程中可以加入引导图像中的信息的,例如,在上色处理过程中[2],结果图像的色度通道需要包含跟给定亮度通道一致的连续边缘。

方式1:通过引导图像获得约束条件,转化为非齐次方程的求解问题,此方法设计到大型稀疏方程求解,所以会比较耗时。
方式2:直接利用引导图像得到滤波核函数。例如在之前说的双边滤波[3]中,在某像素点的输出为周边像素与该点相似度相关的权重和,只是双边滤波所用的引导图像是它本身;另外,在[4]中,引导图像则是另外一幅图像。
当然这些方法也有缺点:一是可能引入梯度反转伪影,二是计算量的快速优化难度。在[5]中,作者证明了双边滤波可以是一种解决高斯亲和矩阵时的雅克比插值,这就比原始优化方法在速度上要优化不少;针对这些缺点,引导滤波算法做出了改进。

引导滤波算法原理:

在通常的线性旋转变化滤波过程中,某像素点的输出为:

                               (1)

Wij为权重,在双边滤波中,其权重函数表示为:

     (2)

而这里要说的引导滤波,某像素点的输出结果为:

                                 (3)

其中,q 为输出图像,I 为引导图像,ab 是当窗口中心位于 k 时该线性函数的不变系数。该方法的假定条件是: qI 在以像素 k 为中心的窗口中存在局部线性关系。对式子(3)求导(即表示边缘)可以看出,只有当引导图像存在边缘时,输出结果才会出现边缘。为了求解(3)中的系数a和b,假设p是q滤波前的结果,并满足使得q与p的差别最小,根据无约束图像复原的方法可以转化为求最优化问题,其价值函数为(4):

(n为噪声,p是q受到噪声n污染的退化图像)

   (4)

限制 i 在窗口 w 中,这样 a 值就不会出现太大的情况了。类似于最下二乘法求解,式(4)的解为:

其中,μ和σ^2分别表示 I 在局部窗口w 中的均值和方差。 |ω|是窗口内的像素个数。然后,在整幅图像内采取窗口操作,最后取均值可以得到式(3)的结果为:

       (5)

其中,

总结:导引图像 Iq 之间存在线性关系,这样设定可以使导引图像提供的信息主要用于指示哪些是边缘。如果导引图告诉我们这里是边缘,最终的结果就设法保留这些边缘信息。所以,引导滤波的前提条件是:当I和q满足线性关系才有意义。

引导滤波算法实现:

引导滤波现在已经集成到matlab和opencv的新版本中,在matlab中函数名为:guidedfilter。opencv中的实现跟matlab应该是一样的,我在这里贴下matlab的源码:

function q = guidedfilter(I, p, r, eps)
%   GUIDEDFILTER   O(1) time implementation of guided filter.
%
%   - guidance image: I (should be a gray-scale/single channel image)
%   - filtering input image: p (should be a gray-scale/single channel image)
%   - local window radius: r
%   - regularization parameter: eps[hei, wid] = size(I);N = boxfilter(ones(hei, wid), r); % the size of each local patch; N=(2r+1)^2 except for boundary pixels.% imwrite(uint8(N), 'N.jpg');% figure,imshow(N,[]),title('N');mean_I = boxfilter(I, r) ./ N;mean_p = boxfilter(p, r) ./ N;mean_Ip = boxfilter(I.*p, r) ./ N;cov_Ip = mean_Ip - mean_I .* mean_p; % this is the covariance of (I, p) in each local patch.mean_II = boxfilter(I.*I, r) ./ N;var_I = mean_II - mean_I .* mean_I;a = cov_Ip ./ (var_I + eps); % Eqn. (5) in the paper;b = mean_p - a .* mean_I; % Eqn. (6) in the paper;mean_a = boxfilter(a, r) ./ N;mean_b = boxfilter(b, r) ./ N;q = mean_a .* I + mean_b; % Eqn. (8) in the paper;
end

在其实现流程中有个boxfilter函数,它是基于积分图算法实现的,boxfilter中每个元素的值是该像素邻域内的像素和(或像素平方和),在需要求某个矩形内像素和的时候,直接访问数组中对应的位置就可以了,它的复杂度是O(1),具体可以参见【6】的讲解。或者看下boxfilter的源码:

function imDst = boxfilter(imSrc, r)%   BOXFILTER   O(1) time box filtering using cumulative sum
%
%   - Definition imDst(x, y)=sum(sum(imSrc(x-r:x+r,y-r:y+r)));
%   - Running time independent of r;
%   - Equivalent to the function: colfilt(imSrc, [2*r+1, 2*r+1], 'sliding', @sum);
%   - But much faster.[hei, wid] = size(imSrc);
imDst = zeros(size(imSrc));%cumulative sum over Y axis
imCum = cumsum(imSrc, 1);
%difference over Y axis
imDst(1:r+1, :) = imCum(1+r:2*r+1, :);
imDst(r+2:hei-r, :) = imCum(2*r+2:hei, :) - imCum(1:hei-2*r-1, :);
imDst(hei-r+1:hei, :) = repmat(imCum(hei, :), [r, 1]) - imCum(hei-2*r:hei-r-1, :);%cumulative sum over X axis
imCum = cumsum(imDst, 2);
%difference over Y axis
imDst(:, 1:r+1) = imCum(:, 1+r:2*r+1);
imDst(:, r+2:wid-r) = imCum(:, 2*r+2:wid) - imCum(:, 1:wid-2*r-1);
imDst(:, wid-r+1:wid) = repmat(imCum(:, wid), [1, r]) - imCum(:, wid-2*r:wid-r-1);
end

引导滤波的算法伪代码:

测试函数:

%% 灰度图引导滤波
clc,clear all,close all;
I=imread('D:\fcq_proMatlab\test_image\15.jpg');
if length(size(I))>2I=rgb2gray(I);
end
I = double(I) / 255;
p = I;
r = 3;
eps = 0.8^2;
O = guidedfilter(I, p, r, eps);
figure,
subplot(1,2,1), imshow(I);
subplot(1,2,2), imshow(O);

参考:

  1. 《Guided Image Filtering》[J] IEEE
  2. 《Colorization using optimization》[J] In: SIGGRAPH
  3. 《Bilateral filtering for gray and color images》[C] ICCV
  4. 《Digital photography with flash and no-flash image pairs》[J] In: SIGGRAPH
  5. 《On the origin of the bilateral filter and ways to improve it》[J] IEEE
  6. http://www.cnblogs.com/easymind223/archive/2012/11/13/2768680.html
  7. http://blog.csdn.net/zwlq1314521/article/details/51007943
  8. http://blog.csdn.net/baimafujinji/article/details/74750283
  9. http://blog.csdn.net/pi9nc/article/details/26592377
  10. http://blog.csdn.net/lg1259156776/article/details/51815825

guided Filter--引导滤波算法原理及实现相关推荐

  1. 一阶RC低通滤波算法原理与实现

    文章目录 1. 一阶低通滤波算法原理 2. 一阶滤波算法的特点 3. 基本算法的例程 4. 优化:减少乘.除的运算次数以提高运算速度 5. 改进:动态调整滤波系数 动态调整滤波例程 本文整理自网络,参 ...

  2. Kalman滤波算法原理(Matlab/C/C++)

    仪器的观测存在较大的随机误差,因此会出现极端异常观测值.为此,本研究采用Kalman滤波对观测进行最佳估计,进而对时序数据进行降维处理.Kalman滤波是R. E. Kalman[1, 2]提出的一种 ...

  3. 引导滤波算法理论及公式的推导

    高斯滤波考虑了像素间的距离关系,会模糊边缘: 双边滤波同时考虑了像素间的距离关系以及相似度关系,对于边缘有一定的保护(边缘同侧相速度高).引导滤波同样是保边滤波,由于直接判断梯度,细节的保护上比双边滤 ...

  4. 点云引导滤波算法实现

    引导滤波假设点云经过一个线性变换,具有很好的保留边缘信息功能. 参考文献:韩先锋博士学位论文<三维点云去噪处理及特征描述的研究> 伪代码: 代码是这样的 #include <iost ...

  5. 引导滤波guideFilter原理推导与实验

    转载至: https://zhuanlan.zhihu.com/p/98368439 https://zhuanlan.zhihu.com/p/161666126 论文原文 Kaiming He, J ...

  6. 卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用

    文章目录 卡尔曼滤波 一.滤波效果展示 二.简介 三.组成 1. 预测状态方程 (1)目的: (2)方程: (3)备注 2. 预测协方差方程 (1)目的 (2)方程 (3)备注 3. 卡尔曼增益方程 ...

  7. LMS 自适应滤波算法原理和实现(不使用自带函数库)

    1.基本原理 y(n)=x(n)wTe(n)=d(n)−y(n)w(n+1)=w(n)+μe(n)x(n)\begin{aligned} &y(n)=\pmb{x}(n)\pmb{w}^T\\ ...

  8. 图像保边滤波算法集锦系列

    在美颜算法的实现中,如何既能把人脸皮肤磨得光滑,雀斑磨得干净,又能保留五官的自然清晰,这就需要一种能保留边缘信息的平滑滤波器,这种滤波器的好坏在一定程度上,也就影响了美颜磨皮效果的好坏,对此,本人将在 ...

  9. Bilateral Filters(双边滤波算法)原理及实现(一)

    双边滤波算法原理 双边滤波是一种非线性滤波器,它可以达到保持边缘.降噪平滑的效果.和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高 ...

  10. Guided image filtering(引导滤波)

    摘要   本文提出了一种新的显式图像滤波引导滤波器.引导滤波器从局部线性模型中导出,通过考虑引导图像的内容(可以是输入图像本身,也可以是另一个不同的图像)来生成滤波输出图像.那个引导滤波器可以像流行的 ...

最新文章

  1. JS判断数组里面是否包含指定的数
  2. 基于matlab_simulink的捷联惯性导航系统仿真,基于MATLAB/Simulink的捷联惯性导航系统仿真...
  3. z变换的零极点图matlab,实验三 Z变换零极点分布及部分分式展开的MATLAB实现.doc...
  4. oracle12c双机热备方案,Oracle 共享磁盘阵列 双机热备 实战 配置教程 配置手册
  5. Alexa与小娜结盟,智能语音助手该呼朋引伴还是独自前行?
  6. LaTeX TikZ绘图——组合数学中棋盘多项式的画法
  7. Android系统联系人全特效实现(下),字母表快速滚动
  8. 启动hadoop输入jps显示:程序 ‘jps‘ 已包含在下列软件包中: * openjdk-7-jdk * openjdk-6-jdk 请尝试:sudo apt-get install ~
  9. 基于tensorflow框架训练超像素subpixel模型
  10. 简书python_python实现简书点赞
  11. PhpStorm连接docker容器内的php XDebug进行断点调试
  12. ecmall商品列表页排序的完美解决方案
  13. C++ 上用 ONNXruntime 部署自己的模型
  14. (XWZ)的python学习笔记Ⅳ——错误、调试和测试
  15. 七、CICSO设备 路由器
  16. 2年前端 杭州 面试 集合 面经 前端
  17. Win10桌面壁纸、锁屏壁纸保存位置
  18. 【UOJ455】【UER #8】雪灾与外卖
  19. layui数据表格中包含图片的处理方式
  20. Mysql数据库报错:Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DY

热门文章

  1. MySQL中int(11)最大长度是多少?
  2. 响应式网站设计 - 最佳实践
  3. 用JavaScript添加选择按钮的背景颜色和juqery添加选择按钮的背景色
  4. Entity Framework 6+ 连接Mysql
  5. easyicon-----一个非常好用的找图标的网站
  6. php中explode与split的区别
  7. 【IDEA】报错:Warning:java: 源值1.5已过时, 将在未来所有发行版中删除
  8. Oracle中 如何用一个表的数据更新另一个表中的数据(含表备份)
  9. NPOI实现对Excel的全面操作
  10. golang.是用类axios.js的api请求http接口,支持proxy