【图像算法】NLM降噪

本文主要记录下之前看的Non local means denoise论文。

1、论文简介

论文是:Non-Local Means Denoising,来源于IPOL,IPOL是个不错的地方,上面收集了很多经典论文及相关资源。

这篇论文主要用于单帧图像降噪,据说目前降噪领域上的效果主要还是BM3D比较好,毕竟看起来BM3D是NLM的升级版。但是NLM胜在效率会高一些。

2、主要思想

NLM的思路还是比较简单。一句话描述就是通过搜索窗口中的像素值的加权和来替换掉目标像素值。跟目标像素越相近的,权重越大。

这里写图片描述

这里 i 表示彩色图像的3个通道;
p 表示目标像素位置;
B(p,r) 表示中心为p,大小为 (2r+1)*(2r+1)的搜索窗口;
q 表示位于搜索窗口的像素;
w(p,q) 表示像素点p与q的权重,一般是用欧氏距离衡量其相似度。
C(p) 表示权重归一化参数。

这里再看看w是怎样求得的。

这里写图片描述

w通过一个指数函数求得,对应的参数分别为:
d:两个像素点的邻域的欧氏距离;具体公式如下:

这里写图片描述

σ表示噪声的标准差,h表示跟σ相关的滤波参数,当噪声方差越大,h可以相应的增大。

看过这些公式之后,大概的意思就比较明了了。

为了求得可以替代q的像素值,我们先在窗口中计算窗口每一个像素p与q之间的权重,权重通过计算p的邻域与q的邻域对应像素点欧氏距离得到。

3、具体实现

现在看起来整个算法的计算量也是挺大的,算法复杂度上,

对于一副有N个像素点的图像,搜索窗口为D*D,邻域大小为d*d,计算邻域相似度为O( d2 ),算上搜索窗口就是O( d2D2 )

整个算法复杂度应该是计算邻域O( Nd2D2 )

对于在嵌入式设备上,要做到实时的算法来说,这样的复杂度还是有点高的。所以也就没对这个算法进行移植。

有兴趣的可以通过opencv上的接口,看看具体算法效果。对应的接口应该是:

void fastNlMeansDenoising(InputArray src, OutputArray dst, float h=3, int templateWindowSize=7, int searchWindowSize=21 )

而在对应的IPOL上也有代码可供参考。

你可能感兴趣的:(【图像算法】)