这个好像没有啥对应的论文可以找到,在百度上搜索也能找到一些相关的资料,不过就直接是代码,可以看到其实来自于一个叫做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. 古老的视频去噪算法(FLT_GradualNoise)解析并优化,可实现1920*1080 YUV数据400fps的处理能力

    本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop. 转载自:https://www.cnblogs.com/Imageshop/p/14224965.html  ...

  2. 图像/视频去噪算法资源集锦

    点击上方"深度学习技术前沿",选择"星标"公众号 资源干货,第一时间送达 图像去噪是指减少数字图像中噪声的过程.随着深度学习的发展,也有许多深度学习方法被用于图 ...

  3. 如何实现python自动打开B站视频并点赞?循环版之电脑分辨率1920*1080

    import pyautogui import time import webbrowser import osrp = 1 for rp in range(5):# 浏览器运行目录chromePat ...

  4. Real-ESRGAN—图像/视频修复算法

    一.简介 Real-ESRGAN是腾讯ARC实验室发表超分辨率算法,目标是开发出实用的图像/视频修复算法.ESRGAN 的基础上使用纯合成的数据来进行训练,以使其能被应用于实际的图片修复的场景. 对于 ...

  5. ETH联合Meta和鲁汶大学 提出视频恢复算法VRT,在视频超分辨率、去模糊和去噪性能达到SOTA...

    关注公众号,发现CV技术之美 ✎ 编 者 言  该论文为将Swin Transformer应用于单图超分中的SwinIR的视频扩展版本,在视频复原的各领域中都有很大的提升,本文将从视频超分方向来解读V ...

  6. 北京内推 | 阿里云视频处理算法团队招聘视频处理算法实习生

    合适的工作难找?最新的招聘信息也不知道? AI 求职为大家精选人工智能领域最新鲜的招聘信息,助你先人一步投递,快人一步入职! 阿里云 阿里云-视频云团队是一个年业务增长速度超过 300% 的团队,拥有 ...

  7. Youtube视频推荐算法:从10页论文到4页论文的变迁

    Youtube视频推荐算法:从10页论文到4页论文的变迁 所以说豆瓣广播是个好东西,长久以来已经怠于主动关注paper的我,每次都能通过我那些专业敬业的友邻们发现有意思的文章或话题,知识因分享而伟大! ...

  8. 学习使用非局部平均值去噪算法去除图像中的噪音-图像去噪

    图像去噪 目标 • 学习使用非局部平均值去噪算法去除图像中的噪音 • 学习函数 cv2.fastNlMeansDenoising(),cv2.fastNlMeansDenoisingColored() ...

  9. Android音视频学习系列(六) — 掌握视频基础知识并使用OpenGL ES 2.0渲染YUV数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

最新文章

  1. 初学Java会遇见的几个问题分享
  2. 清华经管计算机金融专业,非量化背景拿下MIT MFin的清华经管学姐,详解MIT金融项目优劣和职业方向...
  3. cmd一键启动程序脚本
  4. mysql函数做条件_MySQL语句优化(三):避免条件字段做函数操作
  5. python处理wrf气象数据_气象数据处理:NetCDF文件处理
  6. 51学习第四天--.跟着郭老师学:程序逐渐加入模块化练习--1从流水灯1s闪烁流动--2再加数码管1~F--3.显示数码管六个灯依次显示123456--再逐渐的加入各种功能,一步一步,可训练思维!
  7. usage.txt-2
  8. LUK-Triumphal arch
  9. Spark集群环境搭建+Maven、SBT编译部署+IDEA开发(一)
  10. 省计算机软件评审活动网站,2012年广东省计算机教育软件评审活动.doc
  11. java espresso_java-Espresso-如何检查是否显示了其中一个视图
  12. 模拟电子经典200问
  13. 成为成功的软件开发顾问的5个关键
  14. XTransfer技术专家康康:从普通程序员到架构师的进化之路
  15. SAR成像系列:【11】干涉合成孔径雷达(干涉SAR,Interferometric SAR,InSAR)
  16. 基于视觉导航机器人的快递分拣系统(开放源码附带论文和github仓库)
  17. ensp启动设备蓝屏_戴尔笔记本蓝屏原因 戴尔笔记本蓝屏解决方法【详解】
  18. [Pytorch系列-30]:神经网络基础 - torch.nn库五大基本功能:nn.Parameter、nn.Linear、nn.functioinal、nn.Module、nn.Sequentia
  19. mysql中查询名字第二位为_(12) 查询出名字倒数第二位为S的员工信息。_学小易找答案...
  20. Sofaboot学习整理

热门文章

  1. web cracker
  2. 计算机集成显卡和独立显卡,集成显卡和独立显卡的区别_哪个好
  3. 使用火车头采集器的时候往文本之中均匀的插入图片
  4. 以图搜图 相似图片搜索的原理(一)
  5. DNS劫持是什么意思?百度dns有什么坏处?DNS被劫持会造成哪些后果?
  6. 2019Java视频教程-Spring Boot实战
  7. 一些可以参考的文档集合7
  8. 周志明 java_周志明
  9. JAVA 淘宝扫码登陆以及下单流程
  10. 基于时延法的麦克风阵列声源定位分析