本文由兔崩溃公布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。