引导滤波

引导滤波是由何凯明等人与2010年提出,它本质上具有O(N)复杂度,相对于双边滤波有更好的边缘保持特性,且不会出现梯度反转现象。在不同引导图像的引导下,可广泛应用于降噪、去雾、高动态范围压缩等。
该方法基于局部线性模型:

代码实现

0、伪代码
1、MATLAB代码
见参考资料【2】
2、C++实现
template<class T, class K>
void CImageObj::BoxFilter(K** src, T** dst, int r)
{int w = 2 * r + 1;int pixCount = w * w;int nx = m_width;int ny = m_height;int i, j, m, n;for (i = 0; i < ny; ++i){for (j = 0; j < nx; ++j){int k = 0;double sum = 0.0;for (m = i - r; m <= i + r; ++m){for (n = j - r; n <= j + r; ++n){if (m < 0 || m >= ny) { k++; continue; }if (n < 0 || n >= nx) { k++; continue; }sum += src[m][n];}}  // 一次窗口滤波dst[i][j] = sum / (pixCount - k);}  }
}void CImageObj::GIF(uchar** guidenceImg, int radius, double eps)
{if (guidenceImg == nullptr || *guidenceImg == nullptr)return;int cx = m_width;int cy = m_height;int wndsize = 2 * radius + 1;int pixcount = wndsize * wndsize;double** a = NewDoubleMatrix(cx, cy);double** b = NewDoubleMatrix(cx, cy);double** mean_a = NewDoubleMatrix(cx, cy);double** mean_b = NewDoubleMatrix(cx, cy);int i, j, m, n;for (i = 0; i < cy; ++i)for (j = 0; j < cx; ++j){int k = 0;double sum_I = 0.0; double sum_p = 0.0;for (m = i - radius; m <= i + radius; ++m)for (n = j - radius; n <= j + radius; ++n){if (m < 0 || m >= cy) { k++; continue; }if (n < 0 || n >= cx) { k++; continue; }sum_I += guidenceImg[m][n] / 255.0;sum_p += m_imgData[m][n] / 255.0;}double mean_I = sum_I / (pixcount - k);double mean_p = sum_p / (pixcount - k);k = 0;double sum_Ip = 0.0;double sum_var_I = 0.0;for (m = i - radius; m <= i + radius; ++m)for (n = j - radius; n <= j + radius; ++n){if (m < 0 || m >= cy) { k++; continue; }if (n < 0 || n >= cx) { k++; continue; }sum_Ip += (m_imgData[m][n] / 255.0) * (guidenceImg[m][n] / 255.0);sum_var_I += (guidenceImg[m][n] / 255.0 - mean_I) * (guidenceImg[m][n] / 255.0 - mean_I);}a[i][j] = (sum_Ip / (pixcount - k) - mean_I * mean_p) / (sum_var_I / (pixcount - k) + eps);b[i][j] = mean_p - a[i][j] * mean_I;}BoxFilter(a, mean_a, radius);BoxFilter(b, mean_b, radius);for (i = 0; i < cy; ++i)for (j = 0; j < cx; ++j){double tmp = 255 * (mean_a[i][j] * guidenceImg[i][j] / 255.0 + mean_b[i][j]);tmp = tmp > 255.0 ? 255.0 : tmp;tmp = tmp < 0.0 ? 0.0 : tmp;m_imgData[i][j] = (uchar)tmp;}UpdateImage();DeleteDoubleMatrix(a, cx, cy);DeleteDoubleMatrix(b, cx, cy);DeleteDoubleMatrix(mean_a, cx, cy);DeleteDoubleMatrix(mean_b, cx, cy);
}

参考资料

[1] Guided Image Filtering, by Kaiming He, Jian Sun, and Xiaoou Tang, in TPAMI 2013.
[2] Guided Image Filtering

引导滤波(guided image filtering)原理及C++实现相关推荐

  1. 引导滤波(guided filter)理解和代码实现

    最近在学习图片的滤波和去噪的相关知识,查阅了一些资料参考了一些博客,这里做一个整合+理解.参考的博客资料在文末. 引入普通滤波的概念 假设输入图像为p,滤波窗口为wk,经过滤波后的输出图像为q,那么q ...

  2. 2019 DGF(深度引导滤波网络) 相关的论文笔记

    文章目录 *Fast End-to-End Trainable Guided Filter* *KeyPoint* *overview* *keywords* *extends* 摘要 引言 相关工作 ...

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

    引导图滤波器是一种自适应权重滤波器,能够在平滑图像的同时起到保持边界的作用,具体公式推导请查阅原文献<Guided Image Filtering>以及matlab源码:Guided Im ...

  4. 引导滤波matlab代码实现,引导图滤波(Guided Image Filtering)原理以及OpenCV实现

    引导图滤波器是一种自适应权重滤波器,能够在平滑图像的同时起到保持边界的作用,具体公式推导请查阅原文献<Guided Image Filtering>以及matlab源码:http://ka ...

  5. 引导图像滤波(Guided Image Filtering)

    [Paper] Guided Image Filtering(2013) 引导图像滤波 摘要--在本文中,我们提出了一种新的显式图像滤波器,称为引导滤波器.从局部线性模型导出,引导滤波器通过考虑引导图 ...

  6. Guided image filtering(引导滤波)

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

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

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

  8. 导向滤波(guided Image Filtering)

    最近两天看了何凯明大神的导向滤波器(Guided Image Filtering),刚刚才顿悟整篇文章的核心.本文只针对于I=pI=pI=p的情况,即对图像III进行滤波处理.个人认为导向滤波器其实就 ...

  9. [PAMI2013] Guided Image Filtering 导向滤波器以及OpenCV-Python代码实现

    论文地址:https://www.researchgate.net/profile/Xiaoou_Tang/publication/236228168_Guided_Image_Filtering/l ...

最新文章

  1. 图像识别:能在商业中如何运用
  2. 用JS脚本进行页面元素控制
  3. MVC4学习笔记(二)- MVC设计实例,5分钟内完成你的Mvc项目
  4. 知乎基于Kubernetes的kafka平台的设计和实现
  5. .bashrc和.vimrc以及一些比较有用的linux命令
  6. 建立集群间ssh信任关系
  7. Linux 上网配置 修改IP
  8. System.IO.Pipelines: .NET高性能IO
  9. CV Code | 计算机视觉开源周报 20190505期
  10. 双向链表示意图_java双向链表示意图
  11. 网联兴,银联苦:一文看清支付清算市场新局面的矛盾和疑惑
  12. 度中心性(degree)、接近中心性(closeness)和中介中心性(betweenness)的理解
  13. Python项目:结合Django和爬虫开发小说网站,免安装,无广告
  14. java int 运算符,java中各种运算符
  15. 怎么把磁盘合并成一个?两个硬盘分区合并,如何硬盘分区合并
  16. 【转】94个比付费软件更好的免费软件
  17. Windows 关闭 简繁体切换Ctrl+Shift+F
  18. python渲染光线_Python光线追踪
  19. 如何区分b ,B,KB,MB,GB?
  20. 第6章 详细设计(软件工程导论 第6版)

热门文章

  1. 仿微信查看图片、H5的图片轮播插件PhotoSwipe、SuperSlide
  2. 解决:windows10网络图标被重名名为Network
  3. 灰度共生矩阵(GLCM)的概念及其相关特征
  4. c语言实现补码(负数)转换成原码
  5. linux socat 命令,socat在Linux下的使用
  6. Asky极简教程:零基础1小时学编程,已更新前8节
  7. 【ROE】(2)ROE协议
  8. 安卓模拟器右边的虚拟键盘消失了,怎样调出来
  9. 一刀工具箱 - 网站端口检测工具
  10. linux面板切换快捷键,Fedora 25 Gnome常用快捷键、快捷操作