BM3D 算法原理详细解析 按过程步骤讲解(附C++实现代码)[通俗易懂]

BM3D 算法原理详细解析 按过程步骤讲解(附C++实现代码)[通俗易懂]BM3D是2007年提出的算法了,至今已经有一些年头了,但是仍然不妨碍它基本上还是最强的去噪算法。在初步了解了BM3D的算法后,会发现,BM3D有种堆叠怪的嫌疑。有很多不同的算法的影子在里面,比如Non-LocalMeans、Waveletshrinkage等。我感觉思想更像是暴力出奇迹吧。但是架不住效果好。就类似现在的神经网络,一层不行我就来两层。但是相比简单的堆叠,BM3D还是比其他的算法的细节保留上要好一些。好了,不废话了,下面直接来看BM3D的算法原理吧。BM3D算法原理:

大家好,又见面了,我是你们的朋友全栈君。

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

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

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

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

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

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

BM3D算法原理:

BM3D 算法原理详细解析 按过程步骤讲解(附C++实现代码)[通俗易懂]

                                                              (原理图)

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的大小不同)。

                                     BM3D 算法原理详细解析 按过程步骤讲解(附C++实现代码)[通俗易懂]

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

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

BM3D 算法原理详细解析 按过程步骤讲解(附C++实现代码)[通俗易懂]

        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计算等。

实验结果:

BM3D 算法原理详细解析 按过程步骤讲解(附C++实现代码)[通俗易懂]

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

         在实验中发现S2会恢复出更多的图像细节部分,提高去噪性能。BM3D 算法原理详细解析 按过程步骤讲解(附C++实现代码)[通俗易懂]

 

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140877.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Windows服务器IIS搭建网站

    Windows服务器IIS搭建网站概述:以下总结了学习IIS搭建网站的方法,先从基本使用IIS搭建网站,到本地使用域名访问网站,再配置路由器实现外网IP访问内网网站,以及使用动态域名外网访问内网网站,最后配置不同域名(IIS也叫主机名),相同IP,相同端口(80)的不同的网站的访问(注意域名不备案外网无法访问)!即输入以下域名可以访问相同端口(80)但不同的网站:127.0.0.1/test1——>www.g…

    2022年5月20日
    134
  • json到底是什么(c# json)

    >如果点进来的刚巧是个高手,那……你就当是过来做个鉴定的吧。很多从事数据分析工作的伙伴都是从“最简单”的神器—Excel开始入门的,对编程语言、计算机世界的很多工具都不甚了解。要做结构化的数据,就赶紧跑去自学sql,学习sqlserver或是mysql数据库。要做半结构化、非结构化的数据又得去学习诸如mongo数据库的东西。>天天听对面的程序员小哥说我给你个打包个j…

    2022年4月16日
    47
  • pytorch的安装及其在pycharm中的使用「建议收藏」

    pytorch的安装及其在pycharm中的使用「建议收藏」1.首先配置Anaconda虚拟环境在AnacondaPrompt中输入condacreate-npytorchpython==3.72.在该环境中安装pytorch因为前面已经安装了cuda10.0.130和cudnn,安装与之匹配的pytorch版本,官网中寻找,但是官网的貌似不太对,最后看的是这个回答pipinstalltorch==1.2.0torchvision==0.4.0-fhttps://download.pytorch.org/whl/torch_stab

    2022年8月25日
    4
  • goland2021激活码(注册激活)

    (goland2021激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~3Y…

    2022年3月30日
    1.3K
  • T检验三种方法的区分

    T检验三种方法的区分之前的文章中SPSSAU已经给大家详细地介绍了方差分析,之后收到的一些反馈以及日常的答疑中,我们发现关于T检验三种方法的区分还有很多小伙伴搞不清楚,下面就结合着具体案例详细聊聊T检验的那点事。01.概念T检验是通过比较不同数据的均值,研究两组数据之间是否存在显著差异。02.分类不同的T检验方法适用于不同的分析场景,具体的分类如下:03….

    2022年6月19日
    30
  • vs2010 产品密钥[通俗易懂]

    vs2010 产品密钥[通俗易懂]YCFHQ9DWCYDKV88T2TMHG7BHP转载于:https://www.cnblogs.com/qiwu1314/p/8466855.html

    2022年5月3日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号