运动模糊是photoshop中的一种滤镜,也是AE中的一种动效。本文提出了该效果的一种算法实现及原理推论。演示demo见github。git
1、效果演示
2、背景介绍
运动模糊是景物图像中的移动效果。它比较明显地出如今长时间曝光或场景内的物体快速移动的情形。github
在即时电脑动画中,每一帧显示的是瞬时画面,没有动态模糊。所以每秒24-30张画面的电玩游戏看起来断断续续的并不天然,而使用画面更新频率更快的摄影机拍摄天然动做看起来倒是连续的。所以不少电玩游戏会以运动模糊为特点,尤为是赛车模拟游戏:在预先运算生成的电脑图像中,给出逼真的运动模糊效果,在时间上避免失真需依照许多瞬间的组合来制造画面,渲染器也有更多的时间来绘制每一个画面。
因此,在动画中加入运动模糊效果的目的:
1).加强快速移动场景的真实感,使视觉上更柔和。
2).在不损失视觉流畅性的状况下,减低帧率,显著减小功耗。
3、运动模糊算法
1.运动模糊的类型
线性
运动模糊发生在单一方向的模糊。镜头的角度会影响动态模糊线条的角度;滤镜的半径长度会影响模糊强度,长度越长会月模糊。本文讨论此种类型。算法
旋转
产生像物体在旋转的环状动态模糊。此类型的模糊以镜头为准的点为中心,角度为主要影响因素,角度变化越大越模糊。性能优化
缩放
缩放型的动态模糊是以图片中心为中心辐射开来的模糊。图片中心未发生模糊但以图片中心为准的外围却会模糊,会让人有凸显图片中心的动态感受。镜头的缩放长度为主要影响因素。函数
2.运动模糊的原理
在上一节咱们介绍过,在摄影机中产生运动模糊的缘由是由于在曝光时间内,拍摄物体产生了惟一,因此形成运动模糊的效果。而在咱们现实生活中,一样可以看到不少运动模糊的场景。好比雨滴落下的场景。在下大雨的时候,咱们看到的雨滴,并非一颗一颗的,而是成一条直线落下,但实际雨滴只是水滴的形状,并非条状。这是因为视觉暂留的现象形成的。当物体中止发光时,在人脑海中的影像信息并不会当即小时,会有短期的停留,而雨滴楼下的过程,因为视觉暂留的缘由,雨滴每次进过的地方会在咱们脑海中留下影像,既而造成一条连贯的直线,也就是咱们人眼所看到的运动模糊的效果。性能
2.1.视觉暂留
视觉暂留现象是光对视网膜所产生的光中止做用后,仍保留一段时间的现象,缘由是由视神经的反应速度形成的。视觉其实是靠眼睛的晶状体成像,感光细胞感光,而且将光信号转换成神经电流,传回大脑引发人体视觉。感光细胞的感光是靠一些感光色素,感光色素的造成须要必定的时间,这就造成了视觉暂留的现象,也叫视觉惰性。
当物体在快速运动时,人眼所看到的影像消失后,因为视觉暂留的现象,视神经对物体的印象不会当即消失,而要延续一段时间,就造成了人眼所看到的运动模糊的景象。 基于视觉惰性的特性,看成用于人眼的光线忽然消失后,亮度感受不会当即消失,而是近似按指数规律降低而逐渐消失,以下图:优化
2.2.视觉惰性与运动模糊
以下是一个物体在制定的方向上运动动画
其中物体下方所标的序号1,2,……表示物体的该部分在1s,2s,……时间前曾通过标记位所处的位置。咱们假设物体是匀速运动的,视觉惰性的亮度衰减函数为f(x),每一个部分的最大亮度值为B(t),在标记位所看到的综合感官颜色残影位rest(t).这里为了简化计算,咱们假设f(t)为线性关系,且B(t)为10.
则各部分在标记位残留的亮度位:
从上述分析可得,假设n为感光亮度消失的最大时间,人眼在比标记处看到的感官颜色值为:
这里为了简化计算,从亮度的峰值开始叠加各个衰减的残影。由以前的视觉残留数据咱们能够知道,衰减函数在上升和降低阶段基本是堆成的,因此加上这阶段的残影叠加,咱们能够获得:
即对于一张体现匀速运动的图片y(x)来讲,咱们将上述残影叠加映射到每一个像素的计算,则产生运动模糊以后的图片能够表示为:
*表示卷积,psf即点扩散函数,而运动方向上感光亮度消失的最大距离点则为运动模糊的模糊半径。
3.模糊算法
3.1.点扩散函数
咱们给运动方向加上一个斜率β,以下图所示:3d
图中的实心圆点为图片上受视觉惰性影响的像素点,(x0,y0)为像素点的坐标,L为模糊半径,即运动方向上感光亮度消失的最大距离,由运动速率决定。
则运动方向上最简单的运动模糊模型可用直线型点扩散函数以离散卷积形式表示为:
###3.2.图片处理 将运动模糊的点扩散函数代入以前介绍的模糊公式,设r=L/2,则
因为图片的像素是离散的,则上述模型能够表示为:
由上述模型咱们能够知道,将一张图片进行运动模糊的处理,
实际是获取每一个像素在运动方向上的L个采样点,取其平均值,做为相信的像素值赋值给当前计算的像素。
涉及的参数有:
1)方向β
2)模糊半径L
以下图为一张须要处理的图片,每一个格子表示图片中的每一个像素。红色格子为须要处理的像素。假设模糊半径为r,方向角度为β
则须要处理的像素颜色值为:
3、性能优化
减小采样点
对于一张n1xn2像素的图片,采用上述运动模糊的算法复杂度为 rest
其中L为模糊半径,也为采样点的个数,图片模糊处理的计算时间随采样点个数呈线性增加。模糊的力度与模糊半径呈正比。因此咱们能够在保证模糊半径不变的状况下,相应的减小采样点的个数:
因为在demo里咱们处理的对象是文本图片,在文字内部,连续的两个像素值很是接近,将连续采样改为间隔采样对于文原本说在效果上的影响很是小,可是却能够减小一半的计算时间成本。 以下是减小采样前跟减小采样后的效果对比图:
可见,采样优化后的效果与优化前基本一致。