在图像滤波中,人们最希望的就是可以将图像中的噪声过滤掉的同时,能够让边缘尽可能的保持。噪声属于高频信号,而边缘其实也是一种高频信号,所以一般的滤波器,比如高斯模糊,均值模糊,都是一种低通滤波器,能够将高频信号做平滑处理,这些kernel在将噪声滤掉的同时,也会将边缘模糊掉,所以保边滤波器的设计一直是图像滤波的重点。

导向滤波是非常有名的一种保边滤波器,与传统的高斯滤波,均值滤波独立于图像的内容不同,导向滤波的 kernel 基于一个 guided image, 简单来说,就是给定一个 guided image I, 一个 input image p, 我们能够得到一个 output image q .

qi=∑jWijpj

i,j 表示像素的索引,Wij 是一个滤波系数,由 guided image I 决定,而与输入图像 p 无关。双边滤波器就是类似这样的一种滤波器,我们可以定义:

Wbfij(I)=1Kiexp(−|xi−xj|2σ2s)exp(−|Ii−Ij|2σ2r)

当 I 和 p 一样的时候,上式就是最原始的双边滤波器的表达式,xi,xj 表示像素的坐标,Ki 是一个归一化的系数,σs 控制像素空间的相似性, σr 控制像素值的相似性。

接下来,我们可以定义导向滤波器以及它的核函数,具体的定义形式如下:

qi=akIi+bk,∀i∈wk

这个表达式意味着,在一个局部区域 wk,导向分量 Ii 和输出 qi 是层线性关系的,

上式保证 了 ▽q=a▽I,意味着输出 q 和 导向图 I 具有同样的边界性质,

为了求解线性系数 ak,bk, 我们可以定义如下的能量函数:

E(ak,bk)=∑i∈wk((akIi+bk−pi)2+ϵa2k)

一般来说,ϵa2k 是一个正则项,以防止 ak 太大,最后利用线性回归,我们可以得到:

ak=1|w|∑i∈wkIipi−μkpk¯σ2k+ϵ
bk=pk¯−akμk

μk,σ2k 是导向图 I 在一个局部区域 wk 的均值和方差,|w| 是局部区域的像素个数,pk¯=1|w|∑i∈wkpi 是输入图 p 在局部区域的均值。

我们可以把这个线性模型应用到整张图像的所有局部区域,但是,由于一个像素点 i 可以同时属于很多不同的局部区域,而且每个局部区域计算出来的 qi 是不一样的,一个简单有效的方法,就是对含有像素点 i 的所有局部区域计算一个 线性模型,然后取平均值:

qi=1|w|∑k:i∈wk(akIi+bk)=ai¯Ii+bi¯
ai¯=1|w|∑k∈wiak
bi¯=1|w|∑k∈wibk

最后奉上代码:

  1. function q = guidedfilter(I, p, r, eps)
  2. % GUIDEDFILTER O(1) time implementation of guided filter.
  3. %
  4. % - guidance image: I (should be a gray-scale/single channel image)
  5. % - filtering input image: p (should be a gray-scale/single channel image)
  6. % - local window radius: r
  7. % - regularization parameter: eps
  8. [hei, wid] = size(I);
  9. N = boxfilter(ones(hei, wid), r); % the size of each local patch; N=(2r+1)^2 except for boundary pixels.
  10. mean_I = boxfilter(I, r) ./ N;
  11. mean_p = boxfilter(p, r) ./ N;
  12. mean_Ip = boxfilter(I.*p, r) ./ N;
  13. cov_Ip = mean_Ip - mean_I .* mean_p; % this is the covariance of (I, p) in each local patch.
  14. mean_II = boxfilter(I.*I, r) ./ N;
  15. var_I = mean_II - mean_I .* mean_I;
  16. a = cov_Ip ./ (var_I + eps); % Eqn. (5) in the paper;
  17. b = mean_p - a .* mean_I; % Eqn. (6) in the paper;
  18. mean_a = boxfilter(a, r) ./ N;
  19. mean_b = boxfilter(b, r) ./ N;
  20. q = mean_a .* I + mean_b; % Eqn. (8) in the paper;
  21. end
  22. function imDst = boxfilter(imSrc, r)
  23. % BOXFILTER O(1) time box filtering using cumulative sum
  24. %
  25. % - Definition imDst(x, y)=sum(sum(imSrc(x-r:x+r,y-r:y+r)));
  26. % - Running time independent of r;
  27. % - Equivalent to the function: colfilt(imSrc, [2*r+1, 2*r+1], 'sliding', @sum);
  28. % - But much faster.
  29. [hei, wid] = size(imSrc);
  30. imDst = zeros(size(imSrc));
  31. %cumulative sum over Y axis
  32. imCum = cumsum(imSrc, 1);
  33. %difference over Y axis
  34. imDst(1:r+1, :) = imCum(1+r:2*r+1, :);
  35. imDst(r+2:hei-r, :) = imCum(2*r+2:hei, :) - imCum(1:hei-2*r-1, :);
  36. imDst(hei-r+1:hei, :) = repmat(imCum(hei, :), [r, 1]) - imCum(hei-2*r:hei-r-1, :);
  37. %cumulative sum over X axis
  38. imCum = cumsum(imDst, 2);
  39. %difference over Y axis
  40. imDst(:, 1:r+1) = imCum(:, 1+r:2*r+1);
  41. imDst(:, r+2:wid-r) = imCum(:, 2*r+2:wid) - imCum(:, 1:wid-2*r-1);
  42. imDst(:, wid-r+1:wid) = repmat(imCum(:, wid), [1, r]) - imCum(:, wid-2*r:wid-r-1);
  43. end

