OpenCV中Denoising相关函数的简单介绍

参考:http://wenhuix.github.io/research/denoise.html
一、基本情况

 (一)基本方法

Fast  Non-Local  MeansDenoising (FNLMD),论文为

Mahmoudi, Mona, and Guillermo Sapiro. “Fast image and video denoising via nonlocal means of similar neighborhoods.”

IEEE signal processing letters 12.12(2005): 839–842.和

NL-Means的全称是:Non-Local Means,直译过来是非局部平均,在2005年由Baudes提出,该算法使用自然图像中普遍存在的冗余信息来去噪声。与常用的双线性滤波、中值滤波等利用图像局部信息来滤波不同的是,它利用了整幅图像来进行去噪,以图像块为单位在图像中寻找相似区域,再对这些区域求平均,能够比较好地去掉图像中存在的高斯噪声。NL-Means的滤波过程可以用下面公式来表示:

在这个公式中,w(x,y)是一个权重,表示在原始图像v中,像素 x 和像素 y 的相似度。这个权重要大于0,同时,权重的和为1,用公式表示是这样:

Ωx是像素 x 的邻域。这个公式可以这样理解:对于图像中的每一个像素 x ,去噪之后的结果等于它邻域中像素 y 的加权和,加权的权重等于 x 和 y的相似度。这个邻域也称为搜索区域,搜索区域越大,找到相似像素的机会也越大,但同时计算量也是成指数上升。在提出这个算法的文献中,这个区域是整幅图像!导致的结果是处理一幅512x512大小的图像,最少也得几分钟。

衡量像素相似度的方法有很多,最常用的是根据两个像素的亮度值的差的平方来估计(最小二乘万岁!)。但因为有噪声的存在,单独的一个像素并不可靠。对此解决方法是,考虑它们的邻域,只有邻域相似度高才能说这两个像素的相似度高。衡量两个图像块的相似度最常用的方法是计算他们之间的欧氏距离:

其中: n(x)是一个归一化的因子,是所有权重的和,对每个权重除以该因子后,使得权重满足和为1的条件。 h>0 是滤波系数,控制指数函数的衰减从而改变欧氏距离的权重。 V(x) 和 V(y) 代表了像素 x 和像素 y 的邻域,这个邻域常称为块(Patch)邻域。块邻域一般要小于搜索区域。是两个邻域的高斯加权欧式距离。其中 a>0是高斯核的标准差。在求欧式距离的时候,不同位置的像素的权重是不一样的,距离块的中心越近,权重越大,距离中心越远,权重越小,权重服从高斯分布。实际计算中考虑到计算量的问题,常常采用均匀分布的权重。

如上图所示,p为去噪的点,因为q1和q2的邻域与p相似,所以权重w(p,q1)和w(p,q2)比较大,而邻域相差比较大的点q3的权重值w(p,q3)很小。如果用一幅图把所有点的权重表示出来,那就得到下面这些权重图:

这6组图像中,左边是原图,中心的白色色块代表了像素x块邻域,右边是计算出来的权重 w(x,y)图,权重范围从0(黑色)到1(白色)。这个块邻域在整幅图像中移动,计算图像中其他区域跟这个块的相似度,相似度越高,得到的权重越大。最后将这些相似的像素值根据归一化之后的权重加权求和,得到的就是去噪之后的图像了。

这个算法参数的选择也有讲究,一般而言,考虑到算法复杂度,搜索区域大概取21x21,相似度比较的块的可以取7x7。实际中,常常需要根据噪声来选取合适的参数。当高斯噪声的标准差 σ 越大时,为了使算法鲁棒性更好,需要增大块区域,块区域增加同样也需要增加搜索区域。同时,滤波系数 h 与 σ 正相关:h=kσ,当块变大时,k需要适当减小。

NL-Means算法的复杂度跟图像的大小、颜色通道数、相似块的大小和搜索框的大小密切相关,设图像的大小为N×N,颜色通道数为Nc,块的大小为k×k,搜索框的大小为n×n,那么算法复杂度为:(看着都可怕)。对512×512的彩色图像而言,设置k=7,n=21,OpenCV在使用了多线程的情况下,处理一幅图像所需要的时间需要几十秒。虽然有人不断基于这个算法进行改进、提速,但离实时处理还是比较远。

(二)视频、连续处理方法

论文为 《Denoising image sequences does not require motion estimation》by A. Buades, B. Coll

二、使用函数

(一)语法

//通用函数
  void cv::fastNlMeansDenoising(
  cv::InputArray  src,                    // Input image 必须为U8
  cv::OutputArray dst,                    // Output image
  float           h                  = 3, // Weight decay parameter
  int             templateWindowSize = 7, // Size of patches used for comparison
  int             searchWindowSize   = 21 // Maximum patch distance to consider
);
//用于彩色
void cv::fastNlMeansDenoisingColored(
  cv::InputArray  src,                    // Input image 必须为U8C3
  cv::OutputArray dst,                    // Output image
  float           h                  = 3, // Luminosity weight decay parameter
  float           hColor             = 3, // Color weight decay parameter
  int             templateWindowSize = 7, // Size of patches used for comparison
  int             searchWindowSize   = 21 // Maximum patch distance to consider
);
//用于视频,只对序列中抽取的图片进行denoiseing处理
void cv::fastNlMeansDenoisingMulti(
  cv::InputArrayOfArrays srcImgs,                // Sequence of several images
  cv::OutputArray        dst,                    // Output image
  int                    imgToDenoiseIndex,      // Index of image to denoise
  int                    temporalWindowSize,     // Num images to use (odd)
  float                  h                  = 3, // Weight decay parameter
  int                    templateWindowSize = 7, // Size of comparison patches
  int                    searchWindowSize   = 21 // Maximum patch distance
);
void cv::fastNlMeansDenoisingColoredMulti(
  cv::InputArrayOfArrays srcImgs,                // Sequence of several images
  cv::OutputArray        dst,                    // Output image
  int                    imgToDenoiseIndex,      // Index of image to denoise
  int                    temporalWindowSize,     // Num images to use (odd)
  float                  h                  = 3, // Weight decay param
  float                  hColor             = 3, // Weight decay param for color
  int                    templateWindowSize = 7, // Size of comparison patches
  int                    searchWindowSize   = 21 // Maximum patch distance
);

