Guided Image Filtering
在图像滤波中,人们最希望的就是可以将图像中的噪声过滤掉的同时,能够让边缘尽可能的保持。噪声属于高频信号,而边缘其实也是一种高频信号,所以一般的滤波器,比如高斯模糊,均值模糊,都是一种低通滤波器,能够将高频信号做平滑处理,这些kernel在将噪声滤掉的同时,也会将边缘模糊掉,所以保边滤波器的设计一直是图像滤波的重点。
导向滤波是非常有名的一种保边滤波器,与传统的高斯滤波,均值滤波独立于图像的内容不同,导向滤波的 kernel 基于一个 guided image, 简单来说,就是给定一个 guided image II, 一个 input image pp, 我们能够得到一个 output image qq .
q_{i} = \sum_{j} W_{ij} p_{j}
i,ji, j 表示像素的索引,WijW_{ij} 是一个滤波系数,由 guided image II 决定,而与输入图像 pp 无关。双边滤波器就是类似这样的一种滤波器,我们可以定义:
W_{ij}^{bf}(I) = \frac{1}{K_{i}}exp(-\frac{|x_{i}-x_{j}|^2}{\sigma_{s}^{2}}) exp(-\frac{|I_{i}-I_{j}|^2}{\sigma_{r}^{2}})
当 II 和 pp 一样的时候,上式就是最原始的双边滤波器的表达式,xi,xjx_{i}, x_{j} 表示像素的坐标,KiK_{i} 是一个归一化的系数,σs\sigma_{s} 控制像素空间的相似性, σr\sigma_{r} 控制像素值的相似性。
接下来,我们可以定义导向滤波器以及它的核函数,具体的定义形式如下:
q_{i} = a_{k}I_{i} + b_{k}, \forall i \in w_{k}
这个表达式意味着,在一个局部区域 wkw_{k},导向分量 IiI_{i} 和输出 qiq_{i} 是层线性关系的,
上式保证 了 ▽q=a▽I \bigtriangledown q = a \bigtriangledown I,意味着输出 qq 和 导向图 II 具有同样的边界性质,
为了求解线性系数 ak,bka_{k}, b_{k}, 我们可以定义如下的能量函数:
E(a_{k}, b_{k}) = \sum_{i \in w_{k}} ((a_{k}I_{i} + b_{k}-p_{i})^2 + \epsilon a_{k}^2)
一般来说,ϵa2k\epsilon a_{k}^2 是一个正则项,以防止 aka_{k} 太大,最后利用线性回归,我们可以得到:
a_{k} = \frac{\frac{1}{\left | w \right |} \sum_{i \in w_{k}} I_{i}p_{i} - \mu_{k}\bar{p_{k}}}{\sigma_{k}^{2} + \epsilon}
b_{k} = \bar{p_{k}} - a_{k} \mu_{k}
μk,σ2k\mu_{k}, \sigma_{k}^{2} 是导向图 II 在一个局部区域 wkw_{k} 的均值和方差,|w|\left | w \right | 是局部区域的像素个数,pk¯=1|w|∑i∈wkpi \bar{p_{k}} = \frac{1}{\left | w \right |} \sum_{i \in w_{k}} p_{i} 是输入图 pp 在局部区域的均值。
我们可以把这个线性模型应用到整张图像的所有局部区域,但是,由于一个像素点 i i 可以同时属于很多不同的局部区域,而且每个局部区域计算出来的 qiq_{i} 是不一样的,一个简单有效的方法,就是对含有像素点 i i 的所有局部区域计算一个 线性模型,然后取平均值:
q_{i} = \frac{1}{\left | w \right |} \sum_{k: i \in w_{k}} (a_{k}I_{i} + b_{k}) = \bar{a_{i}} I_{i} + \bar{b_{i}}
\bar{a_{i}} = \frac{1}{\left | w \right |} \sum_{k \in w_{i}} a_{k}
\bar{b_{i}} = \frac{1}{\left | w \right |} \sum_{k \in w_{i}} b_{k}
最后奉上代码:
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.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;
endfunction 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
可以看到,guided image filtering 的代码实现还是很简单的,就是基于box filter。
Guided Image Filtering相关推荐
- [PAMI2013] Guided Image Filtering 导向滤波器以及OpenCV-Python代码实现
论文地址:https://www.researchgate.net/profile/Xiaoou_Tang/publication/236228168_Guided_Image_Filtering/l ...
- 导向滤波(guided Image Filtering)
最近两天看了何凯明大神的导向滤波器(Guided Image Filtering),刚刚才顿悟整篇文章的核心.本文只针对于I=pI=pI=p的情况,即对图像III进行滤波处理.个人认为导向滤波器其实就 ...
- 基于guided image filtering的图像去雾 opencv实现
基于guided image filtering的图像去雾 与暗原色图像去雾模型是一个系列的. 暗原色图像去雾模型是cvpr2009 bestpaper,图像去雾效果很好. 即.Kaiming He, ...
- 引导滤波(guided image filtering)原理及C++实现
引导滤波 引导滤波是由何凯明等人与2010年提出,它本质上具有O(N)复杂度,相对于双边滤波有更好的边缘保持特性,且不会出现梯度反转现象.在不同引导图像的引导下,可广泛应用于降噪.去雾.高动态范围压缩 ...
- 引导图滤波(Guided Image Filtering)原理以及OpenCV实现
引导图滤波器是一种自适应权重滤波器,能够在平滑图像的同时起到保持边界的作用,具体公式推导请查阅原文献<Guided Image Filtering>以及matlab源码:Guided Im ...
- 引导图像滤波(Guided Image Filtering)
[Paper] Guided Image Filtering(2013) 引导图像滤波 摘要--在本文中,我们提出了一种新的显式图像滤波器,称为引导滤波器.从局部线性模型导出,引导滤波器通过考虑引导图 ...
- 引导滤波matlab代码实现,引导图滤波(Guided Image Filtering)原理以及OpenCV实现
引导图滤波器是一种自适应权重滤波器,能够在平滑图像的同时起到保持边界的作用,具体公式推导请查阅原文献<Guided Image Filtering>以及matlab源码:http://ka ...
- Guided image filtering(引导滤波)
摘要 本文提出了一种新的显式图像滤波引导滤波器.引导滤波器从局部线性模型中导出,通过考虑引导图像的内容(可以是输入图像本身,也可以是另一个不同的图像)来生成滤波输出图像.那个引导滤波器可以像流行的 ...
- Guided Filter对三维点云降噪
同步更新于github page 文章目录 Guided Filter点云降噪 Results Notes Code References Guided Filter点云降噪 Guided Filte ...
最新文章
- Singleton单例模式
- 详解yarn的resource manager组件
- django 1.8 官方文档翻译:6-5-1 Django中的测试
- Kostya the Sculptor
- mybatis日志能正常打印出正确sql执行语句;数据库有内容;却查询不出来
- 虚拟化学习笔记-虚拟机迁移的分类及原理
- 11.python并发入门(part3 多线程与互斥锁)
- 14.各种所需内存计算
- SAXReader的使用
- 是时候放弃循环神经网络了
- 推荐的前端开源项目CDN加速服务
- 周其仁:到以色列游学,让我深受刺激!
- 渗透沉思录 - 转自亮神
- 云南省增值税发票综合平台(新网址):https://fpdk.yunnan.chinatax.gov.cn/
- c#直接横向打印LocalReport
- 烟台大学CSDN俱乐部参加2012移动开发者大会见闻
- unity 2D游戏开发 制作帧动画的两种方法
- CSU-ACM2017暑假集训比赛1 B - R2D2 and Droid Army
- 决策树及集成模型 python实现
- cadence安装完怎么打开_allegro安装后如何打开