人脸对齐实现“平均脸”制作
“平均臉”的歷史
雖然現在很流行,但是,其實平均臉的歷史相當悠久。
1878年,英國的弗朗西斯·高爾頓爵士(Sir Francis Galton)發明了一種創造出“平均”面容的技術。
?
弗朗西斯·高爾頓爵士,英國維多利亞時代的博學家、人類學家、優生學家、熱帶探險家、地理學家、發明家、氣象學家、統計學家、心理學家和遺傳學家;也是《物種起源》作者查爾斯·達爾文的表弟。*
這一方法是通過將許多人的照片合成為一張照片完成的。
當時具體的做法是:照片疊加——給多個人,比如20個人,照相,將每個人照片所需的曝光時間縮短為1/20,通過20次曝光得到一張“平均”照片。
?
弗朗西斯·高爾頓最初合成平均臉的目的是將不同“種類”的人(例如:囚犯、精神病患者等等)視覺化,以期得到這類人的“原型”(共同特征)。
但結果卻意外的發現,這樣合成的人臉卻比用于合成大部分(甚至是全部)都要好看!
雖然高爾頓爵士的初衷沒有達到,合成平均臉的方法卻保留了下來。
新技術讓人人可制作“平均臉”
隨著技術的發展,照片不再需要物理底片,合成也不再需要復雜的曝光沖印技術,通過一些簡單的操作就能做到,人人都可以上手。
?
大家想必看到過很多合成的“平均臉”圖片吧。
有按國家、民族合成的:
?
?
也有針對政要明星合成的,例如這張,韓中日三國明星平均臉:
?
?
想不想自己動手制作一張周圍人的平均臉?
一點都不復雜,只要知道了用Image Morphing技術疊加照片的原理,再會寫幾行簡單的代碼,就能順利完成。
Image Morphing技術的原理相當簡單:給定兩張圖片I和J,我們通過疊加(或者叫做混合)I和J來獲得一張中間狀態的圖片M。
I和J的疊加由一個參數[0,1]區間內的參數alpha來控制。當alpha=0時,M就等同于I,而aphla=1時,M就為J。
換言之, M中的每一個像素M(x,y),都可以通過這樣一個公式來得到它的值:
M(x,y) = (1 – alpha)·I(x,y) + alpha·J(x,y)
當alpha=0.5的時候,I和J就五五開,平均貢獻了M。如果I和J是兩張人臉照片的話,M自然也就成了它們的“平均臉”。
看起來好容易哦,那我們趕緊找兩張照片來試試吧!就用這兩張:
?
這兩張照片alpha=0.5后直接疊加的結果是這樣的:
?
這也不是人臉呀!先別急,看看為什么會這樣?
從這張“重影圖”上不難看出來,之所以這樣,是因為最基本的五官都沒有對齊。
如果我們事先把兩個人的眼睛和嘴對齊,效果就不會是這樣的了。
疊加兩張*對齊的*人臉
疊加圖片I和圖片J的時候,首先應該建立兩張照片中像素的對應關系。
?
對I中的某一個像素點(xi,yi),我們不是直接在J中取同樣位置的點就可以了,而是要找到它在J中內容上的對應點 (xj,yj)。
?
然后再進一步找到M中這兩個點疊加之后應當處在的位置(xm,ym),最后再用下列式子得出M中對應點的像素值:
?
xm = (1-alpha) · xi + alpha · xj
ym = (1-alpha) · yi + alpha · yj
算式-1
對一個像素點我們這樣做,對整幅圖片,則是將上面的過程運用到它的每一個像素點上:
M(xm,ym) = (1 – alpha)·I(xi,yi) + alpha·J(xj,yj)
算式-2
很好,我們已經知道從原理上該怎么疊加兩張圖了。
其中關鍵的一步就是:找到對應點。
其實對應點疊加的方法可以用來疊加任何圖片,不僅限于人臉。
不同物體的疊加,真正的區別就在于找到像素點之間的對應關系!一旦對應關系找到,直接運用算式-2就好了。
劃分區域對應人臉
既然我們現在要做的是疊加人臉,那么首先當然要找到人臉上的對應點。
人臉是生活中最常見的事物,我們每一個人都非常熟悉。
一個人的臉如果用簡筆畫畫出來,可以簡化為:臉型+五官(眉毛、眼睛、鼻子、嘴)。
那么如果我們要疊加兩個人的臉的話,自然就是要針對他們的臉型和五官形制求平均。
人的五官如果用圖形來描繪,都是不規則圖形。如果要完全不走樣的獲取一個人的眼睛、眉毛、鼻子或者嘴,需要繪制非常復雜的形狀。
實際上,我們沒有必要這樣做,而是可以通過一種非常簡單的近似方法,把一張人臉分割成若干三角形的區域,然后再來疊加兩張臉上對應的三角區域。
分割方法如下:
1.?獲取人臉特征
?
在圖片中獲取人臉和人臉特征(臉型+五官)。
我們先在每張面孔上獲取68個面部基準點(如下圖)。
?
2. Delaunay 三角剖分
?
在獲得了68個面部基準點之后,我們結合人臉所在的矩形的四個頂點和每條邊的中心點,將人臉所在的矩形分割成如下圖所示的三角形的組合。
?
這一方法又稱為Delaunay三角剖分。更多細節請看:https://www.learnopencv.com/delaunay-triangulation-and-voronoi-diagram-using-opencv-c-python/
疊加經過仿射變換的Delaunay剖分三角形
?
Delaunay三角剖分將圖像分解成若干三角形后,再分別對齊各個三角形區域,對其中像素值進行平均。
?
Step-1:找到合成圖片中的面部特征點
使用前述的算式-1,根據圖像I和圖像J中已經獲得的76個點,在疊加的結果圖像M中找到76個點(xm, ym)
Step-2: 計算原圖到目標圖像的仿射變換
現在我們在圖像I,J和M中分別得到了76個點,以及由這76個點剖分而成的三組三角形。
從圖像I中選取一個三角形ti,在M中找到對應區域tm,通過ti三個頂點到tm三個頂點的映射關系來計算ti到tm的仿射變換。
同理計算出tj到tm的仿射變換。
Step-3:扭曲Delaunay剖分三角形
對于圖像I中的一個三角形,使用step-2中計算出的放射變換,將其中每一個像素通過仿射變換對應到M中對應的位置去。
重復這個過程,處理圖像I中的每一個三角形,得到一個扭曲的(warped)圖像I'。用同樣的方法處理圖像J,獲得扭曲的圖像J'。
Step-4:疊加兩張臉
在step-3中我們已經得到了扭曲的圖像I'和圖像J'。這兩個圖像就可以直接使用算式-2進行疊加了。最后得到疊加結果。
?
疊加多張人臉
算式-2用于疊加2張人臉,在alpha=0.5時求取的是兩張臉的平均。
那么我們把算式推廣一下,從圖像I和圖像J推廣為圖像I1, I2, I3, ..., In;令alpha=1/n;則算式-2變形為如下:
M(xm,ym) = 1/n · [I1(xi1, yi1) + I2(xi2, yi2) + ... ... + In(xin, yi_n)]
由此,我們也就得到了n張臉的平均。
用這個方法,我們可以得到6位美國總統的平均臉:
?
他們平均之后的樣子是這樣的:
?
總結
以上是生活随笔為你收集整理的人脸对齐实现“平均脸”制作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李春葆《数据结构教程》课后习题和实验代码
- 下一篇: 模式识别实验之PCA人脸识别