这个好像没有啥对应的论文可以找到,在百度上搜索也能找到一些相关的资料,不过就直接是代码,可以看到其实来自于一个叫做DScaler的项目,在github上目前还能找到该项目的完整资料。

  详见:https://github.com/JohnAdders/DScaler/tree/f7d92b76678e24422c48d4a956c0486ee042786d

  其中含有FLT_GradualNoise.c文件,我们复制以下代码的注释部分对算法的解释:

This algorithm is very similar to what Andrew Dowsey came up with in his "Adaptive Temporal Averaging" for his DirectShow filter.  The algorithms differ in 1) their block size, 2) their motion estimation(sum of absolute differences versus mean squared error), 3) The addition of a "high tail," in which areas which have changed a lot(but not too much) still cause a small amount of averaging with the previous rame, and 4) rounding.

The algorithm :

This filter gets the sum of absolute differences between a four pixel horizontal block in the current image and the same block in the preceding frame.This isn't the best local motion measure, but it's very fast due to the psadbw SSE instruction.

This difference measure is used to determine the kind of averaging which will be conducted.If it's more than the "noise reduction" parameter, motion is inferred.In that case, we just use the new pixel values.If it's less than the noise reduction, we use the ratio of(difference / noise reduction) to determine the weighting of the old and new values.

Somewhat more formally :

N = Sum_block(| oldByte - newByte | )

R = Noise Reduction parameter

M = (motion evidence) = 1     if N / R >= 1.2

0.999   if 1.2 > N / R >= 1

N / R   otherwise

Result pixel = (bytewise)oldPixel * (1 - M) + newPixel * M

Rounding has a very significant effect on the algorithm.In general, for computational reasons, values are rounded down.An important exception occurs when           M > 0 and oldPixel != newPixel

but

oldPixel * (1 - M) + newPixel * M

rounds to oldPixel.In that case, the Result pixel is rounded to one toward the newPixel value.This makes sure that very gradual variation is maintained.

针对这个算法,作者提供了相关的汇编代码,而且进行了非常详细的注释,但是这个汇编还不是普通的汇编,而是用的SIMD指令,因此,对于阅读来说就非常的困难了,我大概花了10天左右,理解其思路,并用更加容易东的Intrinsic进行了重写和优化。下面是一些编写时的疑惑和解读,共享下。

//    疑点1: 对于YUV数据,这个程序是如何处理的?
// 答复: 从原始的汇编代码看,他对YUV分量是同步处理的,并没有做特别的区分,前面说的四个像素,指的意思就是Y0 U0 Y1 V0 Y2 U1 Y3 V1这4个像素,不管是MMX指令还是SSE指令
// 他们的psadbw指令都是一次性执行八个字节数据的绝对值累加(SSE指令一次性执行2个8个字节的累加而已)。如果把这个算法换成RGB格式的数据,那范围要麻烦了,要拆分RGB到各个独立的分量了。
// 疑点2: 上面提及默认的Rounding是向下的,但是一般要求只要Src和Prev有差异,就至少要向新像素有1个像素的偏移,以保证视频的连续性,如何实现的。
// 答复: 程序里对数据进行了判断,如果Src和Prev不同,则设置偏移量至少是1(正1和负1都可以),相同的话偏移量当然为0了。
// 另外,如果定点化后的偏移量大于65535,则设置偏移量为AbsDiff值,因为这个时候的由于程序移位计算的原因,直接算的值还会少1的。 (X * 65535) >> 16结果会为X - 1
// 疑点3: 程序是如何进行优化的?
// 答复: (1) 在原始的代码中,有这个0.999 if 1.2 > N / R >= 1,在作者提供的汇编代码中,对这部分做了处理,他是通过一些比较和移位来实现的,把NoiseMultiplier更改为65534了(N/R>=1,就已经设为65535了)
// 在本代码中,个人觉得这个判断毫无必要,0.999对结果的影响太小了,因此舍弃了,在作者提供的SSE和MMX代码中,这个也舍弃了。
// (2) 定点化,程序中N/R涉及到除法运算,为了减少这个,我们将整体扩大65536倍,然后再乘以AbsDiff,这个时候需要除以65536,这样可以利用_mm_mulhi_epu16来快速实现(不需要特别的移位指令了,也不需要转换到32位)
// 但是实际上,这里是有误差的,因为这个函数不能做到四舍五入,建议使用_mm_mulhrs_epi16代替。同时注意如果N/R * 65536如果大于65535了,就对于了原始算式中的M=1了 ,这个时候就把他直接限定为65535了(不需要转换到32位了)
// 举个例子,如果AbsDiff_Sum = 24,NoiseValue取值64,此时Multiplier的值为1024,则如果某个像素的newPixel - oldPixel = 10,则结果为 (24 * 1024 * 10) >> 16 = 3,但是实际的浮点为3.75,理论上应该取4更为合适。
// (3) oldPixel * (1 - M) + newPixel * M经过整理可以变为 oldPixel + (newPixel - oldPixel) * M, 此时配合newPixel - oldPixel的符号特性,可以使用_mm_adds_epu8和_mm_subs_epu8来实现最后的结果计算

  总的来说这个算法,还是利用历史帧的数据不断的来平均误差,减少视频的噪音的,但是其可以充分利用快速计算8个字节数据的累加值的指令_mm_sad_epu8,可以达到非常恐怖的计算效率和速度。

  测试1280*720大小视频,去噪平均一帧约0.8ms,1920*1080视频一帧需要约1.8ms(均位YUV422格式视频)。

由于这里上传不了视频,有需要了解该算法效果的,可以单独联系我,我可以提供个测试DEMO(DEMO太大,无法上传),下面截两张图可以稍微看到区别。

