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

写几个常见的图像去噪滤波器。
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. 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 PY32F0系列上市其实相 ...

  2. react系列-从0开始搭建一个react项目

    从0开始搭建一个react项目 1.安装脚手架 npm install -g create-react-app 2.创建项目 D: //进入D盘 mkdir ReactDemo //创建ReactDe ...

  3. 如何在阿里云服务器搭建flask

    下载flask不用我多说了,pip3 install flask 今天在阿里云的服务器上测试一个Flask程序,命名指定了 ip:0.0.0.0,port:5000,但是外网IP确怎么也访问不了网页 ...

  4. (原创)【B4A】一步一步入门02:可视化界面设计器、控件的使用

    一.前言 上篇 (原创)[B4A]一步一步入门01:简介.开发环境搭建.HelloWorld 中我们创建了默认的项目,现在我们来看一下B4A项目的构成,以及如何所见即所得的设计界面,并添加和使用自带的 ...

  5. JSP第十一次作业

    1.第十二周上机作业(邮件功能)的控制层代码改用为servlet实现.2.学习通发布了考试,截止到本周六.  com.gd.dao  BaseDao 1 package com.gd.dao; 2 3 ...

  6. Android IO 框架 Okio 的实现原理,到底哪里 OK?

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 前言 大家好,我是小彭. 今天,我们来讨论一个 Square 开源的 I/O 框架 Okio,我们最开始接触 ...

  7. ChatGPT:好家伙,每个人内心的一块魔镜

    这几天最火的话题就是ChatGPT,人人都在聊,人人都在社交圈或者vlog里面分享使用ChatGPT的聊天截图. 众生有众生相,每个人对这个AI工具有不同的感受和反应.我个人是非常接受ChatGPT, ...

  8. ECharts 饼图指定颜色显示

    一.通过setOption的color属性分配颜色范围 先介绍这里提到的color属性 color:调色盘颜色列表.如果系列没有设置颜色,则会依次循环从该列表中取颜色作为系列颜色. 默认为: ['#5 ...

  9. C++ 练习11 string的使用

    1 #include <iostream> 2 #include<string>//调用string函数库 3 using namespace std; 4 int main( ...

  10. C++练习6 不同参数的传递方式

    当函数的形参是变量时,函数内的操作是只对形参的操作,并不会对实参造成影响 当函数的形参是引用时,在函数内对形参操作的同时也会对实参造成影响 1 #include <iostream> 2 ...