赵杨
(云南师范大学传媒学院动画系,云南昆明,650500)
流场可视化是科学可视化的重要研究领域。现有的二维流场可视化技术可划分为三大类:基于纹理,基于线形以及基于图像[1]。
二维流场可视化技术可将矢量流场数据转换为二维动画进行呈现。该项技术除了在计算流体力学研究与工程实践领域得到了广泛应用外,其在电影、动漫制作和视频娱乐等方面也有着特殊的运用[2]。
视频媒体的风格化技术已成为当下十分重要的研究热点,各种采用不同理论思想和技术路线的研究工作也在不断展开[2]。当前,对图像及视频的水彩风格化渲染技术主要分为两类:一类是基于物理方法的模拟,一类是基于图像的滤波处理[3]。
本文主要探讨基于光流导向的二维流场可视化算法的设计与实现,并将该项技术拓展到对视频进行水彩风格化渲染方面。本文创新点在于结合以上两种处理技术对视频进行水彩风格化渲染,并进一步提出采用GPU对整个算法进行硬件加速处理。
1999年,Curtis等[4]首先提出基于物理模型的水彩风格渲染技术。该算法将画布分为3层:浅水层,颜料沉淀层,渗透层。通过模拟颜料及水在画布上的物理变化以实现逼真的水彩效果,但该算法计算代价高昂。
2007年,Bou等人根据视频光流,应用非刚性变形纹理控制生成具有水彩风格的视频[2]。该方法主要采用纹理传输方法[2],通过使纹理沿着光流场在时间域上向前向后传输,克服了纹理传输过程中随时间延伸而出现的纹理拉伸变形的缺点[5],但该算法难以实现对视频的实时水彩风格化处理。
2013年,贾立兵等人提出采用Voronoi图来实时处理视频帧,通过简化视频帧的颜色信息,并融合边缘信息,进而实现水彩画风格渲染[6]。该算法的特点是实现简单,但是较难模拟水彩的各种复杂的表现技法。
2014年,王妙一等人提出一种新颖的算法用于对图像和照片进行水彩渲染。该系统主要运用图像处理技术实现对水彩画所具有的复杂特征,比如湍流现象,边界羽化现象进行模拟。此外,该算法的优点在于可以较容易地实现并行化处理,适合交互式图像水彩化处理[7]。
2020年,赵杨等人提出了基于GPU加速的视频水彩风格化实时渲染算法,并实现了可用的实时绘制系统[3]。该系统利用GPU并行计算的特性,实现对输入视频水彩风格的快速风格迁移,为用户提供了较好的交互体验。
要解决二维流场的可视化问题,首先需构造合理的流场可视化模型。本文首先结合Navier-Stokes方程构造流体动力学模型;其次以纹理坐标映射方式,实现二维流场的纹理可视化算法;最后采用视频光流作为流体动力学模型的输入速度场,通过光流引导,实现二维流场的可视化。本文结合物理方法模拟以及图像处理技术,实现对视频的水彩风格化渲染。下面将详细介绍算法的基本思想和具体实现,以及采用GPU对本文提出的算法进行改进和优化。
本文采用Jos Stam[8]提出的Navier-Stokes方程作为流体动力学物理模型。不可压缩流体的NS方程组主要由两部分组成:一是动量方程;另一个是连续性方程[9]。形式化定义为:
其中∇⋅u=0。公式(1)右第一项称作平流项;第二项,称作压力项,代表微观上的不均匀压力;第三项表示流体浓稠度的不均匀形成的动量扩散;第四项是外力施加到流体上所增加的加速度[10]。
外力项由外界对流体施加的力组成,形式化定义为:
平流项表示速度场沿着扩散方向传输自身流体粒子,形式化定义为:
对扩散项的求解转化为对泊松方程的求解,形式化定义为:
可采用Gauss-Seidel法进行求解[10]。
经过外力、平流、扩散运算后得到一个有散度的速度场w3(x),通过投影算子将其改变为无散度的速度场w4(x)。为求解以上方程,本文通过Helmholtz-Hodge 分解得到流体运动的物理模拟计算方法。整个求解过程,按从左到右顺序,首先是外力,平流,接着是扩散和投射,即:
具体实现代码可参考文献[8]。
由于采用传统的半拉格朗日方法计算会引起数值耗散,同时二维纹理映射后,纹理坐标随速度场进行迁移的过程中,随着时间流逝,会出现纹理的拉伸和变形。为使二维纹理随流场迁移映射的过程中尽量保持其结构特征不变,本文引入漩涡限制因子来增加纹理旋流的细节[11]。
图1 基于图像纹理映射的流场可视化效果图
图2 基于噪声图像纹理映射的流场可视化效果图
光流是一种便捷的图像运动显示方法,通常定义为视频图像序列中图像亮度模型的表观运动[12]。光流算法一般分为稀疏光流算法和密集光流算法,其中密集光流场可用于像素级图像的对准[13],虽然计算量较大,但效果通常比稀疏光流要好。
本文采用Farneback密集光流算法提取运动区域内的光流信息,并以光流场运动方向作为NS流体模型的输入速度场,从而实现对二维流体纹理场的引导。
图3 基于Farneback算法的光流场计算效果图
图4 基于光流场引导的二维流场可视化效果图
本节将详细介绍如何利用上述提出的二维流场可视化算法实现对视频的水彩风格化渲染。本文提出的视频水彩风格化渲染算法主要包含四个步骤:Step1:运用二维Perlin噪声函数生成水彩纹理,作为流场的输入纹理;Step2:运用NS方程以光流场为导向模拟二维流场的纹理传输迁移效果;Step3:运用Kuwahara算子进行图像抽象化滤波;Step4:将水彩纹理图与滤波图进行融合。
图5 2D Perlin生成水彩纹理效果图
2.3.1 水彩纹理生成算法
由于水彩绘制过程中,其纸张纹理有一定的细微的随机褶皱纹理。为模拟这一特性,本文采用Perlin噪声函数来生成看起来较为自然的随机杂点[3],并以此作为二维流场可视化算法的输入纹理,通过光流导向,控制该纹理的变形,从而模拟视频序列随时间流逝时,水彩纹理的变化走向情况。如何利用二维Perlin 噪声模拟水彩纸张纹理的褶皱感,主要方法可参考文献[14]。
2.3.2 Kuwahara滤波算法
Kuwahara滤波将滤波核划分为N组邻域,算法分别计算各分区内像素的均值和方差,选择最小方差对应的均值作为滤波结果。
实验表明,Kuwahara滤波在平滑图像的同时能够保留图像边缘和角点,从而可抽象地模拟生成水彩晕染的变化效果。
图6 Kuwahara滤波生成水彩晕染效果图
2.3.3 纹理图像融合算法
通过将本文提出的二维流场可视化技术计算得到的视频水彩纹理图与Kuwahara滤波生成的水彩晕染效果图进行融合,即可得到具有水彩风格的视频序列图。纹理图像颜色混合模型类似于Photoshop软件提供的图像叠加运算,其可以形式化定义为:
公式中A代表基色;B代表混合色;C代表图层混合后的颜色值,称为结果色。
图7 纹理融合算法生成的水彩风格化效果图
本文运用GPU在二维网格上求解NS方程进而实现实时的二维流场的模拟[11]。对二维流场纹理进行渲染的每一个时间步内,GPU对NS方程的每一个算子分别进行运算,前次的计算结果将作为下次计算的输入,重复进行直到程序退出。GPU渲染流程图如图8所示。
图8 GPU加速二维流场渲染流程图
本文采用Visual C++语言及GLSL语言实现核心算法。本文提出了一个简单新颖的光流导向的流场可视化算法及视频水彩风格化技术,取得了较为良好的合成效果,但仍存在大量需要改进和优化的工作。主要改进方向是如何进一步解决二维纹理流场的拉伸与变形问题,从而实现保持纹理结构的流场可视化算法。