【短道速滑六】古老的视频去噪算法(FLT_GradualNoise)解析并优化,可实现1920*1080 YUV数据400fps的处理能力。的更多相关文章

  1. 【短道速滑九】仿halcon中gauss_filter小半径高斯模糊优化的实现

    通常,我们谈的高斯模糊,都知道其是可以行列分离的算法,现在也有着各种优化算法实现,而且其速度基本是和参数大小无关的.但是,在我们实际的应用中,我们可能会发现,有至少50%以上的场景中,我们并不需要大半 ...

  2. Atitit.java图片图像处理attilax总结  BufferedImage extends java.awt.Image获取图像像素点image.getRGB(i, lineIndex); 图片剪辑/AtiPlatf_cms/src/com/attilax/img/imgx.javacutImage图片处理titit 判断判断一张图片是否包含另一张小图片 atitit 图片去噪算法的原理与

    Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...

  3. 三维网格去噪算法(L0 Minimization)

    [He et al. 2013]文章提出了一种基于L0范数最小化的三角网格去噪算法.该思想最初是由[Xu et al. 2011]提出并应用于图像平滑,假设c为图像像素的颜色向量,▽c为颜色向量的梯度 ...

  4. 三维网格去噪算法(two-step framework)

    基于两步法的网格去噪算法顾名思义包含两个步骤:首先对网格表面的法向进行滤波,得到调整后的网格法向信息,然后根据调整后的法向更新顶点坐标位置,下面介绍三篇该类型的文章. [Sun et al. 2007 ...

  5. 三维网格去噪算法(bilateral filter)

    受图像双边滤波算法的启发,[Fleishman et al. 2003]和[Jones et al. 2003]分别提出了利用双边滤波算法对噪声网格进行光顺去噪的算法,两篇文章都被收录于当年的SIGG ...

  6. 经典算法题每日演练——第六题 协同推荐SlopeOne 算法

    原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,“商品推荐”,"猜你喜欢“,在实体店中我们有导购来为 ...

  7. 【图像处理】Haar Adaboost 检测自定义目标(视频车辆检测算法代码)

    阅读须知 本博客涉及到的资源: 正样本:http://download.csdn.net/detail/zhuangxiaobin/7326197 负样本:http://download.csdn.n ...

  8. 字符串与模式匹配算法(六):Needleman–Wunsch算法

    一.Needleman-Wunsch 算法 尼德曼-翁施算法(英语:Needleman-Wunsch Algorithm)是基于生物信息学的知识来匹配蛋白序列或者DNA序列的算法.这是将动态算法应用于 ...

  9. Adaboost 算法实例解析

    Adaboost 算法实例解析 1 Adaboost的原理 1.1 Adaboost基本介绍 AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由 ...

  10. 2. Attention Is All You Need(Transformer)算法原理解析

    1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...

随机推荐

  1. Soc的Bring Up流程

    1.Bring Up流程 SOC (System on a Chip) bring-up是一个复杂的过程,涉及到硬件.固件和软件的集成和验证,以下是一个基于BROM,SPL,UBOOT和Linux的启 ...

  2. 混合应用与Hybrid App开发上架流程透析

    Hybrid App(混合 App)已经成为大家接触最为广泛的 App 形式,不管是我们用到的微信.支付宝还是淘宝.京东等大大小小的应用都非常热衷于Hybrid App 带来的研发效率提升和灵活性. ...

  3. Linux笔记03: Linux常用命令_3.2目录操作命令

    3.2 目录操作命令 3.2.1 ls命令 ●命令名称:ls. ●英文原意:list directory contents. ●所在路径:/usr/bin/ls. ●执行权限:所有用户. ●功能描述: ...

  4. 怎么理解 Bean、Controller、Service、Servicelmpl、Mapper

    主要是对java的各层级介绍.叫法可能不一样,但实现的逻辑都差不多,扔给我的代码中是四个层,分别是Bean层.Controller层.Service层.Servicelmpl层.Mapper层. Be ...

  5. vue-project-------(模板语法,属性绑定)

    <template> <h3>模板语法</h3> <p>{{msg}}</p> <p>{{number+1}}</p> ...

  6. 好家伙,这个开源项目硬生生复制了一个 ChatGPT Plus 出来

    最近有一款聊天机器人框架 Lobe Chat 火出了天际,它不仅支持多模态,支持语音会话,还有一个强大的 Function Calling 插件生态系统(可以作为 ChatGPT 插件的平替).最重要 ...

  7. 【2016】开机出现 system32\config\system,代码:0xc00000e9解决方法

    这是16年刚工作时写的笔记,也带来这里做个记录吧.实际工作这几年里也时不时会遇到,大多数和非正常关机有关系 今天早上,就在刚才,一个同事的电脑开不了机了,开机提示的是system32\config\s ...

  8. 记一次 .NET某股票交易软件 灵异崩溃分析

    一:背景 1. 讲故事 在dump分析的旅程中也会碰到一些让我无法解释的灵异现象,追过这个系列的朋友应该知道,上一篇我聊过 宇宙射线 导致的程序崩溃,后来我又发现了一例,而这一例恰恰是高铁的 列控连锁 ...

  9. shopify主题模板速度优化

    前两天一位新客户说他的shopify店铺加载速度很慢,首页完全加载需要 5~6 秒甚至更高,问ytkah有没办法帮忙优化一下.shopify网站速度优化要看具体用了什么模板,有什么功能,哪些可以改哪些 ...

  10. 微服务网关限流&鉴权-wei-fu-wu-wang-guan-xian-liu--jian-quan

    title: 微服务网关限流&鉴权 date: 2022-01-06 14:40:45.047 updated: 2022-01-06 14:40:45.047 url: https://ww ...