最近开始学习在Denoise方面的内容,在这方面比较重要的传统算法当然是BM3D这种到目前比较fancy的,效果也是目前最好的算法。但是BM3D的一个致命缺点就是速度很慢,所以BM3D我们以后再说吧,我们先讲一下BM3D算法中的基础,Non Local Mean算法。

总所周知,很多的简单的降噪算法,都是单Kernel的,例如,均值滤波、中值滤波等,都是使用一个固定的Kernel对图像进行一个滤波操作。这种算法被称之为 局部算法。因为操作都是仅局限于Kernel内的。

而Non Local Mean算法是非局部的。但是我觉得在具体实现上,NLM也应该是local的,但是Non local ≠ global嘛,所以可以理解。

NLM的算法思想是通过利用图片中的所有信息,来对图像像素进行某种确定方式的相似度加权平均。

NLM通过在图像块中进行搜索,通过计算滑动窗口与指定窗口的欧氏距离,从而它们之间的相似程度,从而确定加权平均的值,进行滤波操作。

NLM 算法的过程可以用以下公式表示:

w(i,j)表示加权平均的kernel值。该值由两个块之间的相似度确定,而两个块之间的相似度则通过计算它们之间的欧式距离确定。但是,我们都知道,在一张图片中,每一个像素点,总是距离它越近的像素点与它本身的相似度越大,而距离越远,那么相似度就越小。在NLM中,算法假设权重的分布符合高斯分布

具体的算法表示可以看下图。

具体的算法过程如下:

1、图像的每一个像素CenterPoint都和周围的像素组成一个大小为BXB图像块Block

2、以CenterPoint为中心,确定一个大小为SXS的SearchWindow,该SearchWindows要比Block大

3、在SearchWindows中,以一个大小同为BXB的SearchBlock的搜索块进行滑动。

4、计算SearchBlock和Block之间的欧式距离Distance。

5、根据高斯分布和Distance确定相似度,确定平均加权的值

算法过程如下动图所示:

(Non local mean算法计算过程图)

而后Distance = L1(Block-SearchBlock)

从而可以计算出加权平均值。

但是,NLM在实现上的一个弊端就是三层循环的嵌套,这样使得该算法的时间复杂度十分高。

在实现上,我们可以通过积分图来对算法过程进行一个加速。

积分图优化

接下来,我们来看一下使用积分图进行加速的trick应该如何实现。

首先,我们要明确的一个点在于,其实欧式距离的计算,为:

可以转化为:

在确定了这一点后,我们就可以将积分图应用在NLM上。

首先,我们来看积分图的原理:

假设我们要求的Area的像素和,我们可以使用一个两层嵌套循环遍历元素进行相加,但是我们也可以像动图这样,使用一个面积法的操作,来求出Area。

根据上述动图可以看到,Area = S1-S2-S3+S4,而Area正好可以视为我们所需要的sum(Block)。

而积分图上的每一个像素值都是自身坐标(X,Y)到(0,0)之间的所有像素值的和(如S1、S2,S3、S4),我们只需要提前计算出积分图,便可以将的复杂多次求和操作变成一次加减法,从而降低了计算的复杂度。

通过代码的实验,可以看到使用了积分图加速的NLM算法比原来的算法提升了数倍。

C++实现代码在这里!点我点我!

