本文介绍非局部均值滤波,这种滤波器效果非常好,但是算法耗时严重,这里以效果为先,来给大家讲解。

非局部均值滤波(Non-Local Means,NLM)是Buades等人于2005年在论文“A non-local algorithm for image denoising”中提出的对传统邻域滤波方法的一种改进滤波,考虑到了图像的自相似性质,它充分利用了图像中的冗余信息,在去噪的同时能够最大程度的保持图像的细节特征。

该算法需要计算图像中所有像素与当前像素之间的相似性,考虑到这个计算量与效率的问题,一般会设定两个固定大小的窗口,一个大的搜索窗口(D×D)和一个小的邻域窗口(d×d),邻域窗口在搜索窗口中进行滑动,根据邻域间的相似性来确定对应中心像素对当前像素的影响度,也就是权值。

下图是NLM算法执行过程,大窗口是以目标像素为中心的搜索窗口,两个灰色小窗口分别是以x,y为中心的邻域窗口。其中以y为中心的邻域窗口在搜索窗口中滑动,通过计算两个邻域窗口间的相似程度为y赋以权值w(x,y) 。

NLM的算法流程如下:

关于NLM的快速算法,可以参考论文:

FromentJ. Parameter-Free Fast Pixelwise Non-Local Means Denoising[J]. Image ProcessingOn Line, 2014, 4: 300-326

本人使用C语言实现代码如下(没有使用快速算法,速度在10S以上,使用DEMO时轻耐心等待):

#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include"f_NLM.h"#define MIN2(a, b) ((a) < (b) ? (a) : (b))
#define MAX2(a, b) ((a) > (b) ? (a) : (b))
#define CLIP3(x, a, b) MIN2(MAX2(a,x), b)void NLM(unsigned char* srcData, int width, int height, int D, int d, float h)
{unsigned char* tempData = (unsigned char*)malloc(sizeof(unsigned char) * width * height);memcpy(tempData, srcData, sizeof(unsigned char) * height * width);float sw = 0;float sum = 0;int px, py, cx, cy;float zx;float vxsy = 0;float DD = d * d;float HH = h * h;for(int j = 0; j < height; j++){for(int i = 0; i < width; i++){sw = 0;zx = 0; sum = 0;for(int n = -D; n <= D; n++){for(int m = -D; m <= D; m++){         vxsy = 0;for(int kn = -d; kn <= d; kn++){for(int km = -d; km <= d; km++){cx = CLIP3(i - d + km, 0, width - 1);cy = CLIP3(j - d + kn, 0, height - 1);px = CLIP3(i + m + km, 0, width - 1);py = CLIP3(j + n + kn, 0, height - 1);vxsy += (tempData[px + py * width] - tempData[cx + cy * width]) * (tempData[px + py * width] - tempData[cx + cy * width]);}}vxsy = vxsy / DD;sw = exp(-vxsy / HH);zx += sw;int ox = CLIP3(i + m, 0, width - 1);int oy = CLIP3(j + n, 0, height - 1);sum += sw * tempData[ox + oy * width];}}srcData[i + j * width] = zx == 0 ? srcData[i + j * width] : CLIP3(sum / zx, 0, 255);}}free(tempData);
};void f_NLMFilter(unsigned char* srcData, int nWidth, int nHeight, int nStride, int dRadius, int sRadius, int h)
{if (srcData == NULL){return;}if(dRadius == 0 || sRadius == 0 || h == 0 || dRadius <= sRadius)return;unsigned char* rData = (unsigned char*)malloc(sizeof(unsigned char) * nWidth * nHeight);unsigned char* gData = (unsigned char*)malloc(sizeof(unsigned char) * nWidth * nHeight);unsigned char* bData = (unsigned char*)malloc(sizeof(unsigned char) * nWidth * nHeight);unsigned char* pSrc = srcData;unsigned char* pR = rData;unsigned char* pG = gData;unsigned char* pB = bData;for(int j = 0; j < nHeight; j++){for(int i = 0; i < nWidth; i++){*pR = pSrc[2];*pG = pSrc[1];*pB = pSrc[0];pR++;pG++;pB++;pSrc += 4;}}NLM(rData, nWidth, nHeight, dRadius, sRadius, h);NLM(gData, nWidth, nHeight, dRadius, sRadius, h);NLM(bData, nWidth, nHeight, dRadius, sRadius, h);pSrc = srcData;pR = rData;pG = gData;pB = bData;for(int j = 0; j < nHeight; j++){for(int i = 0; i < nWidth; i++){pSrc[2] = * pR;pSrc[1] = * pG;pSrc[0] = * pB;pR++;pG++;pB++;pSrc += 4;}}free(rData);free(gData);free(bData);
}

非局部均值滤波的效果如下图所示:

上面就是LNM滤波器的效果了,从效果上看,用来做美颜磨皮完全没有问题,但是由于速度限制,基本上没有用它来做的,当然,作为算法学习,还是可以的。

最后给出一个源码+DEMO链接:NLM滤波

注意,本文算法部分参考了网上博客内容,测试图片也均来自网络,若有侵权,敬请告知,谢谢。

本人QQ1358009172, 公众号:SF图像算法

