文章仅为个人理解,如有不妥之处欢迎指正。

写几个常见的图像去噪滤波器。
1、均值滤波器
均值滤波器是最简单的图像平滑滤波器,其3*3的模板为

1

9

[

1

1

1

1

1

1

1

1

1

]

\frac{1}{9} \left[ \begin{matrix}1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right]

91​⎣⎡​111​111​111​⎦⎤​模板中心的滤波值是模板内像素点的平均值,过程如下图,填充几行由模板大小来决定。如果想滤波输出与原图像大小一致,填充是必须的,下文中就不再赘述了。


2、中值滤波器
中值滤波器是对模板内的像素值进行排序,然后选取中值作为模板中心的滤波值,均值噪声能有效去除椒盐噪声。

3、高斯滤波器
高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。其窗口模板的系数和均值滤波器不同,均值滤波器的模板系数都是相同的为1;而高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小。所以,高斯滤波器相比于均值滤波器对图像个模糊程度较小。
高斯模板的系数计算公式为:

h

(

x

,

y

)

=

e

x

2

+

y

2

2

σ

2

h(\triangle x,\triangle y)=e^{-\frac{\triangle x^2+\triangle y^2}{2\sigma^2}}

h(△x,△y)=e−2σ2△x2+△y2​其中,

x

,

y

\triangle x,\triangle y

△x,△y分别时模板内像素点到模板中心的相对距离。
以3*3高斯滤波器为例,取

σ

=

0.8

\sigma=0.8

σ=0.8,其上式计算得模板系数为:

[

0.0521

0.1139

0.0521

0.1139

0.2487

0.1139

0.0521

0.11391

0.0521

]

\ \left[ \begin{matrix}0.0521 & 0.1139 & 0.0521 \\ 0.1139 & 0.2487 & 0.1139 \\ 0.0521 &0.11391 & 0.0521 \end{matrix} \right]

⎣⎡​0.05210.11390.0521​0.11390.24870.11391​0.05210.11390.0521​⎦⎤​

需要注意的是,最后归一化的过程,使用模板左上角的系数的倒数作为归一化的系数(左上角的系数值被归一化为1),模板中的每个系数都乘以该值(左上角系数的倒数),然后将得到的值取整,就得到了整数型的高斯滤波器模板,就是我们常见的整数型3*3高斯滤波模板:

1

16

[

1

2

1

2

4

2

1

2

1

]

\frac{1}{16}\left[ \begin{matrix}1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{matrix} \right]

161​⎣⎡​121​242​121​⎦⎤​高斯滤波器模板系数与标准差

σ

\sigma

σ有着很大的关系,当

σ

\sigma

σ取很小的值时,只有模板中心的值接近于1,其余的接近于0;当

σ

\sigma

σ取很大值时,模板系数全接近于1,相当于均值滤波。

上图可以看到,随着

σ

\sigma

σ的增大,图像去噪效果是明显了,但同时图像也更模糊了,这就需要我们在实际应用的时候平衡去噪效果和模糊程度。此外,模板尺寸越大,图像也会更模糊,去噪效果也会更好。

4、NLM算法
NLM全称为non-local means,顾名思义,它是非局部平均算法,上面几个算法都是利用滤波点周围几个像素点进行滤波,NLM对每个滤波点都利用了整张图像的信息。比如,要对像素点

i

i

i做NLM处理,先遍历整张图像,求出

i

i

i与其他像素点的相似度,相似度越大,权重越大,最后再对整张图像的像素点进行加权平均,就得到

i

i

i的滤波值。该方法充分利用了图像中的冗余信息,在去噪的同时能最大程度地保持图像的细节特征。
定义:假设

v

v

v是带噪声的图像,

v

=

{

v

(

i

)

,

i

I

}

v=\{ v(i),i∈I\}

v={v(i),i∈I},

N

L

(

i

)

NL(i)

NL(i)表示对像素点

i

i

i的滤波值,就有:

N

L

(

i

)

=

j

I

w

(

i

,

j

)

v

(

j

)

NL(i)=\sum_{j∈I}w(i,j)v(j)

NL(i)=j∈I∑​w(i,j)v(j)

0

w

(

i

,

j

)

1

j

I

w

(

i

,

j

)

=

1

且,0≤w(i,j)≤1,\sum_{j∈I}w(i,j)=1

且,0≤w(i,j)≤1,j∈I∑​w(i,j)=1其中,

v

(

j

)

v(j)

v(j)表示像素点

i

i