NML(Non-Local Mean)非局部平均算法 完全解析与积分图加速 (附代码)相关推荐

  1. python opencv 彩色图非局部平均去噪

    python opencv 彩色图非局部平均去噪 代码: import cv2 import numpy as np # 灰度图像去噪 def MeansDenoising(img,N,h,templ ...

  2. python opencv 灰度图非局部平均去噪

    python opencv 灰度图非局部平均去噪 代码: import cv2 import numpy as np # 灰度图像去噪 def MeansDenoising(img,h,templat ...

  3. 基于粒子群算法优化的Elman神经网络数据预测-附代码

    基于粒子群算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于粒子群算法优化的Elman神经网络数据预测 - 附代码 1.Elman 神经网络结构 2.Elman 神经用络学习过程 3.电 ...

  4. 基于布谷鸟算法优化的Elman神经网络数据预测-附代码

    基于布谷鸟算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于布谷鸟算法优化的Elman神经网络数据预测 - 附代码 1.Elman 神经网络结构 2.Elman 神经用络学习过程 3.电 ...

  5. 基于鲸鱼算法优化的Elman神经网络数据预测-附代码

    基于鲸鱼算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于鲸鱼算法优化的Elman神经网络数据预测 - 附代码 1.Elman 神经网络结构 2.Elman 神经用络学习过程 3.电力负 ...

  6. 基于海鸥算法优化的Elman神经网络数据预测-附代码

    基于海鸥算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于海鸥算法优化的Elman神经网络数据预测 - 附代码 1.Elman 神经网络结构 2.Elman 神经用络学习过程 3.电力负 ...

  7. ros navigation 局部路径算法dwa解析(一)

    继ros里面A*全局规划之后,再解析局部路径算法dwa的整个算法调用过程,至于细节放到后面的章节去写 dwa的整体思路网上有很多相关的资料了 https://blog.csdn.net/heyijia ...

  8. 送你一份使用k近邻算法实现回归的实用指南(附代码、链接)

    作者:AISHWARYA SINGH, AUGUST 22, 2018 翻译:赵雪尧 校对:张玲 本文约4200字,建议阅读10分钟. 本文解释了在k近邻算法工作原理的基础上,简单介绍三种计算点距离方 ...

  9. PID算法实现及参数整定图解(附代码)

    一. PID含义 PID是英文单词比例(Proportion),积分(Integral),微分(Differential coefficient)的缩写.PID调节实际上是由比例.积分.微分三种调节方 ...

最新文章

  1. 双系统XP和ubuntu,升级ubuntu出现no such device grub rescue
  2. 5_1 大理石在哪儿(UVa10474)排序与查找
  3. 时间选择插件ClockPicker
  4. css多行文本溢出显示省略号(…)
  5. 鸿蒙不如安卓PPT,被吐槽为PPT、“哄蒙”、安卓套壳,华为鸿蒙一路走来真不容易...
  6. jQuery 图片滚动 Carousel Lite 使用说明
  7. jave类命名_Java重命名文件– Jave移动文件
  8. 敏感词过滤算法:前缀树算法
  9. 2018/06/30这段时间的随笔记忆:遇到概念模糊的js问题
  10. iframe src 不加载页面_iframe和frame的区别是什么?iframe和frame的区别总结
  11. OpenGL超级宝典(第7版)之VS2019使用sb7框架搭建自己的程序
  12. 官宣:微信可以转账到QQ上了。微信今日新增全新表情包
  13. windows游戏编程大师技巧光盘
  14. 如何开启刷题,蓝桥杯练习系统
  15. 在线购物系统——设计类
  16. VB6下的BitMap示例:模拟雨点程序
  17. JAVA郑财校园新闻管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  18. 关于我开始使用博客的这件事
  19. Java毕设项目-OA办公系统
  20. 机器视觉光源选型总结---颜色选择

热门文章

  1. 数学笔记8——最值问题
  2. 用Processing实现北京地铁的一天动态可视化
  3. R语言与数据分析练习:选择适当模型拟合某股票连续若干天的收盘价序列的发展
  4. 聊一聊web worker
  5. 社会观念亟待扭转 不可忽视劳动和劳动者的价值
  6. jsPlumb.draggable()设置id时所遇问题
  7. linux 查看samtools版本,Samtools版本更新
  8. makefile中的 -O -O2选项含义
  9. (28)FPGA实现AD7768接口(七)
  10. 教程篇(7.2) 14. Fortinet单点登录 FortiGate基础设施 ❀ Fortinet网络安全专家 NSE4