王 楠
(安徽電子信息職業(yè)技術(shù)學(xué)院 軟件學(xué)院,安徽 蚌埠 233030)
影視后期個性化摳像插件的開發(fā)
王 楠
(安徽電子信息職業(yè)技術(shù)學(xué)院 軟件學(xué)院,安徽 蚌埠 233030)
在分析影視后期摳像插件系統(tǒng)設(shè)計及工作原理的基礎(chǔ)上,設(shè)計了影視后期的個性化摳像定制插件“Basic Key”,給出了此摳像插件的實(shí)現(xiàn)方法及此插件的藍(lán)屏摳像方法、插件各選項的實(shí)現(xiàn)算法,并介紹了此摳像插件的應(yīng)用平臺及使用方法。
影視制作;摳像插件;色度鍵;個性化
摳像[1]是影視后期制作中的一種常用技術(shù),簡言之就是將畫面中一種或多種顏色變成透明,從而去除畫面中不需要的部分,保留用戶需要的部分。在影視后期制作中,摳像技術(shù)是重點(diǎn)之一,這里所討論的軟件是Adobe After Effects CS4。After Effects是使用范圍最廣的合成軟件之一,并且深受專業(yè)人士、業(yè)余愛好者、學(xué)生的喜愛[2]。但是,After Effects中的內(nèi)置摳像特效設(shè)置過于專業(yè),不適于初級制作。由于影視后期領(lǐng)域在國內(nèi)起步晚,After Effects目前在國內(nèi)主要處于應(yīng)用階段,其插件的開發(fā)處于起步階段。因此,對軟件功能進(jìn)行優(yōu)化、開發(fā)適合國內(nèi)影視后期教學(xué)及應(yīng)用的插件很有必要。故本文以擴(kuò)展After Effects摳像特效、方便使用為出發(fā)點(diǎn),定制了一款個性化摳像插件,以改善After Effects摳像特效,使其更利于普及推廣。
1.1 教學(xué)摳像插件工作原理
在After Effects中,對需要摳像的圖層(Layer)添加了此摳像插件后,就同時啟動了插件,通過After Effects SDK調(diào)用和啟動After Effects的內(nèi)部參數(shù),掌握了系統(tǒng)操作權(quán),同時為用戶和After Effects各個模塊之間提供信息傳遞和響應(yīng),實(shí)現(xiàn)摳像插件和用戶之間的交互。摳像插件與After Effects內(nèi)部的通信通過After Effects SDK實(shí)現(xiàn),SDK將系統(tǒng)控制模塊的信息與命令傳遞給After Effects內(nèi)對應(yīng)的模塊,以便模塊的控制與調(diào)用[3],摳像系統(tǒng)工作原理如圖1所示[4]。
1.2 插件選項設(shè)計
將After Effects摳像特效的特點(diǎn)進(jìn)行分析、比較,結(jié)合豐富的摳像教學(xué)與實(shí)踐經(jīng)驗(yàn),設(shè)計摳像插件的屬性選項,如圖2所示。
1.3 界面設(shè)計
本課題開發(fā)的插件命名為“基礎(chǔ)摳像”(Basic Key),按照前文對插件原理、插件選項的設(shè)計與描述,插件在After Effects中的參數(shù)控制界面位于特效控制(Effect Controls)面板中。用戶對圖層添加了此插件后,After Effects就會自動啟動此插件,并打開Effect Controls面板,展示其參數(shù)控制界面。此插件的參數(shù)控制界面設(shè)計如圖3所示。
1.4 工作流程
根據(jù)After Effects插件的工作原理,結(jié)合此插件的功能模型,分析得出此摳像插件的工作流程如圖4所示。
本課題所研究的摳像插件適用于After Effects CS4軟件。此摳像插件以工作站或配置比較高的個人計算機(jī)為硬件開發(fā)平臺,操作系統(tǒng)采用Windows XP / Windows 7系列,開發(fā)工具采用面向?qū)ο蟮目梢暬幊誊浖﨧icrosoft Visual C++6.0及Adobe After Effects CS4 SDK。
結(jié)合After Effects CS4 SDK工具,在Visual C++6.0中編寫程序,制作“基礎(chǔ)摳像”(Basic Key)插件。摳像插件系統(tǒng)中主要功能的實(shí)現(xiàn)算法和代碼如下所示。
3.1 提取顏色
使用吸管工具在背景提取顏色,是使用“基礎(chǔ)摳像”(Basic Key)插件進(jìn)行摳像的第一步,即讀取畫面中某一點(diǎn)(x,y)的像素值,返回BYTE*。對于計算機(jī)圖像而言,顏色表示方法通常有兩種:RGB(R:紅色,G:綠色,B:藍(lán)色,取值范圍均為0~255)和HSB(H:色相,取值范圍是0°~360°;S:飽和度,取值范圍是0~100%;B:亮度,取值范圍是0~100%),所以分別編寫了兩種顏色模型下的取色部分代碼。此功能對應(yīng)的VC++編程代碼:
//讀取(x,y)點(diǎn)的RGB像素值,返回BYTE*,順序是R,G,B
BYTE*BasicKeyDoc::cvGetpixel(IplImage* img, int x, int y)
{BYTE cvpixel[3];
cvpixel[2]=BYTE((img->imageData + img->widthStep*y)[x*3]);
cvpixel[1]=BYTE((img->imageData + img->widthStep*y)[x*3+1]);
cvpixel[0]=BYTE((img->imageData + img->widthStep*y)[x*3+2]);
return cvpixel;
}
//讀取(x,y)點(diǎn)的HSB像素值,返回BYTE* 順序是H,S,B(設(shè)為8 bit位深度時)
uchar* BasicKeyDoc::
cvGetpixelHSV(IplImage* img,int x,int y)
{
return &((uchar*)(img->imageData + img->widthStep*y))[x*3];
BYTE cvpixel[3];
cvpixel[0]=BYTE((img->imageData + img->widthStep*y)[x*3]);
cvpixel[1]=BYTE((img->imageData + img->widthStep*y)[x*3+1]);
cvpixel[2]=BYTE((img->imageData + img->widthStep*y)[x*3+2]);
return cvpixel;
}
//寫入(x,y)點(diǎn)的RGB像素值,返回BOOL,對應(yīng)代碼為
BOOL BasicKeyDoc::cvSetPixel(
IplImage* img, int x, int y, int R, int G, int B)
{
(img->imageData + img->widthStep*y)[x*3]=B;
(img->imageData + img->widthStep*y)[x*3+1]=G;
(img->imageData + img->widthStep*y)[x*3+2]=R;
return true;
}
//寫入(x,y)點(diǎn)的HSB像素值,返回BOOL 順序是H,S,B(設(shè)為8 bit位深度時)
BOOL BasicKeyDoc::
cvSetPixelHSB(IplImage* img, int x, int y, int H, int S, int B)
{
(img->imageData + img->widthStep*y)[x*3]=int(H/2);
(img->imageData + img->widthStep*y)[x*3+1]=S;
(img->imageData + img->widthStep*y)[x*3+2]=B;
return true;
}
3.2 藍(lán)屏摳像過程
本摳像系統(tǒng)采用顏色摳像的方法,利用背景與前景的顏色差別,把單色的背景去除,原理類似于通常所說的色度鍵(Chroma Keying)。由于摳像背景大多數(shù)選擇藍(lán)色,所以色度鍵通常也稱為藍(lán)屏摳像(Blue Screen)?!盎A(chǔ)摳像”(Basic Key)插件主要運(yùn)用的就是藍(lán)屏摳像技術(shù)。
藍(lán)屏摳像編程原理:設(shè)畫面中取色點(diǎn)像素的RGB顏色值用sRGB表示,周圍其他像素的RGB顏色值用bRGB表示;設(shè)不透明度Alpha用A表示,取值范圍為[0,1];設(shè)置一個取色的容差值,以T表示。取色點(diǎn)與其他像素之間的顏色距離用|sRGB-bRGB|表示。
藍(lán)屏摳像過程,即選擇吸管工具在畫面中某一點(diǎn)像素拾取顏色后,將該像素的A值設(shè)置為0;計算畫面中其他像素與該點(diǎn)的顏色距離,若|sRGB-bRGB|∈[0,T],則相應(yīng)像素的A值也設(shè)為0;若顏色距離不屬于此范圍,則將其作為混合像素,區(qū)分其前景顏色和背景顏色(吸取顏色)的混合比例,計算該像素的A值。
3.3 Alpha通道調(diào)整
前文已描述,高級摳像功能是此摳像插件的核心模塊,也是優(yōu)于After Effects內(nèi)置摳像特效的關(guān)鍵部分。在“基礎(chǔ)摳像”(Basic Key)插件中,高級摳像功能對應(yīng)的選項包括:“屏幕蒙版”(Screen Matte)選項組中的“修剪黑場”(Clip Black),“修剪白場”(Clip White),“屏幕柔化”(Screen Softness)及“屏幕增益”(Screen Gain)等,其中又以“修剪黑場”、“修剪白場”、“屏幕柔化”最為關(guān)鍵,因?yàn)閷τ谟脩舳?,要通過摳像插件得到一個比較完美的Alpha通道,進(jìn)而獲得干凈、準(zhǔn)確的摳像效果,這3個參數(shù)通常都要涉及[6]。下面就對其算法設(shè)計和編程代碼進(jìn)行詳細(xì)描述。
3.3.1 “修剪黑場”和“修剪白場”
修剪黑場(Clip Black),調(diào)整Alpha通道中的暗部區(qū)域,其初始值為0,取值范圍在0~100。增大此選項值可以去除更多背景,但參數(shù)過大可能會導(dǎo)致前景也一起消失。
修剪白場(Clip White),調(diào)整Alpha通道中的亮部區(qū)域,其初始值為100,取值范圍在0~100。減小此選項值可以使前景盡量完整,但參數(shù)過小則可能導(dǎo)致部分背景無法去除。
選項功能實(shí)現(xiàn)的算法設(shè)計及代碼編寫如下:
(1)讀取圖像,獲取所有像素點(diǎn)的位置(坐標(biāo))值和顏色(RGB)值。在程序中,將RGB保存在二維數(shù)組pixel_RGB[sum][3]中,sum表示像素的個數(shù),同時像素按照先行后列的順序存儲,通過行數(shù)、列數(shù)可以映射到對應(yīng)的坐標(biāo),顏色的保存順序?yàn)镽,G,B。
(2)用戶通過使用“屏幕顏色”選項的吸管指定一點(diǎn)顏色,獲取該點(diǎn)的RGB值。此步驟的實(shí)現(xiàn)代碼在前文已描述。
(3)遍歷2維數(shù)組,計算各個像素點(diǎn)顏色值與所選點(diǎn)RGB值的差距color_distance。這里采用的是歐氏距離[7]計算方法。
//這里以歐式距離計算方法為例,因?yàn)镽,G,B值的范圍均為[0.0,255.0],則max_color_distance 參數(shù)取計算得到的最大顏色間距值。
//clip black 和clip white取值范圍為[0.0,100.0]
float dist_RGB(float r0, float g0, float b0, float r1, float g1, float b1)
{
float color_distance;
color_distance=sqrt(pow(r1-r0, 2) + pow(g1-g0, 2) + pow(b1-b0, 2));
return color_distance;
}
(4)將用戶輸入的“輸入黑場”(Clip Black)和“輸入白場”(Clip White)數(shù)值轉(zhuǎn)化為對應(yīng)的距離值。
float clip_to_distance(float clip, float max_color_distance, int t)
//將Clip值轉(zhuǎn)化為對應(yīng)的距離值
{ float ClipValue = 0.0;
if (t == 0) //t = 0 時,計算將Clip Black轉(zhuǎn)化為距離值
{ float originClipBlack=
0.2*max_color_distance;
ClipValue = ( (max_color_distance - originClipBlack)*clip )/100.0 +
originClipBlack;
}
else if (t == 1)
//t = 1時, 計算將Clip White轉(zhuǎn)化為距離值
{
float originClipWhite=
0.8*max_color_distance;
ClipValue = ( originClipWhite*clip ) / 100.0;
}
return ClipValue;
}
此為舉例說明,如將clip_black=0.0轉(zhuǎn)化為對應(yīng)的backClipValue=0.2*max_color_distance(表示color_distance的最大顏色差距值);
clip_white=100.0轉(zhuǎn)化為frontClipValue=0.8*max_color_distance。
(5)通過backClipValue和frontClipValue以及color_distance計算各個像素點(diǎn)的不透明度值opacity,代碼如下:
bool pixel_opacity(float r, float g, float b, float *pixelOpacity, float clip_black, float clip_white)
{
float color_distance[sum];
//sum指總像素點(diǎn),像素按先行后列
float max_color_distance = 0.0;
for (int i = 0; i < sum; ++ i)
{
float r1 = pixel_RGB[i][0];
float g1 = pixel_RGB[i][1];
float b1 = pixel_RGB[i][2];
color_distance[i] = dist_RGB(r, g, b, r1, g1, b1);
if (max_color_distance < color_distance)
{ max_color_distance = color_distance; }
}
float backClipValue=clip_to_distance
(clip_black, max_color_distance, 0);
//將clip back 轉(zhuǎn)化為顏色的距離判定點(diǎn)
float frontClipValue=clip_to_distance
(clip_whilte, max_color_distance,1);
//將clip white 轉(zhuǎn)化為顏色的距離判定點(diǎn)
for (int i = 0; i < sum; ++ i)
{ if (color_distance <= backClipValue)
//小于等于backClipValue值,取完全透明
{ pixelOpacity[i] = 0.0; }
else if(color_distance>backClip
Value&&color_distance //在backClipValue與frontClipValue之間,取半透明 { pixelOpacity[i]=(color_distance- backClipValue)/(frontClipValue- backClipValue); } else //大于等于frontClipValue值,取完全不透明 { pixelOpacity[i] = 1.0; } } return true; } 通過增加backClipValue與frontClipValue的值,得到Color_distance與Opacity的關(guān)系如圖5所示。 (6)依據(jù)各像素點(diǎn)的不透明度生成摳像結(jié)果。 3.3.2 屏幕柔化 屏幕柔化(Screen Softness),用于對初步摳像得到的Alpha通道進(jìn)行柔化處理[8]。該選項默認(rèn)值為0,最大值由摳像的具體畫面大小決定?!捌聊蝗峄边x項的原理是通過調(diào)整Alpha通道的模糊度,進(jìn)而調(diào)整整個畫面,可以去除摳像可能產(chǎn)生的雜點(diǎn)、生成邊緣羽化等效果。本文中,對此功能的實(shí)現(xiàn)采用高斯模糊算法。 從數(shù)學(xué)的角度來看,圖像的高斯模糊過程就是圖像與正態(tài)分布做卷積。由于正態(tài)分布又叫作高斯分布,所以這項技術(shù)就叫作高斯模糊。高斯模糊是一種圖像模糊濾波器,它用正態(tài)分布計算圖像中每個像素的變換。在2維空間定義為 (1)高斯模糊矩陣計算: //計算高斯模糊矩陣,n表示n×n矩陣,rho表示標(biāo)準(zhǔn)方差 bool Gaussian_matrix(float *matrix_n, int n, float rho) { for (int i = 0; i < n; ++ i) { for (int j = 0; j < n; ++ j) { matrix_n[i*n+j] = 1 / (2 * pi * rho * rho); matrix_n[i*n+j] *= exp((- (pow(i - 2, 2) + pow(j - 2, 2))) / (2 * rho * rho)); } } return true; } (2)模糊處理后的顏色計算: //對于Alpha通道,計算該像素點(diǎn)經(jīng)過高斯模糊后的顏色值 float Gausssian_compute(float *pixel_Alpha, float *matrix_n, int n, int m); { float changeAlpha = 0.0; int t = floor(n/2); m = m - width - t; for (int i = 0; i < n; ++ i) { for (int j = 0; j < n; ++ j) { changeAlpha += pixel_Alpha[m] * matrix_n[i*n+j]; m ++; } m = m + width - n + 1; } return changeAlpha; } (3)進(jìn)行高斯模糊處理: //對Alpha通道進(jìn)行高斯模糊處理 bool Gaussian_Blur(float *pixel_Alpha, float softness, int n) { if (0 == softness) { return false; } float rho = softness/100.0 + 0.5; if (rho > 10.0) { rho = 10.0; } float *matrix_n = (float*)malloc(n*n*sizeof(float)); bool find = Gaussian_matrix(matrix_n, n, rho); for (int i = 0; i < width; ++ i) { for (int j = 0; j < height; ++ j) { if (2*(i +1) < n || 2*i + n > 2 * width || 2*(j +1) < n || 2*j + n > 2 * width) { continue; } int m = i * width + j; pixel_Alpha[m] = Gausssian_compute(pixel_Alpha, matrix_n, n, m); } } return true; } 3.3.3 邊緣收縮/擴(kuò)展 此選項功能的實(shí)現(xiàn)算法:以邊緣擴(kuò)展為例,在摳像前景的邊緣上取一點(diǎn),作為圓心,以邊緣擴(kuò)展值為半徑(單位為像素),以邊緣上某一點(diǎn)為起點(diǎn),圓心沿著邊緣移動,當(dāng)用戶輸入值為正值時,將圓移動經(jīng)過的背景像素區(qū)域重新賦予原背景顏色值;當(dāng)用戶輸入值為負(fù)值時,將圓移動覆蓋的前景像素區(qū)域的不透明度設(shè)置為0,在視覺效果上體現(xiàn)為像素不可見,即邊緣向內(nèi)收縮。 圖6 邊緣收縮/擴(kuò)展算法 研究開發(fā)的個性化摳像插件雖然取得了良好的應(yīng)用成效,但對于After Effects功能的研究和插件的開發(fā)還需要更進(jìn)一步深入系統(tǒng)研究,逐步完善。本文為影視后期制作中的摳像應(yīng)用提出了一種新的思路并實(shí)現(xiàn)了其解決的方法。在后續(xù)研究中,可以將此Basic Key插件進(jìn)行升級,使其能適用于After Effects CS5、CS6……;還可以將Basic Key插件的功能進(jìn)行進(jìn)一步的擴(kuò)展,使其功能更加強(qiáng)大,如增加一些專業(yè)摳像插件中特有的屬性選項,讓使用者能了解到專業(yè)摳像插件的功能;還可以優(yōu)化算法,編寫效率更高的代碼,使摳像系統(tǒng)在容量上更精簡、盡量少占用計算機(jī)資源,以提高運(yùn)行速率。 [1]Adobe公司. Adobe After Effects CS4經(jīng)典教程[M]. 北京: 人民郵電出版社,2009: 202. [2] Lee Lanier. 專業(yè)數(shù)字合成:必備的工具和技術(shù)[M]. 北京: 人民郵電出版社,2012: 1. [3] 胡垂立. 基于After Effects SDK的粒子系統(tǒng)在高職教學(xué)中的應(yīng)用[D]. 上海: 華東師范大學(xué),2011. [4] 趙剛,唐慧佳. Adobe After Effects插件原理及其實(shí)現(xiàn)[J]. 計算機(jī)應(yīng)用研究,2000,17(11): 99-100,103. [5] 求是科技. Visual C++數(shù)字圖像處理典型算法及實(shí)現(xiàn)[M]. 北京: 人民郵電出版社,2006: 6. [6] L.Lanier. 專業(yè)數(shù)字合成:必備的工具和技術(shù)[M]. 北京: 人民郵電出版社,2012: 86. [7] 約翰遜. 近代歐式幾何學(xué)[M]. 哈爾濱: 哈爾濱工業(yè)大學(xué)出版社,2012: 56 [8] M.Christiansen. After Effects CS4完全剖析[M]. 北京: 人民郵電出版社,2009: 72 Development of Movie Keying Individuational Plug-in WANG Nan ( School of Software, Anhui Vocational College of Electronics and Information Technology, Bengbu 233030, China) We analyze the system design, working principle of movie keying plug-in and customizes, and developes a individuational keying plug-in, “Basic Key”. We discuss the realization method of this keying plug-in, and introduce the algorithm of blue-key method of it, the algorithm of all options. It introduces the application platform and usage method of this keying plug-in. film and television production, keying plug-in, chroma keying, individuation 2015-05-14 王楠,女,安徽蚌埠人,碩士,安徽電子信息職業(yè)技術(shù)學(xué)院講師,研究方向?yàn)橛耙暫笃谥谱?、平面設(shè)計、三維設(shè)計等。 時間:2016-1-5 13:01 網(wǎng)絡(luò)出版地址:http://www.cnki.net/kcms/detail/34.1150.N.20160105.1301.013.html TP311 A 1007-4260(2015)04-0052-06 10.13757/j.cnki.cn34-1150/n.2015.04.0134 結(jié)束語