Image 为3d网格/曲面/点指定特定RGB颜色 人脸和特征地标

Image 为3d网格/曲面/点指定特定RGB颜色 人脸和特征地标,image,matlab,image-processing,3d,computer-vision,Image,Matlab,Image Processing,3d,Computer Vision,我有一张带有标签的面部图像。图像以标准JPEG格式存储,地标以[x y]格式存储(点的x,y对应于其在图像上的坐标,如下所示) 插值三维面网格 我已经为每个标记点生成了深度信息(3d网格),并且有一个[x y z]格式的矩阵,其中坐标x和y与点的坐标相同 稀疏网格如下所示: 然后,我对xrange、yrange和zrange进行插值,以获得更好的网格。使用mesh(xrange、yrange、zrange)可以得到以下信息 可以使用imread(face\u image.jpg)获得面部

我有一张带有标签的面部图像。图像以标准JPEG格式存储,地标以
[x y]
格式存储(点的x,y对应于其在图像上的坐标,如下所示)


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

稀疏网格如下所示:

然后,我对
xrange
yrange
zrange
进行插值,以获得更好的网格。使用
mesh(xrange、yrange、zrange)
可以得到以下信息

可以使用
imread(face\u image.jpg)
获得面部图像像素的颜色。 假设每个内插点的(x,y)值对应于图像中的(x,y),那么有可能使(x,y,z)[3dmesh]处的像素的颜色与(x,y)[face image]的颜色相同吗

这将有效地在3d网格上叠加/扭曲人脸,为我提供一个3d人脸模型。

我建议:

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);
编辑:一个工作示例(这次有彩色图像…):

结果:


您的示例非常有效。不幸的是,使用类似于您所使用的网格并不能完全插值(为问题添加更多细节)(我是新手,不了解使用的负指数,所以我认为这一定是一个范围问题)。另外,
surf(X,Y,-Z,double(C))
,明暗处理平面会给我一个警告:大小(CData)必须等于大小(ZData)或大小(ZData)-1表示平面shading@tdk在我的示例中,我选择了一个任意函数来创建
Z
,我使用
-Z
来翻转多项式。这与你的申请无关。改用
Z
(将在我的答案中编辑)。对于其余部分,请确保网格的大小与图像的大小相匹配,要么填充网格,要么调整图像大小(使用
imresize
maybe)。我被
-floor(大小)(rgbim,2)弄糊涂了/2
用作下限。错误是由于维度不匹配造成的in@tdk这只是为了演示的目的,我希望网格的大小是图像的大小,从-1/2大小到+1/2大小。你不需要这个部分,只需要匹配两个部分的尺寸。我现在已经解决了这个问题,但我还有其他问题。脸(与上面的不同)看起来太脏()。我尝试使用
n=1000
,但结果相同()。对图片(即RGB网格)进行插值并使用更好的网格会使情况更糟()
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);