BM3D是2007年提出的算法了,至今已经有一些年头了,但是仍然不妨碍它基本上还是最强的去噪算法。

在初步了解了BM3D的算法后,会发现,BM3D有种堆叠怪的嫌疑。有很多不同的算法的影子在里面,比如Non-Local Means、Wavelet shrinkage等。

我感觉思想更像是暴力出奇迹吧。但是架不住效果好。就类似现在的神经网络,一层不行我就来两层。

但是相比简单的堆叠,BM3D还是比其他的算法的细节保留上要好一些。

(完整代码Github地址在最后)

好了,不废话了,下面直接来看BM3D的算法原理吧。

BM3D算法原理:

(原理图)

BM3D算法主要分两步(按collaborative filtering划分)

Step1:

S1、 在collaborative filtering阶段使用hard threshold

S1.1---grouping:在image中寻找相似块,使用hard threshold定义相似性,进而stack into不同的block;

①与Non-Local Means相似,先寻找出所有的block,并且做初步的2D变换。【1】方便后面的Grouping.

②在SearchWindows中,Grouping所有的Block。(由于边界原因,不同的Group,Group的大小不同)。

(Grouping 过程与Non-Local Means相似,可以设置Stride大小。代码中有另外的加速实现)

③计算block之间的L2 distance,并根据distance的大小顺序进行排列。

S1.2--- collaborative filtering:对每一个相似grouped block做3D线性变换,shrinkage of the transform spectrum,最后在逆变换得到basic estimate block;

①在每一个Group中,我们都有了相似的Block集合。然后进行3D的线性变换。但是由于3D线性变换较为复杂。一般使用一次2D的变换以及第三维度的1D变换进行代替。我这里使用了2D的DCT变换,以及1D的Haar变换。

②在前面S1.1.①中,我们已经对所有的block进行了2D的DCT变换。所以我们直接对每一个Group进行第三维的1D变换即可。到此,完成了一次完整的3D变换。

③Hard Threshold阈值化处理。对3D变换后的Group进行一次硬阈值的控制,将不符合条件的3D转换值直接变为0。

④对Threshold后的Group进行像素值为0的统计,根据0的个数,计算出权重weight。

⑤将所有的Group进行3D逆转换。当然,这里同样使用一次2D逆转换和一次1D逆转换进行代替。我当然是使用了1D的Haar逆转换和2D的IDCT转换。

⑥然后将Group中的所有图片按照权重值aggregate到图像中。

⑦得到Step1的结果图像 image_basic

S1.3---aggregation:因为前面每一个patch在3D block逆变换后对应的多个,经验的做法是直接平均所有的块,但更建议根据得到的patch质量,赋予不同的权值加权平均。不难看出aggregation是一个特殊的平均过程,类似于NNLM方法,利用图片的冗余性恢复含噪图片。

①这一步挺简单的,就是根据前面S1.2.④计算出的权重和一个自定义的kaiser Windows进行叠加即可。如果你想简单一点,直接平均也可,但是效果肯定没那么好。

S2、步骤和S1类似,如下图,不同之处有两点[2]:

S2.1--- grouping  

①保留 Step1 中的噪声图像Group   --  ImageNoiseGroup

②将Step1的结果 image_basic进行grouping   --  ImageBasicGroup

S2.2--- collaborative filtering 

①与Step 1不同,Step 2不适用Hard Threshold,而是采用Wiener Filter。我个人认为这一步的目的是利用维纳滤波的特性,在第一步降噪后的图像的基础上,结合原始图像,恢复图像的一些细节信息。

将ImageNoiseGroup和ImageBasicGroup进行一一对应的维纳滤波,从而恢复一定的图像细节

S2.3---aggregation

①还是一样,结合Kaiser Window进行aggregate。

以上即为BM3D的算法原理。老实说,一一按步骤实现的BM3D的算法,处理速度很慢。比如256*256大小的单通道图像处理时间就高达60s

但是我们可以加上很多别的工程上的处理。例如,积分图、多线程、GPU计算等。

实验结果:

(Gaussian noise Image)                     (Step 1 basic Image)                   (Step 2 Denoise Image)

在实验中发现S2会恢复出更多的图像细节部分,提高去噪性能。

GitHub地址:点我获取完整代码呀~

