OpenCV中Denoising相关函数的简单介绍
一、基本情况

在这个公式中,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
);
OpenCV中Denoising相关函数的简单介绍的更多相关文章
- 浏览器中 F12 功能的简单介绍
chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首 ...
- [转]chrome浏览器中 F12 功能的简单介绍
本文转自:https://www.cnblogs.com/zhuzhubaoya/p/9758648.html chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己 ...
- 【F12】chrome浏览器中 F12 功能的简单介绍
chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首 ...
- chrome浏览器中 F12 功能的简单介绍
chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首 ...
- Java Web中web.xml文件简单介绍
参考博客: https://www.cnblogs.com/Y-oung/p/8401549.html 1.XML 声明和根元素 <?xml version="1.0" en ...
- 关于如何在其他包中写controller和简单介绍@SpringBootApplication
本文参考博客:https://blog.csdn.net/u013473691/article/details/52353923 关于@Configuration和@Bean参考博客:https:// ...
- 标准C++中的STL容器类简单介绍
SGI -- Silicon Graphics[Computer System] Inc.硅图[计算机系统]公司. STL -- Standard Template Library 标准模板库. ...
- Mac系统中各个文件夹简单介绍(转)
一.说明: Mac OS X,这是一个基于UNIX核心的系统,增强了系统的稳定性.性能以及响应能力.它能通过对称多处理技术充分发挥双处理器的优势,提供无与伦比的2D.3D和多媒体图形性能以及广泛的字体 ...
- python中int的功能简单介绍
Int的功能介绍 1. 绝对值 x.__abs__()等同于abs(x) 2. 加法 x.__add__(y)等同于x+y 3. 与运算 x.__and__(y)等同于x&y 4. 布尔运算 ...
随机推荐
- nodeJS基础---->nodeJS的使用(一)
Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V8引擎执行Javascript的速度非常快,性能非常好.Node.js对一些特殊用例 ...
- MQTT-SN协议乱翻之功能描述
前言 紧接上文,这是第三篇,主要是对MQTT-SN 1.2协议进行总体性功能描述. 嗯,这一部分可以结合着MQTT协议对比着来看. 网关的广播和发现 网关只能在成功连接到MQTT Server之后,才 ...
- vux版本升级
一开始用的笨办法, 先卸载npm uninstall vux --save; 然后在安装npm install vux --save; 卸载的还是蛮快的,安装是在下班的时候,让电脑待机2个小时,第二 ...
- ELK基础学习
第壹部分:Elasticsearch 一 .Elasticsearch增删改查1.数据写入:HTTP method:POSTURL:http://127.0.0.1:9200/index-docs-n ...
- python epoll实现异步socket
一.同步和异步: 在程序执行中,同步运行意味着等待调用的函数.线程.子进程等的返回结果后继续处理:异步指不等待当下的返回结果,直接运行主进程下面的程序,等到有返回结果时,通知主进程处理.有点高效. 二 ...
- 8.ajax查询数据
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- Oracle性能优化之oracle里表、索引、列的统计信息
一.表的统计信息 表的统计信息用于描述表的详细信息,包括记录数(num_rows).表块的数量(blocks).平均行长度(avg_row_len)等典型维度.这些维度可以通过数据字典表DBA_TAB ...
- The Rise of Database Sharding DATABASE SHARDING
w玻璃碎片.0共享 http://www.agildata.com/database-sharding/ The Rise of Database Sharding The concept of Da ...
- Python爬虫基础(四)Requests库的使用
requests文档 首先需要安装:pip install requests get请求 最基本的get: # -*- coding: utf-8 -*-import requests respons ...
- mysql数据库建模Navicat
用Navicat制作ER图及与SQL互相转化 http://wangbaiyuan.cn/sql-and-use-navicat-to-make-er-diagram-and-interactive. ...