Image 为3d网格/曲面/点指定特定RGB颜色 人脸和特征地标
我有一张带有标签的面部图像。图像以标准JPEG格式存储,地标以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)获得面部
[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);