将特定RGB颜色指定为3d网格/曲面/点

时间:2014-05-27 21:39:02

标签: image matlab image-processing 3d computer-vision

面部和特征标志

我有一张标有脸部特征的脸部图像。图像以标准JPEG格式存储,地标以[x y]格式存储(x,y对应于图像上的坐标,如下所示)

labelled frontal face


插值的3D面部网格

我为每个标记点生成了深度信息(3d网格),并且具有[x y z]格式的矩阵,其中坐标x和y与点的坐标相同。

稀疏网格看起来像这样: 3d_mesh

然后我在xrangeyrangezrange上进行插值,以获得更好的网格效果。使用mesh(xrange,yrange,zrange)给出了以下内容 interpolated 3d mesh

可以使用imread(face_image.jpg)获取面部图像像素的颜色。 假设每个插值点的(x,y)值对应于图像中的(x,y),是否可以使像素的颜色为(x,y,z)[3dmesh] (x,y)[面部图片] 的颜色相同?

这会有效地叠加/扭曲三维网格上的面部,为我提供一个三维面部模型。

1 个答案:

答案 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);

结果:

mapped parrot