论文阅读:Guided Image Filtering, ECCV2010

来源:互联网 发布:金十数据开发者 编辑:程序博客网 时间:2024/05/23 21:05


Paper: Guided Image Filtering, ECCV2010

http://research.microsoft.com/en-us/um/people/kahe/eccv10/index.html

 

Guided Image filter是一种边缘保持的平滑滤波算法。与双边滤波相比,它不仅具有边缘保持、非迭代的特点,还能保持梯度、并且计算复杂度与滤波半径无关等优点。


经典的双边滤波算法如下图:

滤波权重系数由两部分组成:反应空间位置关系的高斯函数,反应邻域颜色差异的高斯函数。它具有edge preservation的优点,但算法计算复杂度O(r*r).


Guided filter原理如下,其中两张输入图像(pI)可以相同,也可以不同:


guided filter表达成类似于双边滤波的形式,如下图:


可以看出,滤波权重系数Wij完全由guided image 决定,找到所有同时包含像素ij的局部窗口,计算每个窗口像素的平均值和方差,然后利用上述公式计算系数。邻域像素权重系数的直观可视化如下图:




具体实现可参照作者的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.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可采用类似于快速积分图的方法,算法复杂度为O(1):

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 axisimCum = cumsum(imSrc, 1);%difference over Y axisimDst(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 axisimCum = cumsum(imDst, 2);%difference over Y axisimDst(:, 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



0 0
原创粉丝点击