我希望去噪算法能够达到实时的效率,那么就是最多只能有50ms的处理时间。从现在提供的函数来看,距离这个目标还有多个数量级的差距;而试用GPU可能对于这个问题的解决很有帮助,但是目前还是没有进入研究范畴。

来自为知笔记(Wiz)

时间: 2024-10-12 09:05:55

OpenCV中Denoising相关函数的简单介绍的相关文章

HTML5中的<canvas>画布:简单介绍(0)

<canvas> 标签是 HTML 5 中的新标签,像所有的dom对象一样它有自己本身的属性.方法和事件, 其中就有绘图的方法,js能够调用它来进行绘图 ,最近在研读<html5与css3权威指南>下面对其中最好玩的canvas的学习做下读书笔记与实 验.温馨提示:以下所有实验请使用最新版的opera,火狐. 定义: <canvas> 标签定义图形,比如图表和其他图像. <canvas> 标签只是图形容器,您必须使用脚本(javascript)来绘制图形.

【F12】chrome浏览器中 F12 功能的简单介绍

chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首先介绍Chrome开发者工具中,调试时使用最多的三个功能页面是:元素(ELements).控制台(Console).源代码(Sources),此外还有网络(Network)等. 元素(Elements):用于查看或修改HTML元素的属性.CSS属性.监听事件.断点等. 控制台(Console):控制

一.SalesForce中Schema类的简单介绍

一.Schema以及Schema NameSpace是什么 在SalesForce中Schema指的是应用程序中对象(Object)以及对象之间的各种关系.Schema NameSpace中包含了好多的类和方法,通过这些类和方法,可以访问Schema的一些基本信息. 二.Schema常用的类和方法 在Schema NameSpace中包含了很多的类以及方法,在此并不会对所有的类和方法做介绍,只会对其中几个类的几个方法做简单介绍. 1.Schema.getGlobalDescribe方法``这个方

华为eNSP中交换机命令行简单介绍

华为eNSP简单介绍1.华为交换机的命令行用户视图 <huawei> 系统视图 [huawei] <Huawei>system-view //从用户视图进入系统视图 接口视图 [Huawei]interface Ethernet 0/0/1[Huawei-Ethernet0/0/1]协议视图2.视图间的转换quit 返回上一视图return/Ctrl+Z返回用户视图3.配置交换机名称<Huawei>system-view[Huawei]sysname dqq[dqq]4

Python中的lambda的简单介绍

在学习python的过程中,lambda的语法经常出现,现在将它整理一下,以备日后查看. 1.lambda是什么? 举个例子如下: 1 func=lambda x:x+1 2 print(func(1)) 3 #2 4 print(func(2)) 5 #3 6 7 #以上lambda等同于以下函数 8 def func(x): 9 return(x+1) 可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体.在这里lambda简化了函数定义的书写

ASP.NET中在一般处理程序中使用session的简单介绍

这篇文章介绍了ASP.NET中在一般处理程序中使用session,有需要的朋友可以参考一下 <%@ WebHandler Language="C#" Class="ChangePwd" %> using System; using System.Web; using System.Web.SessionState; public class ChangePwd : IHttpHandler, IReadOnlySessionState { public

Mac系统中各个文件夹简单介绍(转)

一.说明: Mac OS X,这是一个基于UNIX核心的系统,增强了系统的稳定性.性能以及响应能力.它能通过对称多处理技术充分发挥双处理器的优势,提供无与伦比的2D.3D和多媒体图形性能以及广泛的字体支持和集成的PDA功能.MAC OSX通过Classic环境几乎可以支持所有的MacOS9应用程序,直观的Aqua用户界面使Mac intosh的易用性又达到了一个全新的水平. 二.MAC硬盘中各个文件夹 打开Macintosh HD你会发现内中有四个文件夹,分别有——应用程序(Applicatio

标准C++中的STL容器类简单介绍

SGI -- Silicon Graphics[Computer System] Inc.硅图[计算机系统]公司. STL -- Standard Template Library 标准模板库.   容器的概念 所谓STL容器,即是将最常运用的一些数据结构(data structures)实现出来. 容器是指容纳特定类型对象的集合.依据数据在容器中排列的特性,容器可概分为序列式(sequence)和关联式(associative)两种. 迭代器是一种检查容器内元素并遍历元素的数据类型.它提供类似

Unity3D中寻路Navmesh的简单介绍

在游戏中经常会需要用到寻路,Asset Store里面有很多相关插件.这里介绍U3D自带的Navmesh. 1.地形 首先新建一个Plane当地表. 然后在Plane上随意摆放些几何物体当作障碍物(注意预留能够让角色通过的路径)并给这些障碍物添加rigidbody. 将这些障碍物同地表打组(把障碍物拖到Plane下为子物体),以方便接下来操作. 选中Plane组,打开Navigation窗口,勾选Navigation Static,提示同时设置子物体,点确定. 点击Navigation面板下的B