我有一张标有脸部特征的脸部图像。图像以标准JPEG格式存储,地标以[x y]
格式存储(x,y对应于图像上的坐标,如下所示)
我为每个标记点生成了深度信息(3d网格),并且具有[x y z]
格式的矩阵,其中坐标x和y与点的坐标相同。
稀疏网格看起来像这样:
然后我在xrange
,yrange
和zrange
上进行插值,以获得更好的网格效果。使用mesh(xrange,yrange,zrange)
给出了以下内容
可以使用imread(face_image.jpg)
获取面部图像像素的颜色。
假设每个插值点的(x,y)值对应于图像中的(x,y),是否可以使像素的颜色为(x,y,z)[3dmesh] 与(x,y)[面部图片] 的颜色相同?
这会有效地叠加/扭曲三维网格上的面部,为我提供一个三维面部模型。
答案 0 :(得分:2)
我会建议:
n=50000; % chose something appropriate
[C,map] = rgb2ind(FaceImageRGB,n);
将RGB图像中的颜色映射为线性索引。 确保网格和RGB图像具有相同的x-y维度。
然后使用surf
使用颜色的索引值(应采用surf(X,Y,Z,C)
形式)和map
颜色贴图绘制曲面。
surf(3dmesh, C), shading flat;
colormap(map);
编辑一个有效的例子(这次带着多彩图片......):
rgbim=imread('http://upload.wikimedia.org/wikipedia/commons/0/0d/Loriculus_vernalis_-Ganeshgudi,_Karnataka,_India_-male-8-1c.jpg');
n=50000; % chose something apropriate
[C,map] = rgb2ind(rgbim,n);
% Creation of mesh with the same dimensions as the image:
[X,Y] = meshgrid(-floor(size(rgbim, 2)/2):floor(size(rgbim, 2)/2), -floor(size(rgbim, 1)/2):floor(size(rgbim, 1)/2));
% An arbitrary function for Z:
Z=-(X.^2+Y.^2);
% Display the surface with the image as color value:
surf(X, Y, Z, double(C)), shading flat
colormap(map);
结果: