幾年前玩影像處理的時候,用過python做過平均臉的專案
不過程式不是自己寫的,是從這個網站來的
https://learnopencv.com/average-face-opencv-c-python-tutorial/
製作平均臉的流程是先抓取68個臉部特徵,原作者用的是Dlib,但是在Dlib安裝實在太困難,我在linux編譯好一陣子才成功,而在windows上還沒試成功,所以後來我就改用OpenCV來做。
這68個特徵如下圖,在這個專案中,兩眼眼尾的兩點很重要,我們要將所有人的這兩點都對齊。
找到臉部的這些特徵點之後,因為下一步是要進行對齊,所以要把這些點連線成許多小三角,這樣才能進行仿射變形。而哪些點才能互相連接呢?這要用到Delaunay triangulation 的方法了。
圖片來源:wikipedia
這些三角形有一個特殊性質:任何一個三角形的其外接圓內不會有其他點。用各實例來看看,我們用湯姆的臉來看看,這些藍點是偵測出的臉部特徵點
找出這些點的Delaunay triangulation
接下來就要對齊了,這篇文章的程式的做法是把大家的眼睛位置都放在新圖像的1/3高度,而橫坐標分別是新圖像寬度的0.3和0.7。
接下來就是用原圖的兩眼尾位置和新圖的眼尾位置,去計算出縮放、平移、旋轉的仿射矩陣長什麼樣子,然後就用這個矩陣把整張臉稍稍變形對齊到新的位置。
不好意思,湯姆的臉就稍稍變形過去了
最後就是把大家的臉放在一起做平均啦,以下就是五位影星的平均臉,帥!
這是找了九位女星的照片,經過對齊的樣子
我想製作這平均臉專題的目的其實不是看漂亮的明星啊,我想看的是如果我用不同政黨的立委照片,是不是會看到不同的平均臉呢?
所以第一步就是上立法院網站抓圖片,我先確定好目標,我要把不同政黨的男性和女性分開來將圖檔存在不同資料夾中。
所以就要寫一隻爬蟲,把立委的個人資料和照片都爬下來再整理
最後就是令人期待的結果了,除了中間的政黨以外,左右兩個政黨幾乎無法分辨,怎麼會這樣呢?其實這就是採樣的問題了,中間的人數少,所以容易看出個別差異,而兩邊的人數多,統計之後就會讓個別差異減少。
如果你對程式有興趣,我放在github了