摘要:包括人臉表情修改在內的人體生物特征的操作技術,涉及的臉部圖像處理是圖像處理學科的技術難點#65377;研究了影響人臉識別技術實用化的一些因素,提出了開發人臉識別與修改技術的方法,開發出一個人臉圖像處理系統,主要用于圖片中人臉部位的變換與修改,為今后開發性能優良的人臉識別與修改系統奠定基礎#65377;
關鍵詞:臉部特征定位; 臉部特征提取; 臉部建模與變換
中圖分類號:TP391文獻標志碼:A
文章編號:1001-3695(2007)10-0193-04
人臉識別和修改技術在公共安全#65380;人機交互#65380;影視動畫等領域具有廣泛的應用前景,因此吸引了大量的研究人員對此展開深入研究#65377;隨著計算機科學技術的發展,人像處理與變換成為計算機視覺領域和圖像處理領域的重要研究課題,與人臉圖像處理相關的技術,如人臉識別#65380;人臉特征定位#65380;特征修改#65380;臉部建模#65380;臉部變換等技術,一直受到許多研究人員的關注#65377;其中,臉部特征定位是人臉分析技術的一個重要組成部分,其目標是根據有限個參考點和輸入圖像找出更多的人臉特征點,即在圖像或圖像序列中的指定區域內搜索人臉特征(如眼#65380;鼻#65380;嘴#65380;耳等)的位置,為臉部建模提供建模數據#65377;人臉部位的變換是指在人臉數據模型上對臉部部位進行平移#65380;放縮#65380;扭曲的變換和整體表情的改變,并將這種修改映射回人臉圖像,形成新的人臉表情圖像#65377;
人臉由眼睛#65380;鼻子#65380;嘴巴等部件構成,正因為這些器官的形狀#65380;大小和相對位置的各種變化,才使得人臉和表情千差萬別#65377;因此對這些器官的形狀和結構關系變化的幾何描述,可以作為人臉表情識別和修改的重要特征#65377;在生活中,人們通過臉部表情來體現情感是一種常用和自然的表現方式;其情感表現的區域主要包括嘴#65380;臉頰#65380;眼睛#65380;眉毛和前額等#65377;人們在表現情感時,只要稍許改變一下面部的局部特征(如皺一下眉毛#65380;抿一下嘴),便能表達一種不同的情感和心態#65377;有時用照相機拍下一些人物照片后,發現有些臉部區域不是十分到位,以致影響了整個表情的表現#65377;因此希望用計算機處理的方式來改變臉部部位的形狀#65380;大小和相對位置,達到適當地修正表情的目的#65377;
本文目的是開發一個分布影像管理和處理系統,主要應用于攝影工作室人臉圖片的處理#65377;其管理部分主要包括對圖片的分類管理和操作者的權限管理等操作;處理部分是對圖片本身的處理,包括一些對圖像整體的大小#65380;顏色變換和銳化#65380;模糊#65380;浮雕等效果的處理和人物臉部表情的修改#65377;處理部分采用客戶/服務器模式#65377;客戶作出記錄并發出操作指令,服務器端接收指令并按指令執行相應的操作#65377;臉部表情修改模塊是系統服務器端的一個模塊,利用它可以對圖像中人臉的表情進行適當修改#65377;人臉的修改涉及到圖像的變形,圖像變形分為二維變形和三維變形兩種#65377;其中二維變形是對二維平面的圖形#65380;圖像進行的變形處理#65377;本文使用二維的人臉變形與修改#65377;
1人臉圖像的預處理
目前流行的基于統計的人臉識別方法采用的是自動識別,在對大量圖像的人臉信息的提取上有較強的優勢#65377;但是,這種自動的人臉識別技術在該課題中并沒有太多的優勢,反而還會導致系統運行速度的下降#65377;
考慮到該課題是對人臉進行修改而不單單是對其進行識別,在對人臉的修改中,很大一部分是手動調節的因素#65377;因此,采用基于幾何特征的人臉正面圖像識別方法,即通過人臉面部拓撲結構的幾何關系的先驗知識,利用基于結構的方法在知識的層次上提取人臉面部主要器官特征,將人臉用一組幾何特征矢量來表示,識別歸結為特征矢量之間的匹配#65377;采用計算機識別與手動識別相結合的方式,由操作者手動框選人臉的范圍,并對人臉的方向進行旋轉調節,然后輸入眼角#65380;嘴角#65380;臉頰#65380;下巴的關鍵點位置,再通過計算機對圖像灰度信息和操作者輸入關鍵點信息進行計算,得到五官的確切位置和范圍#65377;使用特征點定位五官的方法可大大提高系統的運行效率和速度,并且可提高后面修改操作中的人機交互的能力#65377;筆者在系統設計中,考慮采用這種方式對人臉進行識別和定位#65377;
一般的人像圖像中包括人和背景兩個部分#65377;而對人臉部表情的修改,對周圍背景以及人身體部分圖像的影響不會很大,尤其是遠離人臉部的圖像部分,甚至不會有任何改變#65377;但如果在涉及人臉部圖像修改操作的過程中,讀入的是整張圖片的像素信息進行計算和修改,勢必會降低處理的速度#65377;因此,在對臉部表情修改操作之前,對輸入圖像進行預處理,只提取人臉部及周圍附近的像素信息,這樣就能提高人臉修改的準確度和速度#65377;
在對人臉區域進行選取時,采用一個矩形框的形式,對要修改的臉進行框選,即包含了所要關心的人臉的圖像信息,而背景和身體其他部分則不在框選范圍內#65377;在對歪著頭的人臉進行處理時,考慮對其進行旋轉使其擺正,以方便后面的變換操作#65377;其中,程序人為地對框選的大小作了限定,最大不得大于原圖像的大小,否則按原圖大小顯示;最小不得小于5×5像素正方形框的范圍,否則按5×5矩形框顯示#65377;
本課題涉及人臉表情的修改與變換,所關心的特征點是要能夠表征表情變換的五官的位置和形狀的點#65377;因此,采取的人臉關鍵特征點的定位方法是:操作者手動地選取人臉的四個特征點,分別為兩個眼角外側點#65380;兩個嘴角點,如圖1(a)所示,在此基礎上可以獲得人臉表情變化的器官特征以及擴展的其他特征點位置,用于進一步的識別與修改#65377;
由于已經規定了兩個外側眼角的位置,就可以規定這兩個點所在圓環上的點即為眼部輪廓,由計算機計算輪廓的點群中得到確切的眼部輪廓線;同時,根據輪廓線計算出另外兩個內部眼角和四個眉角的位置,并顯示在圖上#65377;此時,眼睛的位置和大小已經基本確定,操作者還可以通過移動點的位置來繼續調節眼睛#65380;眉毛的細節位置和大小#65377;嘴的確定可以通過以上得到的兩個左右嘴角的位置,結合計算機得到的嘴巴輪廓的點群來確定嘴的位置和大小,同時計算得到兩個上#65380;下嘴角的位置;操作者也可以通過移動點的位置來繼續調節嘴的細節位置和大小#65377;同理,臉部的輪廓也可以通過對手工指定點和計算機計算得到的點來分析獲得,并在圖上顯示臉頰耳角的兩個點和一個下巴點來供操作者進行細微調節,以便更精確地對臉部輪廓進行定位#65377;至此,人臉部表情變換的基本五官信息和特征點就確定了#65377;其結果如圖1所示#65377;其中圖1(b)中的11個點包括:4個眉角點#65380;2個臉頰點#65380;2個眼睛內側點#65380;2個上下嘴角點和1個下巴點#65377;但有些生成的點和圖片上五官的實際位置還是有一點誤差的,再通過手動的微調使其移動到合適的位置上#65377;
通過以上的步驟,可以精確且快速地讀到各五官的輪廓線上的一些點,為后面修改操作時像素點的移動和修改作準備#65377;例如嘴的輪廓線可由定位嘴的四個關鍵點以及周圍像素的灰度關系來最終確定,如圖2所示#65377;
在確定臉部的比例關系后,還需要進一步確定臉部外表的輪廓范圍#65377;采用上面涉及的掃描和灰度比較方法,先把人臉分為左右兩個單獨部分,依據上面所定的特征點為參照,對人臉外表面取均值,不斷向下掃描并比較均值的灰度差異,按灰度差異幅度確定外輪廓的邊界,為將要進行的臉部修改與變換提供必需的參數#65377;
由于圖片中大量雜質的存在,加上光的亮度問題#65380;背景顏色的不確定性,導致掃描過程中產生的許多雜質點,通過一個函數對這一數組點進行取舍優化,并通過對多個點的掃描處理,用多個點對標準點的比較#65380;判斷來消除雜質對掃描的影響#65377;
該模塊的設計中,涉及到圖像的截取#65380;平移和旋轉等操作#65377;將人臉圖片提取出來后,通過特征點定位的方法首先對人臉部的五官特征點進行定位,即在人臉圖像的給定區域內找出人臉特征(如眼#65380;鼻#65380;嘴#65380;耳等)的位置或輪廓線,由計算機計算灰度差的方法得到臉部所有輪廓線的點群;然后通過分析手動輸入的特征點和計算機計算得到的相對應于各個器官的輪廓線點群,確定惟一一條決定五官位置和大小的輪廓線;再通過手動操作的方式對其他特征點位置的調節,對五官輪廓線進行微調,最終得到眼睛#65380;眉毛#65380;嘴巴和臉部的輪廓線,從而確定它們的位置和大小#65377;在結束預處理過程后,將預處理過程得到的信息輸入到后面的步驟中,為臉部表情的修改提供必要的參數#65377;
2人臉修改算法的實現
2.1算法實現
人臉部位的變換和修改是指在人臉數據模型上對人臉部位進行平移#65380;放縮#65380;扭曲的變換和整體表情的改變,并將改變映射回人臉圖像,形成新的人臉圖像#65377;人臉表情變換方法應該同時考慮計算復雜度和表情合成質量兩個方面的要求,盡量在降低算法復雜度與提高表情動畫效果之間尋找合適的折中點,同時考慮實際應用中不同場合對人臉表情變換的需求#65377;由于人臉部生理結構十分復雜,對各個部位的處理可能涉及不同的方式方法,本項目針對人臉的特殊部位進行研究,完成臉部定位#65380;建模#65380;變換過程#65377;
本項目用Java語言實現相關的處理算法#65377;人臉模型方案是:根據人臉特征點建立一個類似于圖3的人臉網格模型#65377;基本特征點(兩個嘴角點和兩個眼角點)由用戶通過鼠標輸入;其他的特征點根據一般人臉的幾何特點推測#65377;建立網格時,以特征點為基本交點,從臉部特征區域(眼#65380;鼻#65380;嘴)向四周擴展#65377;特征區域網格較密,四周漸稀疏#65377;
在模型上進行特征區域的形變,包括平移#65380;放縮#65380;扭曲等,這些操作最后均轉換成對人臉網格上的頂點進行變形,即將特征點從一個位置移動到另一個位置#65377;人臉網格上的非特征點的移動是以特征點的移動為基準的#65377;設T={t1,t2,…,tm}為選定的m個特征點,則對第n個非特征點來說,其變形可以通過周圍已變形的特征點和非特征點得到;同時,通過設置一個形變系數,使越靠近特征點的點形變越大#65377;
在網格模型形變完成后,將原網格內的像素對應到形變后的網格#65377;如果將一個網格放大,其效果就是將四邊形(A,B,C,D)變換到四邊形(E,F,G,H),必須求出(A,B,C,D)中所有的點P(x,y)在(E,F,G,H)中的對應點P′(x′,y′),這里所說的點就是像素點#65377;
在這里認為四邊形由固定數量的線段組成,通過兩次遍歷掃描過程,用線段插值算法實現四邊形(E,F,G,H)內每一條線段的像素插值#65377;在四邊形插值算法的基礎上,把三角形看做退化的四邊形來處理#65377;四邊形(A,B,C,D)的一邊BC退化時,便變成了三角形ABD#65377;當對三角形ABD進行變換時,就把它看成是邊BC長度為零的四邊形(A,B,C,D),用四邊形的像素插值算法來處理#65377;
在人臉部位變化過程中,在整體相對固定不變的情況下,需要修改區域與區域之間的結合處,就需要掃描直線來改變結合處像素的變化#65377;假設有線段(a,b)需要旋轉#65380;放大,并移動到目標直線(c,d)#65377;首先分別求出a~c#65380;b~d之間的間隔變化,求出其斜率并比較大小,選擇從X方向還是Y方向對圖像進行掃描填充;并按(a,b)(c,d)各自的斜率變化情況進行遞增填充#65377;
直線是生成各種圖形的基本元素#65377;直線算法是其他各種圖形算法的基礎#65377;直線生成的速度直接影響到圖像整體的生成速度#65377;目前有許多直線生成的算法,其中Bresenham算法是一種較為有效的直線生成算法#65377;該算法需要對每個像素點進行偏差計算,循環次數是以圖形顯示設備上的網格為基本單位的像素點數,當繪制的直線較長時,循環次數較大,算法執行效率和直線生成的速度很慢#65377;通過分析發現,對于一般斜率不為1的直線,在每個像素行上通常有若干個像素點,而且每個像素行上重復的像素點數基本相同,具有一定的規律#65377;此若干個像素點可預先計算出來并一次寫入幀緩沖區中同時點亮#65377;同時算法本身的復雜度降低,將算法的注意力由單個的像素點的計算#65380;估測,轉移到像素點重復個數的計算#65377;當直線斜率較小時,此時一次并行寫入并且點亮的像素點數很多,直線生成的速度將顯著提高#65377;
經過以上幾種算法的實現比較,對一些局部臉形的變化進行修改#65380;演化和改進#65377;將原先的四邊形修改算法演化成專門針對臉形變化的三角形變化模型#65377;
2.2功能實現
將臉部圖像的修改單獨列一個frame進行操作,把指令控制與圖像效果分離,既有利于用戶的操作實現,也有利于圖形算法的分割實現,體現了算法的獨立性和可移植性#65377;
用AdjustBox類控制臉部圖像的變換,將不同的臉部變換進行分類選取,將臉部修改分為嘴形變換#65380;眼部變換#65380;臉形變換三項不同的處理變換,以控制臉部圖像#65377;變換或修改時,由于AdjustBox中已經實現了ProcessHock的接口,可以分別對x#65380;y方向或整體進行滑動修改,在設計時,以百分比來實現滑動變化的大小#65377;
在算法的實現上,已經將變化算法作了一定范圍的擴大和調整#65377;在臉部修改的范圍上做了很大的局限性#65377;考慮到修改出來的效果,還是要符合原來臉形的基本要求,不可能對臉部作無休止的#65380;太大范圍的改動,所以將變化的范圍定得比較小,只能在局部的范圍內作修改操作;其次,逐步縮小變化的范圍,如微微改變臉部附近的發型或嘴角,以細化臉部的修改#65377;在實現臉部修改的同時,還要實現臉部表情參數系統,可以極大地方便用戶對參數的隨意性調整,而且操作快速便捷#65377;
總之,從處理流程上考慮,人臉部位修改分為特征點的變換和像素的插值兩個步驟#65377;對用戶選擇的每一種操作,首先要確定需要變換的特征點和控制點#65377;特征點是定位人臉部位的點;控制點是定位人臉部位變換影響區域的點#65377;在圖5(a)中,將點A和B作為右眼定位點,稱為特征點,而點C#65380;D#65380;E#65380;F及G是控制點,控制點所構成的多邊形是人臉部位變換的影響范圍,在該多邊形之外是不作處理的#65377;當對右眼進行平移#65380;放縮等操作時,影響的像素集在多邊形CDEFGH之內#65377;在人臉側部特征點選取時,如圖5(b)所示,以預處理中產生的特征點A為中心,以點E#65380;F的水平差為寬,以點C#65380;D的垂直差為高做矩形POMN,取頂點 P#65380;O#65380;M#65380;N為特征點#65377;以點A為中心,適當放大矩形POMN(可通過配置參數調整,但須保證頂點在圖像區域內部)形成新矩形IJKL,取頂點 I#65380;J#65380;K#65380;L為控制點#65377;臉側部的特征點變化比較簡單,只有x方向上的移動#65377;變換時,對矩形POMN的四個頂點作平移,對矩形IJKL的四個頂點保持不變#65377;變化完成后對四邊形POMN#65380;IJOP#65380;JKMO#65380;NMKL#65380;IPNL作插值運算#65377;
在臉部的預處理環節中,通過程序識別和手動調整的方式已經全部選擇出人臉修改所涉及的特征點#65377;在選擇控制點時,盡可能多地利用已有的特征點作為控制點以降低程序的復雜性,然后再根據比例關系確定不足的控制點#65377;這樣,當將特征點和控制點按一定的方式連接后就形成了臉部修改和變換的區域;然后根據用戶選擇操作的類型(平移#65380;放縮#65380;扭曲等)和操作的幅度對特征點進行相應的變換,再利用像素插值算法對對應的每一小塊像素進行賦值,就形成新的人臉圖像#65377;
部分原代碼如下:
/*人臉部修改操作界面類*/
public class AdjustBox extends JFrame {
/*處理接口*/
ProcessHock processObject;
/*構造時,傳入處理接口,處理事件中回調*/
public AdjustBox(ProcessHock ph){processObject=ph;
JTabbedPane tp=new JTabbedPane();
/*加入四個處理參數選擇頁 */
tp.addTab(\"FaceOutlineAdjust\", 1, GetFaceOutlineAdjustGUI(),1);
tp.addTab(\"EyeAdjust\",1,GetEyeAdjustGUI(),1);
tp.addTab(\"MouthAdjust\",1,GetMouthAdjustGUI(),1);
tp.addTab(\"NoseAdjust\",1,GetNoseAdjustGUI(),1);
getContentPane().add(tp,BorderLayout.CENTER);
/*設置退出時的操作*/
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true); }
/*構建人臉輪廓修改操作頁*/
private JPanel GetFaceOutlineAdjustGUI(){
JPanel p=new JPanel();
p.setLayout(new GridLayout(0, 1));
/*構建左右選擇框*/
JPanel pNorth=new JPanel();
pNorth.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(\"Options1\"),BorderFactory.createEmptyBorder(5,5,5,5)));
pNorth.setLayout(new GridLayout(0, 1));
final JRadioButton cbutton1=new JRadioButton(\"left side\");
final JRadioButton cbutton2=new JRadioButton(\"right side\");
final JRadioButton cbutton3=new JRadioButton(\"both side\",true);
pNorth.add(cbutton1);
pNorth.add(cbutton2);
pNorth.add(cbutton3);
p.add(pNorth);
/*構建側面#65380;下巴選擇框*/
JPanel pCenter=new JPanel();
pCenter.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(\"Options2\"),
BorderFactory.createEmptyBorder(5,5,5,5)));
pCenter.setLayout(new GridLayout(0, 1));
ButtonGroup group=new ButtonGroup();
final JRadioButton rbutton1=new JRadioButton(\"side\",true);
final JRadioButton rbutton2=new JRadioButton(\"chin\",1);
group.add(rbutton1);
group.add(rbutton2);
pCenter.add(rbutton1);
pCenter.add(rbutton2);
p.add(pCenter);
/*構建滑塊框*/
JPanel pSouth=new JPanel();
pSouth.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(\"Adjust\"),
BorderFactory.createEmptyBorder(5,5,5,5)));
pSouth.setLayout(new GridLayout(0, 1));
JSlider AdjustSlider=new JSlider(0,100,50);
/*添加滑塊處理事件偵聽器,讀取用戶輸入的操作處理參數,回調處理對象*/
AdjustSlider.addChangeListener(
new ChangeListener(){
public void stateChanged(ChangeEvent event){
int rl=processObject.BOTH;
int part=processObject.SIDE;
JSlider sl= (JSlider)event.getSource();
if(cbutton1.isSelected())rl=processObject.LEFT;
if(cbutton2.isSelected())rl=processObject.RIGHT;
if(rbutton1.isSelected())part=processObject.CHIN;
processObject.FaceOutlineProcess(part,rl,sl.getValue());
} } );
pSouth.add(AdjustSlider);
p.add(pSouth);
return p;
} }
/*處理接口*/
public interface ProcessHock
{ final int LEFT=1;
final int RIGHT=2;
final int BOTH=3;
final int SIDE=4; /*臉兩側輪廓*/
final int CHIN=5; /*臉下巴輪廓*/
final int MOVE=6; /*移動*/
final int SCALE=7; /*放縮*/
final int ROTATE=8; /*扭曲*/
final int HORIZONTAL=9;
final int VERTICAL=10;
/*part 代表兩種不同的臉部位,lr代表左右*/
public void FaceOutlineProcess(int part,int lr,int value);
/*part代表左右,mode代表變換方式,xy代表變換方向*/
public void EyeProcess(int part,int mode,int xy,int value);
/*mode代表變換方式,xy代表變換方向*/
public void MouthProcess(int mode,int xy,int value);
/*mode代表變換方式,xy代表變換方向*/
public void NoseProcess(int mode,int xy,int value);
}
3結束語
臉部圖像處理是圖像處理學科的技術難點,臉部表情修改涉及到許多圖像處理學科和人體生物特征操作技術#65377;本文研究了幾種涉及臉部表情修改的技術環節的相關理論和實現方法,著重要解決的難題有臉部特征定位#65380;臉部建模#65380;臉部變換#65377;臉部特征定位是人臉分析技術的一個重要組成部分,其目標是根據有限個參考點和輸入圖像找出更多的人臉特征點,就是在圖像或圖像序列中的指定區域內搜索人臉特征(如眼#65380;鼻#65380;嘴#65380;耳等)的位置,為臉部建模提供建模數據#65377;人臉部位的建模是根據人臉特征點和輸入圖像建立有利于臉部部位變換的人臉數據模型;而人臉部位的變換就是在人臉數據模型上對臉部部位進行平移#65380;放縮#65380;扭曲的變換和整體表情的改變,并將這種改變映射回人臉圖像,形成新的人臉表情圖像#65377;
參考文獻:
[1]王進.一種基于輪廓多邊形的圖形變形算法[J].計算機研究與發展,2004,36(11):1013.
[2]李旭東.多表情源的人臉表情合成技術[J].計算機輔助設計與圖形學學報,2004,17(1):810.
[3]胡迎春.人臉圖像特征點眼睛的定位與提取[J].廣西工學院學報,2003,14(1):35-39.
[4]宋加濤.一種適合于表情分析的人臉二值邊緣圖像的提取[J].中國圖象圖形學報,2005,9(10):21-24.
[5]LIU Zicheng, SHAN Ying. Expressive expression maing with ratio images[C]//Proc of the 28th Annual Conference on Computer Graphics and Interactive Techniques. New York: ACM Press, 2001:271-276.
[6]FASEL B, LUETTIN J. Automatic facial expression analysis[J]. Pattern Recognition, 2003,36(1):259-275.
[7]HWANG B, LEE W. Reconstruction of partially damaged face images based on a morphable face model[J]. IEEE Trans on Pattern Analysis and Machine Intelligence, 2003,25(3):365-372.
[8]HAVRAN C, HUPET L, CZYZ J, et al. Independent component analysis for face authentication[C]//Proc of Knowledgebased Intelligent Information and Engineering Systems. Crema,Italy:[s.n.], 2002:12071211.
[9]WEI L, MARC L. Texture synthesis over arbitrary manifold surfaces[C]//Proc of the 28th Annual Conference on Computer Graphics and Interactive Techniques. New York: ACM Press, 2001:355-360.
[10]何良華.人臉面部表情識別的研究進展[J].電路與系統學報,2005,10(1):70-75.
“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”