非局部均值滤波原理 Non-local means filter 【从入门到扫地出门】

一,NLM滤波原理简介

图像中的像素点之间不是孤立存在的,某一点的像素与别处的像素点一定存在某种关联,可以概括为灰度相关性和几何结构相似性。这是均值滤波考虑的地方,但是我们还发现,相似像素并不局限于某个局部区域,如图像中的长边缘,结构纹理等,都是相似的。自然图像中含有丰富的重复冗余信息,所以可以采用能够描述图像结构特征的图像块在整个图像上寻求相似块。

在文献[1]中,NLM有2种应用,一种比较简单,是基于像素点的非局部均值求取(Pixelwise Implementation),一种是基于块的非局部均值求取(Patchwise Implementation)。当然,后者的滤波效果要优于前者。

无论是哪一种应用,可用一个公式概括:

 

其中,表示以p,q为中心点的邻域块之间的欧式距离,f表示一个单调递减函数,约束距离越近的权重值越大。C(p)为归一化系数。

二,Pixelwise Implementation

其思想是在一个需要滤波的点u的周围设置一个半径为f的邻域块记为当前块,其size为(2f+1)^2,同时设置一个与其同等大小的参考块,逐像素遍历整个图像,计算参考块和当前块的欧式距离,注意,这是块与块之间的欧式距离,具体的算式是:

原理是求取2个块中对应位置处的像素差值的平方,再归一化,归一化分母中的3表示彩色图像的3个通道,这里求取了3个通道的平均值,若为灰度图像没有此项。

计算出来的块与块之间的距离还不是参考块相对于当前块的权重,我们需要一个单调递减的函数来对欧式距离加以约束,距离越小权重越大,距离越远,权重越小且下降的速度越快。最后可以用这个函数来产生权重:为图像噪声方差。

这个函数有这样的效果:

当欧式距离d2足够小(小于)则,这个块与当前块足够相似,权重值取1;

当图像噪声方差比较大,我们需要一个比较打的h去平滑噪声;

当图像噪声方差比较小,我们需要一个比较小的h去保留细节。

所以,h与的关系是正比关系,原著推荐的h=k,更好的建议是:

 

OK,现在参考块与当前块之间的权重已经计算出来了,那就要用参考块中心和对应的权重来对当前块中心像素来滤波了。

在Pixelwise的应用中,求取的权重只作用于参考块的中心像素,遍历整个图像或设定的某个搜索区域B(为了节省计算量),将所有像素点与该点与当前点权重相乘并求和归一化,赋值给当前点,就得到了当前点的滤波值。当然,当前点自己贡献给自己的权重要取所有权重中最大的值。这就是Pixelwise Implementation和Patchwise Implementation不同的地方。

三,Patchwise Implementation

与Pixelwise 不同的是,求的的参考块与当前块之间的权重,要与参考块里面的每一个像素点相乘,得到的结果还是一个与参考块同样大小的块(称其为输出块吧),每次对一个当前块滤波后就会得到一堆布满整个搜索框的输出块,遍历完整个图像后,某一个像素点的滤波值就等于叠加在该点上的输出块中对应位置处的值之和,再除以叠加次数作为归一化。

这其实就是反过来的滤波过程,它是取一个当前点,计算这个当前块对一定区域内其他块的权重并参与这些块的滤波,将图像中每一个块对其他块的贡献值(也是一个块)算出来之后把每个点上叠加的所有别的点贡献的值累加归一化就得到了最终的滤波图像。

当然这样做是便于代码实现与降低运算量。

also,我们也可以正向思维,我们将当前块作为需要滤波的块,计算出来的参考块与权重的点乘得到输出块,遍历完搜索框,将所有输出块同样的位置的值求和归一化,得到滤波块,作为当前块的滤波结果。

另外,Patchwise 与Pixelwise块之间权重的计算是一样的。

 

四,NLM算法代码实现与去噪效果评价PSNR
五,NLM算法优化

(1)基于积分图的NLM优化加速

(2)自适应估计滤波参数

(3)基于盒子滤波的NLM加速算法

 

这2节接下来再讲

你可能感兴趣的:(openCV/openGL,C/C++,图像处理算法,Non-local,means,filt,非局部均值滤波原理,非局部均值滤波教程,NLM教程)