NML(Non-Local Mean)非局部平均算法 完全解析与积分图加速 (附代码)

最近开始学习在Denoise方面的内容,在这方面比较重要的传统算法当然是BM3D这种到目前比较fancy的,效果也是目前最好的算法。但是BM3D的一个致命缺点就是速度很慢,所以BM3D我们以后再说吧,我们先讲一下BM3D算法中的基础,Non Local Mean算法。

总所周知,很多的简单的降噪算法,都是单Kernel的,例如,均值滤波、中值滤波等,都是使用一个固定的Kernel对图像进行一个滤波操作。这种算法被称之为 局部算法。因为操作都是仅局限于Kernel内的。

而Non Local Mean算法是非局部的。但是我觉得在具体实现上,NLM也应该是local的,但是Non local ≠ global嘛,所以可以理解。

NLM的算法思想是通过利用图片中的所有信息,来对图像像素进行某种确定方式的相似度加权平均。

NLM通过在图像块中进行搜索,通过计算滑动窗口与指定窗口的欧氏距离,从而它们之间的相似程度,从而确定加权平均的值,进行滤波操作。

NLM 算法的过程可以用以下公式表示:

w(i,j)表示加权平均的kernel值。该值由两个块之间的相似度确定,而两个块之间的相似度则通过计算它们之间的欧式距离确定。但是,我们都知道,在一张图片中,每一个像素点,总是距离它越近的像素点与它本身的相似度越大,而距离越远,那么相似度就越小。在NLM中,算法假设权重的分布符合高斯分布

具体的算法表示可以看下图。

具体的算法过程如下:

1、图像的每一个像素CenterPoint都和周围的像素组成一个大小为BXB图像块Block

2、以CenterPoint为中心,确定一个大小为SXS的SearchWindow,该SearchWindows要比Block大

3、在SearchWindows中,以一个大小同为BXB的SearchBlock的搜索块进行滑动。

4、计算SearchBlock和Block之间的欧式距离Distance。

5、根据高斯分布和Distance确定相似度,确定平均加权的值

 

算法过程如下动图所示:

  

                                      (Non local mean算法计算过程图)

而后Distance = L1(Block-SearchBlock)

从而可以计算出加权平均值。

但是,NLM在实现上的一个弊端就是三层循环的嵌套,这样使得该算法的时间复杂度十分高。

在实现上,我们可以通过积分图来对算法过程进行一个加速。

积分图优化

接下来,我们来看一下使用积分图进行加速的trick应该如何实现。

首先,我们要明确的一个点在于,其实欧式距离的计算,为:

distance = sum(|Blcok(i,j)-SearchBlock(i,j)|)/size(Block)

可以转化为:

distance = |sum(Block)-sum(SearchBlock)|/size(Block)

在确定了这一点后,我们就可以将积分图应用在NLM上。

首先,我们来看积分图的原理:

假设我们要求的Area的像素和,我们可以使用一个两层嵌套循环遍历元素进行相加,但是我们也可以像动图这样,使用一个面积法的操作,来求出Area。

根据上述动图可以看到,Area = S1-S2-S3+S4,而Area正好可以视为我们所需要的sum(Block)。

而积分图上的每一个像素值都是自身坐标(X,Y)到(0,0)之间的所有像素值的和(如S1、S2,S3、S4),我们只需要提前计算出积分图,便可以将sum(|Blcok(i,j)-SearchBlock(i,j)|)的复杂多次求和操作变成一次加减法,从而降低了计算的复杂度。

通过代码的实验,可以看到使用了积分图加速的NLM算法比原来的算法提升了数倍。

C++实现代码在这里!点我点我!

  • 14
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值