logo资料库

基于空间几何变换的人脸对齐(Matlab内置函数.pdf

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
基于空间几何变换的人脸对齐(Matlab内置函数实现)1.仿射变换在人脸对齐中,常常会将图像进行空间几何变换,仿射变换是其中最常用的一种空间变换形式。可以用如下的矩阵形式表示:T 1] z [=1] [wyx仿射变换实际是对图像按比例缩放、旋转、平移或剪切的组合,具体取决于变换矩阵T中元素的取值。2.基于三点的人脸对齐现在,我们关心的是如何准确的得到所需的仿射变换。这首先需要两组匹配的特征点坐标,而已知的是,人脸对齐中目标图像特征点的位置是一组经验值,可以用如下代码来描述:rows=200;cols=200;%目标图像大小rowFrac=0.35;colFrac=0.65;%用于定义特征点位置的比例系数le=[(1-colFrac)*cols,rows*rowFrac];%左眼re=[colFrac*cols,rows*rowFrac];%右眼mouth=[0.5*cols,rows*(1-rowFrac),];%嘴巴landmark_tool=[le;re;mouth];%基于三点的特征点坐标因此我们只需得到输入图像中特征点的坐标就可以了,可以选择利用鼠标选取特征点:TOLNUM=3;%特征点个数landmark=[];fork=1:TOLNUMa=ginput(1);plot(a(1),a(2),'b.');landmark=[landmark;a];end%得到特征点坐标
Matlab利用所谓的tform结构来表示空间几何变换。创建这种结构的一种方法是利用函数cp2tform,其函数原型为:tform=cp2tform(movingPoints,fixedPoints,transformtype)另一种可行的方法是利用函数estimateGeometricTransform,其函数原型为:tform=estimateGeometricTransform(matchedPoints1,matchedPoints2,transformType)本次,我们只对仿射变换感兴趣,因此transformType被定为’affine’,由此,我们便得到了所需要的仿射变换:tform,将其作用于输入图像后,即可得到人脸对齐后的目标图像。其中,与cp2tform匹配的函数:targetimage=imtransform(inputimage,tform,'FillValue',1);与estimateGeometricTransform匹配的函数:targetimage=imwarp(inputimage,tform);3.基于两点的人脸对齐:然而,在实际应用中,基于两点的人脸对齐却更为常用。在尝试将嘴部的特征点去掉之后,运行时却发生了错误,而两种方法的错误提示中不约而同地提到:Atleast3non-collinearpointsneededtoinferaffinetransform.接着,将transformtype尝试改为其他类型时,对于函数cp2tform,因没有可用的类型而作罢;对于函数estimateGeometricTransform,显示'Similarity'类型可行;对于另一个之前没有用到的函数fitgeotrans,却显示'NonreflectiveSimilarity'可行。各种方法的结果对比将在下一部分展开。4.结果对比:首先是基于三点的仿射变换,三种不同函数的横向对比:
输入图像cp2基于三点(affine)estTran基于三点(affine)fit基于三点(affine)可以看出效果最好的函数是cp2tform,对原图的特征保持的较好,另两个函数输出的图像则使乔的脸型更胖。接下来是对相同函数,基于两点和基于三点的结果纵向对比:
estTran基于三点(affine)estTran基于两点(Similarity)可以看出的是,对于函数estimateGeometricTransform,尽管空间变换类型由仿射变换改为相似变换,基于两点的人脸对齐仍然得到了更好的结果。fit基于三点(affine)fit基于两点(NonreflectiveSimilarity)对于函数fitgeotrans,类型Similarity却不可行,原因仍然是那句:Atleast3non-collinearpointsneededtoinfersimilaritytransform.这样的结果很出乎意料,而另一种类型NonreflectiveSimilarity却显示出很好的结果。综上所述,使用fitgeotrans函数,transformType设为NonreflectiveSimilarity的方法,是目前据肉眼观察,效果最佳的方法。
5.Matlab代码:基于三点的人脸对齐(仿射变换):function[]=affine_tform()rows=200;cols=200;%目标图像大小targetimage=zeros(rows,cols);%目标图像rowFrac=0.35;colFrac=0.65;%用于定义特征点位置的系数le=[(1-colFrac)*cols,rows*rowFrac];re=[colFrac*cols,rows*rowFrac];mouth=[0.5*cols,rows*(1-rowFrac),];landmark_tool=[le;re;mouth];%基于三点的特征点坐标cd(['C:\Users\think\Desktop\']);Fname='inputimage.jpg';inputimage=imread(Fname);%读入图像imshow(inputimage);holdon;landmark=[];TOLNUM=3;%特征点个数fork=1:TOLNUMa=ginput(1);plot(a(1),a(2),'b.');landmark=[landmark;a];end%得到特征点坐标holdoff;tform=cp2tform(landmark_tool,landmark,'affine');%得到仿射变换targetimage=imtransform(inputimage,tform,'XData',[1300],'YData',[1350]);%得到目标图像imwrite(targetimage,'targetimage.jpg');%保存目标图像imshow(targetimage);end另外两种函数则是分别将橙色代码替换为:tform=fitgeotrans(landmark,landmark_tool,'affine’);%gettransformmatrixresult=imwarp(inputimage,tform,'outputview',imref2d(size(targetimage)));%getresult
或:tform=estimateGeometricTransform(landmark,landmark_tool,'affine');%gettransformmatrixresult=imwarp(inputimage,tform,'outputview',imref2d(size(targetimage)));%getresult基于两点的人脸对齐(其他空间几何变换):function[]=affine_tform()rows=200;cols=200;%目标图像大小targetimage=zeros(rows,cols);%目标图像rowFrac=0.35;colFrac=0.65;%用于定义特征点位置的系数le=[(1-colFrac)*cols,rows*rowFrac];re=[colFrac*cols,rows*rowFrac];landmark_tool=[le;re];%基于两点的特征点坐标cd(['C:\Users\think\Desktop\']);Fname='inputimage.jpg';inputimage=imread(Fname);%读入图像imshow(inputimage);holdon;landmark=[];TOLNUM=2;%特征点个数fork=1:TOLNUMa=ginput(1);plot(a(1),a(2),'b.');landmark=[landmark;a];end%得到特征点坐标holdoff;tform=fitgeotrans(landmark,landmark_tool,'NonreflectiveSimilarity’);%得到其他类型的空间变换result=imwarp(inputimage,tform,'outputview',imref2d(size(targetimage)));%得到目标图像imwrite(targetimage,'targetimage.jpg');%保存目标图像
imshow(targetimage);end或将橙色代码替换为:tform=estimateGeometricTransform(landmark,landmark_tool,'Similarity');result=imwarp(inputimage,tform,'outputview',imref2d(size(targetimage)));
分享到:
收藏