i的灰度值,注意

j

I

j∈I

j∈I,要遍历整张图像,

w

(

i

,

j

)

w(i,j)

w(i,j)是

v

(

j

)

v(j)

v(j)的权重,由

i

,

j

i,j

i,j两像素点之间的相似度来得到。
如果仅仅比较

i

,

j

i,j

i,j像素值来作为相似度的依据,不能正确反映

i

,

j

i,j

i,j的关系,所以算法提出者利用

N

(

i

)

,

N

(

j

)

N(i),N(j)

N(i),N(j)的欧式距离来衡量相似度,

N

(

i

)

,

N

(

j

)

N(i),N(j)

N(i),N(j)分别表示

i

,

j

i,j

i,j领域像素点,邻域大小可以自己选择;
进一步就可以得到

w

(

i

,

j

)

=

1

C

e

N

(

i

)

N

(

j

)

2

h

2

w(i,j)=\frac{1}{C}e^{\frac{||N(i)-N(j)||_2}{h^2}}

w(i,j)=C1​eh2∣∣N(i)−N(j)∣∣2​​

C

=

j

I

e

N

(

i

)

N

(

j

)

2

h

2

C=\sum_{j∈I}e^{\frac{||N(i)-N(j)||_2}{h^2}}

C=j∈I∑​eh2∣∣N(i)−N(j)∣∣2​​其中,

N

(

i

)

N

(

j

)

2

||N(i)-N(j)||_2

∣∣N(i)−N(j)∣∣2​就是欧式距离,

h

h

h为滤波器参数,引入C是为了归一化。
由上式可以看出,当

i

i

i的邻域和

j

j

j的邻域相似度高的时候,

v

(

j

)

v(j)

v(j)的加权系数

w

(

i

,

j

)

w(i,j)

w(i,j)也会比较大,下图中,明显可以看出

q

1

q1

q1点、

q

2

q2

q2点的邻域与

p

p

p点邻域比较相似,所以

w

(

p

,

q

1

)

w

(

p

,

q

2

)

w(p,q1)、w(p,q2)

w(p,q1)、w(p,q2)比较大,而

q

3

q3

q3的邻域与

p

p

p差别较大,所以

w

(

q

,

p

3

)

w(q,p3)

w(q,p3)就很小。

上面说过,对于每个

i

i

i,滤波值

N

L

(

i

)

NL(i)

NL(i)都需要用到整个的图像,这样就导致算法复杂度特别高,运算非常缓慢,所以通常在应用的时候,会选定一个搜索区域,在搜索区域内计算相似度,然后加权平均,而不是遍历整个图像了。
上面图像我选取邻域大小3*3,搜索区域7*7,小于论文原文使用的7*7邻域和21*21搜索区域,即便如此,处理这幅512*512的图像也需要两分钟。
对于参数

h

h

h的选取,论文原文给出了选取规则,

h

=

10

σ

h=10\sigma

h=10σ,

σ

\sigma

σ表示噪声标准差。但实际应用的时候,我发现

h

h

h的选取并不需要那么严格,只要别选的太大或者太小就行。

h

h

h很大的时候,NLM就接近于均值滤波器了。

5、 改进的NLM算法
针对NLM算法耗时太长的问题,论文Parameter-Free Fast Pixelwise Non-Local Means Denoising 提出了改进算法,在另一位博主文章积分图像的应用(二):非局部均值去噪(NL-means)中对论文做了一定的解释,但是还是挺难懂的,我仅在此补充一些个人理解。在此之前你需要了解积分图像。
上图中,左边是经典NLM算法流程,右边是改进后的大致流程。
我的理解:经典NLM对一个像素点点滤波完全结束后,才会进行对下一个像素点的滤波;而改进的NLM不是这样,它每次求出每个像素点邻域内的一个权重,而且相对位置(图中的

(

k

,

l

)

(k,l)

(k,l))是一样的,然后遍历整个邻域位置,求出剩下权重,这样就得到了全部权重,在得到全部权重的同时,完成对整个图像的滤波,在此之前不会有任何像素点完成滤波,这一过程的实现需要用到积分图像。可以把经典NLM看成“串行”计算,那么改进NLM就是“并行”计算。
举个例子,看上图右上角的小图,经典NLM需要把邻域内25个权重都求出来,并且进行加权平均,才能对下一个像素进行滤波;改进的NLM每次求得所有像素点相对位置为

(

k

,

l

)

(k,l)

(k,l)那一像素值的权重。

