BM3D 去噪算法原理解析与代码实现
BM3D 去噪算法是来自于这篇论文《Image Denoising by sparse 3-D Transform-Domain Collaboarative Filtering》。原文地址:
https://www.researchgate.net/publication/6151802_Image_Denoising_by_Sparse_3-D_Transform-Domain_Collaborative_Filteringhttps://www.researchgate.net/publication/6151802_Image_Denoising_by_Sparse_3-D_Transform-Domain_Collaborative_Filtering本文主要首先介绍BM3D算法的实现原理,然后会用代码对BM3D进行算法实现,观察BM3D算法的去噪效果。
一 BM3D算法解析
首先先介绍本算法中涉及到的两个基本概念:分组和协同滤波。
(1)分组
首先我们会对输入的噪声图像进行分块。会选取一些参考块,然后在一定范围内搜索待匹配块,计算待匹配块与参考块之间的相似性,根据相似性的多少进行分组。其中相似性的计算可以利用块之间距离的倒数来衡量,常用的距离包括欧式距离等。同事我们需要设定一个阈值,当相似性大于阈值的时候,才会将带匹配块入组。如下图1所示:
图1 来自带噪声的自然图像的块分组图示,每个片段标有“R”的位参考块,其余块为与其匹配的一些块。
(2) 协同滤波
给定一组n个片段,该组的协同过滤产生n次估计,每个分好组的片段一次。通常,这些估计可能不同。术语“协同”是从字面上理解的,即每个分好组的片段协同过滤其他片段,反之亦然。
考虑一个用协同滤波估计图2中的由加性零均值独立噪声破坏图片的说明性示例。特别的,关注同一图中所示的已经分组的块。这些块表现出完美的相互相似性,这使得元素平均成为合适的估计器。因此,对于每一个组,通过协同平均的方法就可以产生所有分组的估计。因为假设相应的无噪声块是相同的,所以估计是无偏的。因此,最终估计误差仅归因于与组中的块数成反比的残差方差。只要这些组包含大量片段,无论信号有多复杂,都可以获得很好的估计。
图2 在人工绘制的图像中分组的简单示例,其中基于每个参考快(带有粗边框),存在完全相似的参考块
但是,在自然图像中不太可能存在完全相同的块。如果在同一组内允许估计不相同的片段,则通过元素平均获得的估计变得有偏差。除非使用允许对每个分组片段产生不同估计的估计器,否则偏差误差有可能占总体最终误差的最大份额。因此,应采用比平均更有效的协同过滤策略。
变换域中收缩的协同滤波
有效的协同滤波可以通过在变换域中的收缩来实现。假设已经形成了类似信号片段的d+1维组,则协同收缩包括以下步骤。
- 将d+1维线性变换应用于该组。
- 收缩(例如通过软阈值和硬阈值或维纳滤波)变换系数以衰减噪声。
- 反转线性变换以生成所有分组片段的估计值。
接下来就是介绍BM3D中的具体算法流程。
本文算法中,分组是通过块匹配实现的,而协同滤波是通过在3D变换域中收缩来实现的。使用的图像片段是固定大小的正方形块。该算法中执行的一般过程如下,通过从输入噪声中一次提取参考块并对每个这样的块进行处理:
- 查找与参考块相似的块(块匹配),并将它们堆叠在一起以形成3D阵列(组)
- 对群组执行协同过滤,并将获得的所有分组块的2D估计值返回到其原始位置。
在处理所有参考块之后,获得的块估计可能重叠,银簇每个像素有多个估计。我们汇总这些估算值已形成这呢个图像的估算值。此此通用过程以两种不同的形式实现,以组成一个两步算法。此算法在图3中进行了说明,其过程如下:
步骤1.初步估计
a) 块估算。对于嘈杂图像中的每一个块,清执行以下操作。
i) 分组。查找与当前处理块相似的块,然后将它们堆叠在一起形成3D数组。
ii) 协同性硬阈值。将3D变换应用于所形成的数组,通过变换系数进行硬阈值来衰减噪声,将3D变换反转以生成所有分组块的估计,并将这些块的估计返回到原始位置。
b) 聚集。通过对所有获得的重叠的块估计进行加权平均,计算出真实图像的初步估计值。
步骤2. 最终估计:基于初步估计,进行改进的分组和协同维纳滤波。
a) 块级估计。对于每个块,请执行以下操作。
i) 分组。在基本估算范围内使用BM查找与当前处理的块相似的块的位置。使用这些位置,形成两组(3D阵列),一组来自于噪声图像,另一组来自于基本估计。
ii) 协同维纳过滤。在两个组上应用3D变换。使用关于真实能谱的基本估计值的能谱对有噪声的组进行维纳滤波。通过对滤波后的系数应用逆3D变换来生成所有分组块的估计,并将块的估计返回到其原始位置。
b) 聚集。通过使用加权平均值汇总所有获得的局部估计,计算出真实图像的最终估计。上面算法的第二步有两个重要动机:
使用基本估计我不是嘈杂的图像可以通过块匹配来改善分组
使用基本估计作为经验维纳滤波的导频信号比对噪声数据的3D频谱进行简单的硬阈值处理要有效和准确的多。
图3 本文提出的图像去噪算法的流程图。对于每个处理的块(标记为“R”)重复用虚线包围的操作。
BM3D 去噪算法原理解析与代码实现相关推荐
- 深度学习核心技术精讲100篇(九)-Catboost算法原理解析及代码实现
前言 今天博主来介绍一个超级简单并且又极其实用的boosting算法包Catboost,据开发者所说这一boosting算法是超越Lightgbm和XGBoost的又一个神器. catboost 简介 ...
- python文件去重算法_使用Python检测文章抄袭及去重算法原理解析
在互联网出现之前,"抄"很不方便,一是"源"少,而是发布渠道少:而在互联网出现之后,"抄"变得很简单,铺天盖地的"源"源 ...
- python去重算法_使用Python检测文章抄袭及去重算法原理解析
在互联网出现之前,"抄"很不方便,一是"源"少,而是发布渠道少:而在互联网出现之后,"抄"变得很简单,铺天盖地的"源"源 ...
- 智能优化算法:海鸥算法原理及Matlab代码
智能优化算法:海鸥算法原理及Matlab代码 文章导航 1. 算法原理 2. SOA算法流程 2.1 迁徙行为(exploration ability) 2.2 攻击行为(exploitation a ...
- 索引算法原理解析(B-tree以及磁盘存储原理)
刚开始学习的时候,百度去查,但发现好多说得太复杂不好理解,结合各个文章总结一下(建议大概看文字,不理解不要紧,然后再看图的执行步骤然后在结合文字,这样一切就清晰好多) B-tree,B是balance ...
- RANSAC(随机采样一致算法)原理及openCV代码实现
<RANSAC(随机采样一致算法)原理及openCV代码实现> 原文: http://www.lai18.com/content/1046939.html 本文转自:http://b ...
- MUSIC算法原理及MATLAB代码 阵列信号处理
MUSIC算法原理及MATLAB代码 阵列信号处理 MUSIC(multiple signal classification algorithm)算法是一种基于矩阵特征空间分解的方法.从几何角度讲,信 ...
- p.563算法原理解析
p.563算法原理解析 1.概览 下图展示了,人工主观语音评估mos-lqs,双端和单端客观语音评估mos-lqo这三种方法的差异. p563算法可以被想象成一个专家使用测试设备如传统的听筒侦 ...
- 【NLP】Doc2vec原理解析及代码实践
本文概览: 1. 句子向量简介 Word2Vec提供了高质量的词向量,并在一些任务中表现良好.虽然Word2Vec提供了高质量的词汇向量,但是仍然没有有效的方法将它们结合成一个高质量的文档向量.对于一 ...
- 第四篇:决策树分类算法原理分析与代码实现
前言 本文详细介绍机器学习分类算法中的决策树算法,并全面详解如何构造,表示,保存决策树,以及如何使用决策树进行分类等等问题. 为了全面的理解学习决策树,本文篇幅较长,请耐心阅读. 算法原理 每次依据不 ...
最新文章
- AI 热潮之下,初创企业能否躲过科技巨头的碾压?
- 1月份制造业和非制造业PMI双双回升 企稳迹象初显
- ASP-JSP-NET 清空IE缓存
- [vs2010 project] CppUnit快速入门
- oracle 查询dbid,查看oracle 数据库的DBID
- linux创建名称为学号的文件,Linux操作系统下用户管理及文件管理.doc
- 敏感词过滤,并实现替换
- 在SQL Server 2005中实现异步触发器架构
- ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
- Ubuntu常用软件大全
- Vmware安装BT5进入不了图形界面怎么办(KDE版)
- 七日杀服务器直连教程,七日杀连接服务器延迟几万 | 手游网游页游攻略大全
- 什么是P=NP问题?
- iPhone15将开放15W无线快充!
- 制作本地SCLo-scl镜像仓库(reposync下载rpm包、createrepo制作镜像仓库、httpd发布服务)
- SQLMap使用|命令大全(干货)
- 【039期】头条面试:说一说 LRU 原理和 Redis 如何实现?
- poj1015陪审团——DP+路径记录
- python图结构学习--networkx整理
- Android已读未读功能,android – 将SMS消息标记为已读/未读或删除在KitKat中不起作用的消息...