(个人)基于深度学习的中国传统特色图像的风格迁移创新实训第九周(2)

先准备个标准形状做参考,比如从论文里找这样一张图,用ginput按顺序选68个点(68个点的定义见CMU那帮人的论文,文献[2],也可以用画图软件事先标好你要的点,比如下图的蓝点,这样的好处是可以保证使用ginput(68)一次成功):
    imshow('meanface.jpg');
    sh = ginput(68);

(个人)基于深度学习的中国传统特色图像的风格迁移创新实训第九周(2)


这样这些点的X,Y坐标就放在sh的两列里。把它作为一个标准形状,存在一个文本文件里。

 

2.程序开始,先要load标准形状。然后通过对话框选取一个图像文件,并显示

 

    [filename, pathname] = uigetfile([pathname,'*.bmp;*.jpg;*.png'], 'Pick an image');
    Aim = imread([pathname,filename]);
    imshow(Aim,[]);

 

检查输入图像是否有对应的lmk文件,即是否做过手工标定了:如果没有进入第3步;如果有lmk,则转入第4步,从lmk文件读取形状数据。

 

3.按顺序选取左眼,右眼,嘴中心3个点,如图。

根据这3点和标准图上对应点计算仿射变换,把标准形状[Xo,Yo]投影到图像中。

(个人)基于深度学习的中国传统特色图像的风格迁移创新实训第九周(2)

4.如果对应的lmk文件已经存在,则读入lmk,把形状[Xo,Yo]铺在图像上。

 

5.根据上面的输入信息,粗略计算一个人脸区域box,并且放大显示
   im=imcrop(Aim,box);
   imshow(im,[]); 

下面就可以编辑这个形状了


   5.1 每次用ginput(1)选择要移动的点,
    [xc,yc,button]=ginput(1);
    %最近点的序号存在ind里
    [val,ind]=min((xc-Xo).^2 + (yc-Yo).^2);


   5.2 再用ginput(1)选择要移动的位置,替换旧的值
    [xc,yc,button] = ginput(1);
    Xo(ind)=xc;  
    Yo(ind)=yc;
  重复这两个步骤,直到满意为止。

6. 保存形状文件(.lmk) 
   fid = fopen( [pathname,landmarkfile], 'w');
   fprintf(fid,'%6.2f %6.2frn', [X,Y]');
   fclose(fid); 

 

另外利用delaunay函数事先计算平均形状的三角网格(mesh):


    mtri=delaunay(meanshape68(:,1),meanshape68(:,2));
    
mtri的每行存储的是3角形的3个顶点序号,我们也可以利用这个三角剖分信息,把网格画在人脸上。
    

(个人)基于深度学习的中国传统特色图像的风格迁移创新实训第九周(2)