本文由兔崩潰公佈http://blog.csdn.net/smartempire/article/details/31373817。算法
轉載請註明出處。howdeshui#163.com數據庫
近期在作三維人臉識別相關的東西,在已獲取三維數據的狀況下進行人臉的識別分割是第一步。本文將介紹預處理內的幾個操做,終於給出分割後的三維人臉數據以及通過變換的灰度圖像。ui
做者以前申請了國內的三維人臉數據庫都沒申請到,FRGC v2庫也沒有回覆,僅僅申請到了一個很小衆的庫。此庫重點是研究有遮擋狀況下的三維人臉識別,因此不太符合後面要作表情變化研究。spa
一、填洞插值操做.net
掃描獲得的數據可能會有一些洞。例如如下圖的眼睛眉毛等部分,因此需要採用cubic等方式進行插值,而且臉部會有稱爲spike的凸起。這個在後面切割出人臉後會進行消除。orm
需要注意的是,原始數據的x,y軸上的座標並不是等間距的。因此在插值後需要進行重採樣,使得x,y軸上爲等間距。blog
原始三維數據ip
二、圖像插值重採樣博客
之因此會有這一步,是因爲三維數據通過插值重採樣以後與二維圖像的像素點已經不是一一相應的關係了,因此爲了接下來的人臉區域檢測等操做需要相似的重採樣。原始圖像與插值重採樣後的圖分別例如如下:it
原始RGB圖像重採樣圖像
你可能會問原始圖像是彩色的,重採樣後爲毛變成灰度的了,沒辦法,RGB圖像有三個份量,插值與採樣我實在不知道該怎麼在三個份量上進行。假設在每個份量上進行獲得的圖像簡直纔不忍賭。
三、鼻尖點檢測
這是關鍵的一步,因爲以鼻尖點爲中心作80mm的圓球就能將人臉分割出來,因此這一步的準確性很是關鍵。
在一些論文裏是這麼作的,將三維數據作橫向的切片稱爲slice,在鼻尖點處的slice基本例如如下圖。假設以每一點爲圓心作圓。假設圓的半徑合適(比方30mm),那麼圓心與交點會造成一個三角形而且這個三角形的高(altitude)是最大的。經過這種方式基本可以肯定鼻尖點。但是假設僅僅是這麼作會發現有些衣服如衣領等會造成誤操做。因此可以先在灰度圖像上檢測人臉區域,在這個區域取slice可以基本消除誤測。
鼻尖點檢測示意圖鼻尖點(圖中黑點)
三、提取人臉部分
在第2步獲得nose tip 後,以該點作圓球。以80mm(視狀況而定)作半徑,落在圓球內的三維點即爲人臉點。
四、降噪、去spike操做
Spike主要是一些毛刺。可以定義該點到8-neighbor的距離做爲推斷根據,假設距離超過某個閾值則可以把該點抹成0而後又一次採樣,或者直接抹成8-neighbor的均值或者中值。降噪主要針對臉部凹凸不平的狀況,做者測試了中值和均值濾波器,但是效果並不明顯,也許是因爲前期已經重採樣的緣由。下圖是獲得的人臉,貌似和第三部的結果沒有差異。
五、姿態矯正
有些人臉可能會有旋轉平移的狀況。這一步將對姿態進行矯粗方便興許的ICP等方法的對齊,矯正用到的方法是Hotelling transform。在以前的博文裏介紹過了,再也不贅述。結果例如如下圖,由於博主原本選擇的數據就是姿態不明顯的,因此矯正的結果並不明顯。
以上就是預處理的幾步。沒有涉及到複雜的算法實現,僅僅是實現起來比較瑣碎,像nose tip的檢測要推斷圓與slice的交點,要由粗到細的取slice的間隔以節省CPU時間。因此實現起來比較費時。以前上傳的人臉識別的demo即便是免費的也仍是有人發牢騷。因此本文的MATLAB代碼就再也不免費發佈了。假設有需要可以聯繫我howdeshui#163.com。