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

写几个常见的图像去噪滤波器。
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效果是一模一样的,但是耗时却大大下降了,因为核心思想是没变的,只是不同的实现过程。

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

最新文章

  1. 如何让ConfigurationManager打开任意的配置文件
  2. JavaScript 基础第四天
  3. Tomcat免安装配置2
  4. 计算A+B及其结果的标准形式输出
  5. Ado.net连接池 sp_reset_connection 概念
  6. 苹果将通过新Apple TV打造电视游戏平台 欲发力家庭游戏(转)
  7. 北大ACM(POJ1012-Joseph)
  8. 借用网上大神的一些知识,html5 video 视频播放都兼容(Android,iOS,电脑)
  9. UVa12063 Zeros and Ones
  10. Math.round(11.5)等于()Math.round(-11.5)等于()
  11. c++头
  12. Missing number - 寻找缺失的那个数字
  13. JavaWeb项目架构之NFS文件服务器
  14. 关于because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified报错的解决方案
  15. oracle:TNS:监听程序无法分发客户机连接
  16. Ubuntu中的出现:主文件夹的内容跑在桌面显示解决方案。同时 vim编辑器的操作
  17. Vue-箭头函数
  18. 基于Django rest framework 和Vue实现简单的在线教育平台
  19. [NIO-3]Socket通道
  20. C++:重载全局new/delete实现跨平台多线程内存检测

热门文章

  1. SwiftUI(二)
  2. 学习ASP.NET Core Blazor编程系列二十一——数据刷新
  3. 请求量突增一下,系统有效QPS为何下降很多?
  4. 算法之倍增和LCA:论点与点之间的攀亲戚
  5. 複合語句塊——關於while循環的
  6. 服务器搭建(CenOS 7 Apache + PHP _Mysql环境(LAMP))
  7. Rust一些学习文档
  8. Vue21 组件
  9. qt元对象系统之 Q_PROPERTY宏
  10. 中南大学CSU2022-2023级C语言期中考试机试答案