BM3D 算法原理详细解析 按过程步骤讲解(附C++实现代码)相关推荐

  1. 【机器学习】算法原理详细推导与实现(七):决策树算法

    [机器学习]算法原理详细推导与实现(七):决策树算法 在之前的文章中,对于介绍的分类算法有逻辑回归算法和朴素贝叶斯算法,这类算法都是二分类的分类器,但是往往只实际问题中yyy不仅仅只有{0,1}\{0 ...

  2. 蓝桥杯python省赛冲刺篇2——常用算法的详细解析及对应蓝桥杯真题:打表模拟法、递推递归法、枚举法、贪心算法、差分与前缀和

    注意:加了题目链接 目录 注意:加了题目链接 一.打表模拟法 介绍 1. 算式问题 题目描述 解析与代码演示 2. 求值 题目描述 解析与代码演示 3. 既约分数 题目描述 解析与代码演示 4. 天干 ...

  3. 14_Elasticsearch 内部原理详细解析(上篇)

    本文章收录于[Elasticsearch 系列],将详细的讲解 Elasticsearch 整个大体系,包括但不限于ELK讲解.ES调优.海量数据处理等 一.elasticsearch的写一致性原理 ...

  4. 狄克斯特拉(Dijkstra)算法原理详细解释与实现(python)

    目录 写在前面 1. 简介 2. 原理 2.1 找出最便宜的节点 2.2 计算前往该节点的各个邻居的开销 2.3 重复上面的步骤 实现 总结 写在前面 本文原理摘自<算法图解>这本书. 其 ...

  5. Spark底层原理详细解析(深度好文,建议收藏)

    Spark简介 Apache Spark是用于大规模数据处理的统一分析引擎,基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量硬件之上, ...

  6. Spark底层原理详细解析

    Spark简介 Apache Spark是用于大规模数据处理的统一分析引擎,基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量硬件之上, ...

  7. k均值算法原理详细讲解以及matlab代码实现

    有研究生物电信号处理和机器学习的欢迎加我qq429500506共同交流学习进步. 最近更新文章的频率太低了,主要原因是不想为了发文章而发文章,想潜心研究,写好文章,顺便想说一句开源万岁,最近一个月虽然 ...

  8. tcp中的crc检验算法原理_在数据传输过程中的CRC 算法的简单说明

    CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要用到CRC 算法对各种数据进行校验.因此,掌握基本的CRC算法应是嵌入式程序员的基本技能.可是,我认识的嵌入式程序员 ...

  9. 15_Elasticsearch 内部原理详细解析(下篇)

    本文章收录于[Elasticsearch 系列],将详细的讲解 Elasticsearch 整个大体系,包括但不限于ELK讲解.ES调优.海量数据处理等 目录 一.什么是mapping 二.精确匹配与 ...

  10. 手指和手势识别算法原理和解析

    最近发现了一个挺厉害的人工智能学习网站,内容通俗易懂,风趣幽默,感兴趣的可以点击此链接进行查看:床长人工智能教程 废话不多说,请看正文! 1.问题陈述 我们将从视频序列中识别手势.为了从实时视频序列中 ...

最新文章

  1. html固定table表头的实现思路
  2. python 使用tsfresh进行时间序列特征提取
  3. 实现随着 下拉菜单中 选中值的变化 周边的值也也跟着变化。(使用【 VLOOKUP 】 函数)
  4. Farrago for Mac(强大的现场多音频播放工具)
  5. 手把手教学暴力破解WIFI密码(仅供学习交流)
  6. Leetcode题解助手
  7. 还在为日程安排发愁?是因为你没有使用飞项
  8. JAVA中级(五)response(1)基本介绍,代表响应的类,如何设置响应头,行,体
  9. transformer 模型的decoder部分 带gif动图
  10. Kali linux下拓实N95外置网卡驱动安装教程
  11. 女大学生王婷婷致信给网上春光照女主角
  12. “牵一发而动全身”——我用观察者模式简单模拟吃鸡
  13. 微信小程序:微信商家券的领取
  14. 指针pt的值(pt,pt,*pt)
  15. 计算机二级 word 论文格式,(计算机二级word练习3.doc
  16. 静态成员与静态成员函数
  17. s4800扫描电镜的CSS3_4800 型扫描电镜 简易操作指南
  18. PDF合并软件推荐【绿色免费】
  19. 刀片式服务器与虚拟机,为什么人们在开发虚拟主机时更喜欢刀片服务器?
  20. TDD和FDD之间的区别(详细)

热门文章

  1. 老机器上安装了kubuntu先尝试安装Manjaro但是鼠标按键无法使用彻底解决办法
  2. UML(统一建模语言)
  3. 王者QQ微信都在用的动画神器要开源了:把交付时间缩短90%
  4. html ui在线生成器,漂亮的CSS按钮样式集以及在线生成工具
  5. 傲梅分区助手克隆Linux硬盘,傲梅分区助手复制磁盘或克隆磁盘到另外磁盘
  6. Java Web学习(1):Web应用程序与Web服务器
  7. h5 默认为移动端页面_HTML5默认登录页面
  8. y电容如何选型_安规Y电容设计选型
  9. MMC-HVDC仿真模型,pscad柔性直流输电仿真mmc仿真模型
  10. arm+linux书籍