图像保边滤波算法集锦--非局部均值NLM滤波器相关推荐

  1. 图像保边滤波算法集锦系列

    在美颜算法的实现中,如何既能把人脸皮肤磨得光滑,雀斑磨得干净,又能保留五官的自然清晰,这就需要一种能保留边缘信息的平滑滤波器,这种滤波器的好坏在一定程度上,也就影响了美颜磨皮效果的好坏,对此,本人将在 ...

  2. 非局部均值滤波算法(NL-means)

    非局部均值滤波算法(NL-means) 今天来学习一下另一类滤波算法:非局部均值滤波算法(NL-means).非局部均值滤波算法最早于2005年由Buades等人发表在CVPR上,论文原文:A non ...

  3. 非局部相似性 matlab,基于引导核聚类的非局部均值图像去噪算法

    非局部均值(nonlocal means, NLM)图像去噪算法是根据图像中存在的大量冗余信息,用非局部自相似性原理抑制噪声的算法.最初的NLM算法由文献[ 在NLM改进算法中,文献[[在相似窗结构张 ...

  4. 图像降噪算法——非局部均值降噪算法

    图像降噪算法--非局部均值降噪算法 图像降噪算法--非局部均值降噪算法 1. 基本原理 2. C++代码实现 3. 结论 图像降噪算法--非局部均值降噪算法 1. 基本原理 非局部均值降噪算法(Non ...

  5. 经典非局部均值滤波(NLM)算法python实现(1)

    经典非局部均值滤波(NLM)算法python实现(单通道图像版本) 概述:非局部均值(NL-means)是近年来提出的一项新型的去噪技术.该方法充分利用了图像中的冗余信息,在去噪的同时能最大程度地保持 ...

  6. 经典非局部均值滤波(NLM)算法python实现(2)

    经典非局部均值滤波(NLM)算法python实现(三通道图像版本) 单通道图像版本已发布: https://blog.csdn.net/yy0722a/article/details/11392408 ...

  7. 非线性邻域滤波(NNFs)在MR-FBP图像重建算法中的应用(基于astra-toolbox开发, 实现双边滤波,非局部均值滤波(NLM)的惩戒项的改进,并进行MAE,MAR分析)

    本科荒废了两年,大三终于开始好好学习了,,,,但是跟无头苍蝇,只知道上课,大四即将找工作,心理慌得一批,由于自己太辣鸡,,,只能找到3,4000的,,,终于还是决定步入研究生大抗,,,上了后发现他娘的 ...

  8. 【图像去噪】基于非局部均值(NLM)滤波图像去噪含Matlab源码

    1 简介 图像在获取和传输过程中,不可避免地受到外部和内部的干扰,常常因为各种因素的影响而被加入很多噪声,这十分严重的影响了人们对传输后图像信息的读取.因此通过一定方法将被噪声污染的图像进行去噪处理一 ...

  9. 非局部相似性 matlab,非局部均值滤波(NLM)和MATLAB程序详解视频教程保持图像细节...

    [内容简介]<非局部均值滤波与应用和MATLAB程序详解视频>共6章28节视频,总学时698分钟,合11.6小时.主要内容包括:非局部均值滤波类算法入门,基于滤波参数自适应的非局部均值滤波 ...

最新文章

  1. VS调试技巧之附加进程
  2. Password-less logins with OpenSSH
  3. spring中事务和传播属性配置代码
  4. winform 程序制作自己的数字签名(续)
  5. 【正睿2021寒假省选第二轮集训 day 1】令牌生成 (组合数+二分)
  6. 两条边延长角会有什么变化_《认识角》教学设计
  7. 找出出现次数最多的字母
  8. 2011年计算机二级c++笔记:类的转换
  9. SONiC vs testbed搭建
  10. 求助可移动磁盘显示没有格式化
  11. 分享图片或链接到抖音
  12. 银河麒麟系统飞腾CPU安装达梦数据库
  13. 我在 B 站,被喷了。。。
  14. 小人物解决四大数学问题:记传奇华人数学家李天岩
  15. 初始化交换文件的指令linux,思科nexus虚拟交换之开机初始化配置(Nexus7K、Nexus5K等)...
  16. KF、EKF、UKF、ESKF、PF对比
  17. 手机qq游戏显示服务器出问题,QQ游戏常见问题问与答 FAQ
  18. 解决WIN/MAC平台谷歌浏览器/Chrome添加插件安装时显示程序包无效:CRX_HEADER_INVALID的问题
  19. 旧上海老大杜月笙语录,很值得看
  20. kali 安装 蚁剑

热门文章

  1. 触摸板失效,fn快捷键不显示,神舟control center3.0无法打开等问题重装驱动
  2. 【树莓派C语言开发】实验15:电位计传感器(关联PCF8951)
  3. 高德地图——地图渲染及关键字搜索POI功能vue2/web端
  4. JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
  5. 【专栏】国内外物联网平台初探(篇三:QQ物联·智能硬件开放平台)
  6. C语言 收入与纳税计算
  7. 计算机辅助普通话水平测试第三项占多少分,计算机辅助普通话水平测试第三项朗读短文占...
  8. netflix_DeepCasting可能是Netflix的未来
  9. python自定义损失函数_tensorflow 自定义损失函数示例代码
  10. android释放内存只有1GB,手机内存不够用?教你5秒删掉1G垃圾,提升速度!