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应该如何实现。
首先,我们要明确的一个点在于,其实欧式距离的计算,为:
可以转化为:
在确定了这一点后,我们就可以将积分图应用在NLM上。
首先,我们来看积分图的原理:
假设我们要求的Area的像素和,我们可以使用一个两层嵌套循环遍历元素进行相加,但是我们也可以像动图这样,使用一个面积法的操作,来求出Area。
根据上述动图可以看到,Area = S1-S2-S3+S4,而Area正好可以视为我们所需要的sum(Block)。
而积分图上的每一个像素值都是自身坐标(X,Y)到(0,0)之间的所有像素值的和(如S1、S2,S3、S4),我们只需要提前计算出积分图,便可以将的复杂多次求和操作变成一次加减法,从而降低了计算的复杂度。
通过代码的实验,可以看到使用了积分图加速的NLM算法比原来的算法提升了数倍。
C++实现代码在这里!点我点我!
posted on 2022-08-13 16:15 DylanYeung 阅读(840) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)