最近看了一些关于图像去噪的论文,从传统的基于统计的方法,到现在很火的利用深度学习来进行去噪的方法。今天分享一篇在去噪领域算是标杆的算法,文章名称为 Image Denoising by Sparse 3-D Transform-Domain CollaborativeFiltering。简称为BM3D。

该算法由两部分组成(step1和step2),每一步的处理有一些不同,但大体相同。
该算法基于这样一个假设,通过一组基础元素的线性组合,真实的信号能够被很好的近似的表示出来。
信号在转换域被稀疏的表示出来。通过保存信号在转换域内高幅度的转换系数(传递大部分真实信号的能量),将剩余的系数(主要包含噪声)舍弃,真实的信号就能被很好的估计

step1

grouping by block-matching

首先是对噪声图像进行操作。首先选定一个参考块ZxRZ_{xR}ZxR​,以其左上点的坐标值为中心,设置一个一定大小的窗口,利用以下公式计算出当前块与参考块的相似度

其中,τ2Dht\tau_{2D}^{ht}τ2Dht​是二维线性转换,常用的有二维离散余弦变换,γ′\gamma^{'}γ′为硬阈值函数,但是在代码中没有体现。N1htN^{ht}_1N1ht​为参考块的大小。
通过这个公式,计算出窗口内所有的图像块与参考块的ddd,即相似性,将满足以下条件的图像块的坐标和图像块分别保存

τmatchht\tau_{match}^{ht}τmatchht​是阈值,在编写代码时,将各个图像块的相似度计算出来,满足以上条件的将其保存(图像块和坐标),然后进行排序,如果满足条件的图像块的数目多于我们所设置的块数,选择前n(设置的最大的块数)个相似度最大的块。否则将全部的块保存。

通过上面的步骤,找到了以一个图像块为参考,与其相似度比较大的块的集合,为一个三维的数组,用ZSxRht\textbf{Z}_{S^{ht}_{x_R}}ZSxR​ht​​表示,接下俩对其进行collaborativ filtering(协同滤波)。

collaborative filtering(协同滤波)


在该步骤中,是按位置进行操作,每一次都取出同一组同一位置的像素,组成一个数组,对其进行操作。
首先,对ZSxRht\textbf{Z}_{S^{ht}_{x_R}}ZSxR​ht​​进行三维离散变换,之前在block-matching时,已经对图像块进行二维离散变换,我们将之前的计算结果保存,利用变换的可分性,取出group中相同位置、不同图像块中的像素,对其进行二维离散变换。通过以上操作,将三维离散变换τ3Dht\tau_{3D}^{ht}τ3Dht​转换为二维离散变换,提高计算效率。可参考二维离散变换的可分性 二维离散变换.,三维变换类似。

然后上面的结果进行硬阈值变换γ′\gamma^{'}γ′,去掉较小的频率部分,赋值为0。在这里要记录这一组中非零元素的个数NharxRN^{x_{R}}_{har}NharxR​​。

最后进行反变换τ3Dht−1{\tau_{3D}^{ht}}^{-1}τ3Dht​−1,将最后的结果赋值给原来的位置。
到此,得到的结果在文中被命名为Block-wise estimates。

Aggregation 聚合

通过之前的滤波,图像中的大部分噪声被滤除,接下来打算将滤波后的图像块恢复到原来的位置。因为组之间的图像块之间存在重叠相交的情况,即过完备。如何复原对去噪的结果也有很大的影响。
在存在相交的位置,采用权值平均的方法来进行聚合复原,权值通过如下函数进行设置。
简单分析一下权重这么设置的原因:其实我也不太清楚哈,不过这的确需要好好思考,先放在这吧

接下来,对图像进行初步去噪。

到此,step1完成

step2

step2 在block-matching 步骤与step1不同,是对第一步Basic estimates 和噪声图像都进行操作。
首先在Basic estimates中选择一个参考块,计算二维离散余弦变换,将噪声图中相对应位置的图像块也进行二维离散余弦变换,分别将其保存。

在Basic estimates 中,以参考块左上角坐标为中心,设置一个窗口,在这个窗口内按照下式找到与其相似的图像块,组成一个group。


SxRwieS^{wie}_{x_R}SxR​wie​是符合条件的坐标组成的数组,目的是在Basic estimates和噪声图中找到相应的图像块,组成两个group,分别用YSxRwiebasic\textbf{Y}^{basic}_{S^{wie}_{x_R}}YSxR​wie​basic​和ZSxRwie\textbf{Z}_{S^{wie}_{x_R}}ZSxR​wie​​表示。

利用下式定义维纳收缩系数

τ3Dwie\tau_{3D}^{wie}τ3Dwie​为三维离散变换,σ\sigmaσ为噪声偏差。

再利用下式对ZSxRwie\textbf{Z}_{S^{wie}_{x_R}}ZSxR​wie​​进行计算,得到每组的估计

同样,在该步骤中,是按位置进行操作,每一次都取出同一组同一位置的像素,组成一个数组,对其进行操作。

Aggregation 聚合

与step1同样的方式进行整合,得到最后的去噪图像

实验分析

我测试了一下这个算法的去噪效果。

从图中可以看出,这个方法的处理效果还是不错的,图像中物体细节的恢复很不错,但是一些细节被平滑掉。我之前用房屋的那个房子进行去噪,去噪后大部分细节全部丢失。

BM3D算法学习总结相关推荐

  1. BM3D的学习与Matlab实现

    BM3D的学习与Matlab的实现 BM3D是2007年TIP的文章,题目是<Image Denoising by Sparse 3-D Transform-Domain Collaborati ...

  2. 拿下斯坦福和剑桥双offer,00后的算法学习之路

    董文馨,00后,精通英语,西班牙语.斯坦福大学计算机系和剑桥大学双Offer,秋季将进入斯坦福大学学习. 10岁开始在国外上学:12岁学Scratch: 13岁学HTML & CSS: 14岁 ...

  3. 好久没有看到这么有建设性德文章,由衷地赞叹《知其所以然地学习(以算法学习为例)》-By 刘未鹏(pongba)

    知其所以然地学习(以算法学习为例) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Updated(2008-7-24):更新见正文部分,有标注 ...

  4. 原创 | 初学者友好!最全算法学习资源汇总(附链接)

    在计算机发展飞速的今天,也许有人会问,"今天计算机这么快,算法还重要吗?"其实永远不会有太快的计算机,因为我们总会想出新的应用.虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快 ...

  5. 基本算法学习(一)之希尔排序(JS)

    参考书: 严蔚敏-数据结构 希尔排序(Shell's Sort) 希尔排序又称"缩小增量排序",归属于插入排序一类,简单来说,和我们的插入排序比,它更快. 奇妙的记忆点: 内排序( ...

  6. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  7. Surf算法学习心得(一)——算法原理

    Surf算法学习心得(一)--算法原理 写在前面的话: Surf算法是对Sift算法的一种改进,主要是在算法的执行效率上,比Sift算法来讲运行更快!由于我也是初学者,刚刚才开始研究这个算法,然而网上 ...

  8. 算法学习:后缀自动机

    [前置知识] AC自动机(没有什么关联,但是看懂了会对后缀自动机有不同的理解) [解决问题] 各种子串的问题 [算法学习] 学习后缀自动机的过程中,看到了许多相关性质和证明,但是奈何才疏学浅(lan) ...

  9. 算法学习:后缀数组 height的求取

    [前置知识] 后缀数组 [定义] [LCP]全名最长公共前缀,两个后缀之间的最长前缀,以下我们定义 lcp ( i , j ) 的意义是后缀 i 和 j 的最长前缀 [z函数] 函数z [ i ] 表 ...

  10. 算法学习:最小圆覆盖

    [参考博客] https://www.cnblogs.com/bztMinamoto/p/10698920.html [定义] [圆]一个圆心和他的半径,就能够确定这个半径 [解决问题] 字面意思 给 ...

最新文章

  1. 设置腾讯云linux服务器中 MySQL 允许远程访问
  2. 【Netty】NIO 选择器 ( Selector ) 通道 ( Channel ) 缓冲区 ( Buffer ) 网络通信案例
  3. python知识:如何多窗口切换
  4. 用了这个方法,我下载GitHub项目速度达5MB/s!
  5. 《25项最优时间管理工具与技巧》
  6. G. Xor-MST(异或最小生成树)
  7. 云上系统迁移系列(一):概览
  8. 以优美方式编写JavaScript代码
  9. 6. Controller
  10. 七阶拉丁方阵_C语言实例 拉丁方阵
  11. 算法笔记--卢卡斯定理
  12. 金蝶K3系统如何更改已使用物料的计量单位信息
  13. 为什么地球上只有一个硅谷?
  14. 微信Mac版客户端(支持查看朋友圈)
  15. 两种python调包进行拉丁超立方采样(lhs)
  16. yocto 编译流程分析
  17. 第十三届蓝桥杯(Web 应用开发)线上模拟赛【第三题】(封装函数实现个人所得税计算器)
  18. pcs增加mysql资源_pcs命令配置示例
  19. ARM 安装中文输入法
  20. 关于.net介绍 /第一行C#代码 /什么是面向对象

热门文章

  1. 联想服务器告警信息分析,联想服务器mib分析
  2. Vue+element ui+springboot实现用户头像修改
  3. 测试晶面间距软件_DM3软件使用 透射电镜照片上晶格间距的测量是从两条线的最里面测量...
  4. Spring Data JPA实战视频教程
  5. 如何轻松查询分析多个快递单号物流到站派件延误件
  6. 2017年多校联合训练 第五场(吉如一)
  7. 爱普生L4168打印出来是白纸,复印OK,打印机测试也OK 解决方案
  8. matlab绘制折线图
  9. 三宝机器人怎么充电_三宝机器人说明书
  10. 正确的逛Github-寻找优秀的中文项目