可以看到,guided image filtering 的代码实现还是很简单的,就是基于box filter。

Guided Image Filtering的更多相关文章

  1. 引导图滤波(Guided Image Filtering)原理以及OpenCV实现

    引导图是一种自适应权重滤波器,能够在平滑图像的同时起到保持边界的作用,具体公式推导请查阅原文献<Guided Image Filtering>.这里只说一下自适应权重原理.C++实现灰度图 ...

  2. Gradient Domain Guided Image Filtering(梯度域导向滤波)

    作者提出了一种新的梯度域引导图像滤波器,通过将明确的一阶边缘感知约束结合到现有的引导图像滤波器中. matlab代码实现 转载至:https://blog.csdn.net/majinlei121/a ...

  3. 基于暗通道优先算法的去雾应用(Matlab/C++)

    基于暗通道优先的单幅图像去雾算法(Matlab/C++) 算法原理:             参见论文:Single Image Haze Removal Using Dark Channel Pri ...

  4. 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)

    最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道< ...

  5. {ICIP2014}{收录论文列表}

    This article come from HEREARS-L1: Learning Tuesday 10:30–12:30; Oral Session; Room: Leonard de Vinc ...

  6. paper 105: 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他

    在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者 ...

  7. 计算机视觉与模式识别代码合集第二版one

    Topic Name Reference code Feature Detection, Feature Extraction, and Action Recognition Space-Time I ...

  8. Single Image Haze Removal Using Dark Channel Prior

    <Single Image Haze Removal Using Dark Channel Prior>一文中图像去雾算法的原理.实现.效果及其他. Posted on 2013-08-2 ...

  9. CV code references

    转:http://www.sigvc.org/bbs/thread-72-1-1.html 一.特征提取Feature Extraction:   SIFT [1] [Demo program][SI ...

随机推荐

  1. codeforces 351 div2 C. Bear and Colors 暴力

    C. Bear and Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. c语言 快速排序

    #include<stdio.h> #include<stdlib.h> #define BUF_SIZE 10 void display(int array[], int m ...

  3. MongoDB(课时26 聚合(取的集合个数))

    3.7 聚合(重点) 信息的统计操作就是聚合(直白:分组统计就是一种聚合操作). 3.7.1 取的集合的数据量 对于集合的数据量而言,在MongoDB里面直接使用count()函数就可以完成. 范例: ...

  4. Git工作区、暂存区和版本库

    基本概念 我们先来理解下Git 工作区.暂存区和版本库概念 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫stage, 或index.一般存放在 ".git目录下" 下的in ...

  5. Java实现日历小程序【代码】

    这个没啥难点的,主要是界面设计吧 界面就是这个样子 运行时请在src同目录下放上我女神的照片 -----------------------------------代码如下-------------- ...

  6. WPF PasswordBox.Password 的数据绑定

    WPF的PasswordBox控件的Password属性不是依赖属性,无法直接进行数据绑定,为使其在MVVM模式中正常使用,可以为PasswordBox增加一个助手类,代码如下: 注:代码摘自:htt ...

  7. English trip -- VC(情景课)9 A Get ready

    She is doing homwork He is doing laundry He is drying the dishes She is making lunch She is making t ...

  8. 快速排序的C++版

    int Partition(int a[], int low, int high) { int x = a[high];//将输入数组的最后一个数作为主元,用它来对数组进行划分 int i = low ...

  9. HDU1789时间贪心

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  10. SQL语句增加列、修改列类型、修改列、删除列

    1.增加列: alter table tableName add columnName varchar(30) 2.修改列类型: alter table tableName alter column ...