趙楊
(云南師范大學(xué)傳媒學(xué)院動(dòng)畫系,云南昆明,650500)
流場可視化是科學(xué)可視化的重要研究領(lǐng)域?,F(xiàn)有的二維流場可視化技術(shù)可劃分為三大類:基于紋理,基于線形以及基于圖像[1]。
二維流場可視化技術(shù)可將矢量流場數(shù)據(jù)轉(zhuǎn)換為二維動(dòng)畫進(jìn)行呈現(xiàn)。該項(xiàng)技術(shù)除了在計(jì)算流體力學(xué)研究與工程實(shí)踐領(lǐng)域得到了廣泛應(yīng)用外,其在電影、動(dòng)漫制作和視頻娛樂等方面也有著特殊的運(yùn)用[2]。
視頻媒體的風(fēng)格化技術(shù)已成為當(dāng)下十分重要的研究熱點(diǎn),各種采用不同理論思想和技術(shù)路線的研究工作也在不斷展開[2]。當(dāng)前,對(duì)圖像及視頻的水彩風(fēng)格化渲染技術(shù)主要分為兩類:一類是基于物理方法的模擬,一類是基于圖像的濾波處理[3]。
本文主要探討基于光流導(dǎo)向的二維流場可視化算法的設(shè)計(jì)與實(shí)現(xiàn),并將該項(xiàng)技術(shù)拓展到對(duì)視頻進(jìn)行水彩風(fēng)格化渲染方面。本文創(chuàng)新點(diǎn)在于結(jié)合以上兩種處理技術(shù)對(duì)視頻進(jìn)行水彩風(fēng)格化渲染,并進(jìn)一步提出采用GPU對(duì)整個(gè)算法進(jìn)行硬件加速處理。
1999年,Curtis等[4]首先提出基于物理模型的水彩風(fēng)格渲染技術(shù)。該算法將畫布分為3層:淺水層,顏料沉淀層,滲透層。通過模擬顏料及水在畫布上的物理變化以實(shí)現(xiàn)逼真的水彩效果,但該算法計(jì)算代價(jià)高昂。
2007年,Bou等人根據(jù)視頻光流,應(yīng)用非剛性變形紋理控制生成具有水彩風(fēng)格的視頻[2]。該方法主要采用紋理傳輸方法[2],通過使紋理沿著光流場在時(shí)間域上向前向后傳輸,克服了紋理傳輸過程中隨時(shí)間延伸而出現(xiàn)的紋理拉伸變形的缺點(diǎn)[5],但該算法難以實(shí)現(xiàn)對(duì)視頻的實(shí)時(shí)水彩風(fēng)格化處理。
2013年,賈立兵等人提出采用Voronoi圖來實(shí)時(shí)處理視頻幀,通過簡化視頻幀的顏色信息,并融合邊緣信息,進(jìn)而實(shí)現(xiàn)水彩畫風(fēng)格渲染[6]。該算法的特點(diǎn)是實(shí)現(xiàn)簡單,但是較難模擬水彩的各種復(fù)雜的表現(xiàn)技法。
2014年,王妙一等人提出一種新穎的算法用于對(duì)圖像和照片進(jìn)行水彩渲染。該系統(tǒng)主要運(yùn)用圖像處理技術(shù)實(shí)現(xiàn)對(duì)水彩畫所具有的復(fù)雜特征,比如湍流現(xiàn)象,邊界羽化現(xiàn)象進(jìn)行模擬。此外,該算法的優(yōu)點(diǎn)在于可以較容易地實(shí)現(xiàn)并行化處理,適合交互式圖像水彩化處理[7]。
2020年,趙楊等人提出了基于GPU加速的視頻水彩風(fēng)格化實(shí)時(shí)渲染算法,并實(shí)現(xiàn)了可用的實(shí)時(shí)繪制系統(tǒng)[3]。該系統(tǒng)利用GPU并行計(jì)算的特性,實(shí)現(xiàn)對(duì)輸入視頻水彩風(fēng)格的快速風(fēng)格遷移,為用戶提供了較好的交互體驗(yàn)。
要解決二維流場的可視化問題,首先需構(gòu)造合理的流場可視化模型。本文首先結(jié)合Navier-Stokes方程構(gòu)造流體動(dòng)力學(xué)模型;其次以紋理坐標(biāo)映射方式,實(shí)現(xiàn)二維流場的紋理可視化算法;最后采用視頻光流作為流體動(dòng)力學(xué)模型的輸入速度場,通過光流引導(dǎo),實(shí)現(xiàn)二維流場的可視化。本文結(jié)合物理方法模擬以及圖像處理技術(shù),實(shí)現(xiàn)對(duì)視頻的水彩風(fēng)格化渲染。下面將詳細(xì)介紹算法的基本思想和具體實(shí)現(xiàn),以及采用GPU對(duì)本文提出的算法進(jìn)行改進(jìn)和優(yōu)化。
本文采用Jos Stam[8]提出的Navier-Stokes方程作為流體動(dòng)力學(xué)物理模型。不可壓縮流體的NS方程組主要由兩部分組成:一是動(dòng)量方程;另一個(gè)是連續(xù)性方程[9]。形式化定義為:
其中??u=0。公式(1)右第一項(xiàng)稱作平流項(xiàng);第二項(xiàng),稱作壓力項(xiàng),代表微觀上的不均勻壓力;第三項(xiàng)表示流體濃稠度的不均勻形成的動(dòng)量擴(kuò)散;第四項(xiàng)是外力施加到流體上所增加的加速度[10]。
外力項(xiàng)由外界對(duì)流體施加的力組成,形式化定義為:
平流項(xiàng)表示速度場沿著擴(kuò)散方向傳輸自身流體粒子,形式化定義為:
對(duì)擴(kuò)散項(xiàng)的求解轉(zhuǎn)化為對(duì)泊松方程的求解,形式化定義為:
可采用Gauss-Seidel法進(jìn)行求解[10]。
經(jīng)過外力、平流、擴(kuò)散運(yùn)算后得到一個(gè)有散度的速度場w3(x),通過投影算子將其改變?yōu)闊o散度的速度場w4(x)。為求解以上方程,本文通過Helmholtz-Hodge 分解得到流體運(yùn)動(dòng)的物理模擬計(jì)算方法。整個(gè)求解過程,按從左到右順序,首先是外力,平流,接著是擴(kuò)散和投射,即:
具體實(shí)現(xiàn)代碼可參考文獻(xiàn)[8]。
由于采用傳統(tǒng)的半拉格朗日方法計(jì)算會(huì)引起數(shù)值耗散,同時(shí)二維紋理映射后,紋理坐標(biāo)隨速度場進(jìn)行遷移的過程中,隨著時(shí)間流逝,會(huì)出現(xiàn)紋理的拉伸和變形。為使二維紋理隨流場遷移映射的過程中盡量保持其結(jié)構(gòu)特征不變,本文引入漩渦限制因子來增加紋理旋流的細(xì)節(jié)[11]。
圖1 基于圖像紋理映射的流場可視化效果圖
圖2 基于噪聲圖像紋理映射的流場可視化效果圖
光流是一種便捷的圖像運(yùn)動(dòng)顯示方法,通常定義為視頻圖像序列中圖像亮度模型的表觀運(yùn)動(dòng)[12]。光流算法一般分為稀疏光流算法和密集光流算法,其中密集光流場可用于像素級(jí)圖像的對(duì)準(zhǔn)[13],雖然計(jì)算量較大,但效果通常比稀疏光流要好。
本文采用Farneback密集光流算法提取運(yùn)動(dòng)區(qū)域內(nèi)的光流信息,并以光流場運(yùn)動(dòng)方向作為NS流體模型的輸入速度場,從而實(shí)現(xiàn)對(duì)二維流體紋理場的引導(dǎo)。
圖3 基于Farneback算法的光流場計(jì)算效果圖
圖4 基于光流場引導(dǎo)的二維流場可視化效果圖
本節(jié)將詳細(xì)介紹如何利用上述提出的二維流場可視化算法實(shí)現(xiàn)對(duì)視頻的水彩風(fēng)格化渲染。本文提出的視頻水彩風(fēng)格化渲染算法主要包含四個(gè)步驟:Step1:運(yùn)用二維Perlin噪聲函數(shù)生成水彩紋理,作為流場的輸入紋理;Step2:運(yùn)用NS方程以光流場為導(dǎo)向模擬二維流場的紋理傳輸遷移效果;Step3:運(yùn)用Kuwahara算子進(jìn)行圖像抽象化濾波;Step4:將水彩紋理圖與濾波圖進(jìn)行融合。
圖5 2D Perlin生成水彩紋理效果圖
2.3.1 水彩紋理生成算法
由于水彩繪制過程中,其紙張紋理有一定的細(xì)微的隨機(jī)褶皺紋理。為模擬這一特性,本文采用Perlin噪聲函數(shù)來生成看起來較為自然的隨機(jī)雜點(diǎn)[3],并以此作為二維流場可視化算法的輸入紋理,通過光流導(dǎo)向,控制該紋理的變形,從而模擬視頻序列隨時(shí)間流逝時(shí),水彩紋理的變化走向情況。如何利用二維Perlin 噪聲模擬水彩紙張紋理的褶皺感,主要方法可參考文獻(xiàn)[14]。
2.3.2 Kuwahara濾波算法
Kuwahara濾波將濾波核劃分為N組鄰域,算法分別計(jì)算各分區(qū)內(nèi)像素的均值和方差,選擇最小方差對(duì)應(yīng)的均值作為濾波結(jié)果。
實(shí)驗(yàn)表明,Kuwahara濾波在平滑圖像的同時(shí)能夠保留圖像邊緣和角點(diǎn),從而可抽象地模擬生成水彩暈染的變化效果。
圖6 Kuwahara濾波生成水彩暈染效果圖
2.3.3 紋理圖像融合算法
通過將本文提出的二維流場可視化技術(shù)計(jì)算得到的視頻水彩紋理圖與Kuwahara濾波生成的水彩暈染效果圖進(jìn)行融合,即可得到具有水彩風(fēng)格的視頻序列圖。紋理圖像顏色混合模型類似于Photoshop軟件提供的圖像疊加運(yùn)算,其可以形式化定義為:
公式中A代表基色;B代表混合色;C代表圖層混合后的顏色值,稱為結(jié)果色。
圖7 紋理融合算法生成的水彩風(fēng)格化效果圖
本文運(yùn)用GPU在二維網(wǎng)格上求解NS方程進(jìn)而實(shí)現(xiàn)實(shí)時(shí)的二維流場的模擬[11]。對(duì)二維流場紋理進(jìn)行渲染的每一個(gè)時(shí)間步內(nèi),GPU對(duì)NS方程的每一個(gè)算子分別進(jìn)行運(yùn)算,前次的計(jì)算結(jié)果將作為下次計(jì)算的輸入,重復(fù)進(jìn)行直到程序退出。GPU渲染流程圖如圖8所示。
圖8 GPU加速二維流場渲染流程圖
本文采用Visual C++語言及GLSL語言實(shí)現(xiàn)核心算法。本文提出了一個(gè)簡單新穎的光流導(dǎo)向的流場可視化算法及視頻水彩風(fēng)格化技術(shù),取得了較為良好的合成效果,但仍存在大量需要改進(jìn)和優(yōu)化的工作。主要改進(jìn)方向是如何進(jìn)一步解決二維紋理流場的拉伸與變形問題,從而實(shí)現(xiàn)保持紋理結(jié)構(gòu)的流場可視化算法。