上图是滤波结果图像,改进之后的NLM与经典NLM效果是一模一样的,但是耗时却大大下降了,因为核心思想是没变的,只是不同的实现过程。

用语言还是挺难完全说清楚的,以上只是帮助理解,想真正搞清楚还需要看代码,我把整篇文章的代码都放在这里了,可免费下载。

均值、中值、高斯、non-local means算法详解的更多相关文章

  1. 【Java学习笔记之十一】Java中常用的8大排序算法详解总结

    分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空 ...

  2. javascript 中合并排序算法 详解

    javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的...  合并排序代码如下: <script type="text/javascript& ...

  3. Java中对象、对象引用、堆、栈、值传递以及引用传递的详解

    Java中对象.对象引用.堆.栈.值传递以及引用传递的详解 1.对象和对象引用的差别: (1).对象: 万物皆对象.对象是类的实例. 在Java中new是用来在堆上创建对象用的. 一个对象能够被多个引 ...

  4. 机器学习经典算法详解及Python实现--基于SMO的SVM分类器

    原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector  ...

  5. EM算法详解

    EM算法详解 1 极大似然估计 假设有如图1的X所示的抽取的n个学生某门课程的成绩,又知学生的成绩符合高斯分布f(x|μ,σ2),求学生的成绩最符合哪种高斯分布,即μ和σ2最优值是什么? 图1 学生成 ...

  6. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  7. kmp算法详解

    转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...

  8. [转] KMP算法详解

    转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的K ...

  9. 【转】AC算法详解

    原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...

  10. KMP算法详解(转自中学生OI写的。。ORZ!)

    KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句 ...

随机推荐

  1. Ubuntu下的LGT8F328P MiniEVB Arduino开发和烧录环境

    基于 LGT8F328P LQFP32 的 Arduino MiniEVB, 这个板型资料较少, 记录一下开发环境和烧录过程以及当中遇到的问题. 关于 LGT8F328P 芯片参数 8位RISC内核 ...

  2. 使用prometheus来避免Kubernetes CPU Limits造成的事故

    使用prometheus来避免Kubernetes CPU Limits造成的事故 译自:Using Prometheus to Avoid Disasters with Kubernetes CPU ...

  3. SQLSERVER 阻塞之 PFS 页到底是什么?

    一:背景 1. 讲故事 在 SQLSERVER 的众多阻塞场景中,有不小的一部分是由于 PFS 页上的 闩锁 等待造成的,毕竟写页操作一定是要串行化的,在面对 闩锁(PAGELATCH_X) 等待问题 ...

  4. PowerToys 微软效率工具包 使用教程

    今天给大家介绍一款 非常实用的微软工具包 里面包含 快捷键的使用 颜色选择器 键盘管理器 屏幕标尺 鼠标实用工具等众多高效工作的功能 还是蛮出彩的 下载 PowerToys⇲ 安装教程 1.双击文件运 ...

  5. keypoint数据结构

    公有属性 (float)angle:角度,表示关键点的方向,-1为初值. (int)class_id:当要对图片进行分类时,我们可以用class_id对每个特征点进行区分,未设定时为-1,需要靠自己设 ...

  6. UEFI引导安装UBUNUT

    1.引导方式一定要选UEFI,否则一些显卡驱动将不能安装 2.安装的时候,要在第四个界面,也就是选择覆盖安装还是保留双系统的那个界面,选择其他,一定要自己分区 3.分区: 4.一共5个重要分区: 1. ...

  7. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(7)-Charles苹果手机手机抓包知否知否?

    1.简介 Charles和Fiddler一样不但能截获各种浏览器发出的 HTTP 请求,也可以截获各种智能手机发出的HTTP/ HTTPS 请求. Charles也能截获iOS设备发出的请求,比如 i ...

  8. [SHOI2006]仙人掌

    [SHOI2006]仙人掌 简要解析 其实很简单 只要普通树形 \(dp\) 就行了 \(f_x\) 表示 \(x\) 能向下延深的最大距离,\(v\) 是 \(x\) 的儿子 当一个点不属于任何环时 ...

  9. vue路由中pdfjs插件使用及找不到 viewer.html解决

    官方下载: https://mozilla.github.io/pdf.js/getting_started/#download 同目录下pdfjs-2.12.313-dist.zip为官方下载包 此 ...

  10. Android:DrawerLayout 抽屉布局没有反应

    <androidx.drawerlayout.widget.DrawerLayout android:id="@+id/drawer_layout" android:layo ...