2024年9月3日

用python進行影像處理看看平均臉長怎樣

 幾年前玩影像處理的時候,用過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了

https://github.com/ChihHsiangChien/averageFace