首页 > 其他分享 >OpenCV中Denoising相关函数的简单介绍

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

时间:2022-12-25 22:04:02浏览次数:41  
标签:函数 权重 int Denoising image 邻域 像素 OpenCV cv

参考: 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.和


       


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

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

OpenCV中Denoising相关函数的简单介绍_权重_02

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

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

OpenCV中Denoising相关函数的简单介绍_邻域_03

其中: n(x)是一个归一化的因子,是所有权重的和,对每个权重除以该因子后,使得权重满足和为1的条件。 h>0 是滤波系数,控制指数函数的衰减从而改变欧氏距离的权重。 V(x) 和 V(y) 代表了像素 x 和像素 y 的邻域,这个邻域常称为块(Patch)邻域。块邻域一般要小于搜索区域。

OpenCV中Denoising相关函数的简单介绍_权重_04

是两个邻域的高斯加权欧式距离。其中 a>0是高斯核的标准差。在求欧式距离的时候,不同位置的像素的权重是不一样的,距离块的中心越近,权重越大,距离中心越远,权重越小,权重服从高斯分布。实际计算中考虑到计算量的问题,常常采用均匀分布的权重。

OpenCV中Denoising相关函数的简单介绍_权重_05

 

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

OpenCV中Denoising相关函数的简单介绍_权重_06

 

这6组图像中,左边是原图,中心的白色色块代表了像素x块邻域,右边是计算出来的权重

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

NL-Means算法的复杂度跟图像的大小、颜色通道数、相似块的大小和搜索框的大小密切相关,设图像的大小为N×N,颜色通道数为Nc,块的大小为k×k,搜索框的大小为n×n,那么算法复杂度为:

OpenCV中Denoising相关函数的简单介绍_权重_07

(看着都可怕)。对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

); ​​




GPU可能对于这个问题的解决很有帮助,但是目前还是没有进入研究范畴。







标签:函数,权重,int,Denoising,image,邻域,像素,OpenCV,cv
From: https://blog.51cto.com/jsxyhelu2017/5968413

相关文章

  • 《学习OpenCV3》第7章第4题-SVD奇异值分解的验算
    原文题目:中文翻译: 解题过程d.使用OpenCV编写代码/************************************************************************......
  • Vue之Render函数
    关于不同版本的Vue:   1.vue.js与vue.runtime.xxx.js的区别:      (1).vue.js是完整版的Vue,包含:核心功能+模板解析器。      (2).vue.runt......
  • 特征点寻找的基础数据结构和函数
       当进行跟踪时或者其他类型的用到关键点及其描述符的分析时,通常需要做三件事情:第一个是根据一些关键点的定义搜索图像并查找该图像中的所有关键点;第二个是为发现......
  • 内联函数和重载函数
    内联函数我们知道函数调用是有时间开销的,当函数本身只有几条语句,而函数本身却被反复执行很多次时,函数调用的开销就会显得比较大,为了减小这种函数调用的开销,就引入了内联......
  • C++11:支持函数模板的默认模板参数
    在C++98/03标准中,类模板可以有默认的模板参数,如下:template<typenameT,typenameU=int,UN=0>structFoo{//...};但是却不支持函数的默认模板参数:te......
  • C++类模板、函数模板
    类模板的声明需要template<typename类型参数>,等于C#中的泛型类,如List<T>。template<typenameT>classComplex{public://构造函数Complex(Ta,Tb)......
  • 函数
    函数函数的作用什么是函数用来完成一定的功能。函数名即给对应功能起一个名字为什么要使用函数?事先编好一批常用的函数来实现各种不同的功能,把它们保存在函数库中。需......
  • Python中使用zip函数的七重境界
    1.引言Python中有一些内置函数,可以使我们的代码非常优雅。​​zip​​函数就是其中之一,但是zip函数的使用对于初学者来说不是很直观,有时容易出错。因此本文将从7个层次来......
  • 【模式识别】判别函数和感知机算法
    给定两个类别的一共8个样本,通过感知机算法求解判别函数defbi_perception():X1=np.array([[0,0,0],[1,0,0],[1,0,1],......
  • (4程序框架)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
     从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述2环境架设3两个例子4程序框架5编译使用最新opencv6综合实验7拾遗  为了方便后期图像处理相关操作运用,将前......