我想在其上绘制一个带有纹理贴图的表面,但条件不是"理想的"的。
首先让我解释一下我的情况。
我有一组点(~7000),它们是网格中的图像坐标。 此点不会定义完美的正方形。 它不是MESHGRID 。为了这个问题,我们假设我们有9分。让我们用图像说明我们所拥有的东西:
X=[310,270,330,430,410,400,480,500,520]
Y=[300,400,500,300,400,500,300,400,500]
让我们说我们可以得到"结构"网格,所以
size1=3;
size2=3;
points=zeros(size1,size2,2)
X=[310,270,330;
430,410,400;
480,500,520]
Y=[300,400,500;
300,400,500;
300,400,500]
points(:,:,1)=X;
points(:,:,2)=Y;
现在我们假设我们有第三个维度,Z。
编辑:忘记添加一条信息。我对图像中的点进行三角测量并获得3D对应关系,因此当在表面中显示它们时,它们不具有图像的X和Y坐标,为了简化给定数据,可以说X = X / 2 Y = Y / 3
我们有:
points=zeros(size1,size2,3)
Z=[300,330,340;
300,310,330;
290,300,300]
surf(points(:,:,1)/2,points(:,:,2)/3,points(:,:,3))
我想要的是用图像纹理在3D中绘制表面。每个元素都应该具有第一张图像中的纹理片段。
这需要适用于大型数据表。我并不特别需要快速。
相关帖子(但我有一个网格网格作为初始点集):Texture map for a 2D grid
PD:如果需要,我可以发布原始图片+真实数据,只是张贴了这个,因为我认为使用小数据会更容易。
答案 0 :(得分:10)
您可以使用texturemap
surf
属性,该属性适用于矩形网格以及非矩形网格。
创建非矩形数据点
% creating non-rectangular data points
[X, Y] = meshgrid(1:100, 1:100);
X = X+rand(size(X))*5;
Y = Y+rand(size(X))*5;
导致以下数据点:
生成身高数据:
Z = sin(X/max(X(:))*2*pi).*sin(Y/max(Y(:))*2*pi);
载入图片:
[imageTest]=imread('peppers.png');
并将其作为纹理映射到网格:
surf(X,Y,Z, imageTest, ...
'edgecolor', 'none','FaceColor','texturemap')
请注意,为了演示,这个非矩形网格非常稀疏,导致相当锯齿状的纹理。无论网格点的失真如何,使用更多的点,结果会更好。
另请注意,网格点的数量不必与纹理图像中的像素数相匹配。
<强>〜编辑〜强>
如果X和Y坐标仅适用于图像的某些部分,则可以通过
相应地调整纹理minX = round(min(X(:)));
maxX = round(max(X(:)));
minY = round(min(Y(:)));
maxY = round(max(Y(:)));
surf(X,Y,Z, imageTest(minX:maxX, minY:maxY, :), ...
'edgecolor', 'none','FaceColor','texturemap')
答案 1 :(得分:4)
我不认为你可以用Matlab的内置命令和功能做你想做的事。但是使用my other answer中的技术和网格的高分辨率版本可以为您完成。
“high-res”是指具有更密集数据点的非均匀网格的插值版本。这用于在更密集的数据点处对纹理进行采样,以便可以使用texturemap
的{{1}}功能进行绘制。但是,您不能使用普通的2D插值,因为您需要保留不均匀的网格形状。这就是我想出的:
surf
请注意,您必须调用此选项两次才能独立插入X和Y点。这是原始网格和每个方向上有10个点的插值版本的示例。
以下是如何将该高分辨率网格与function g = nonUniformGridInterp2(g, sx, sy)
[a,b] = size(g);
g = interp1(linspace(0,1,a), g, linspace(0,1,sy)); % interp columns
g = interp1(linspace(0,1,b), g', linspace(0,1,sx))'; % interp rows
和interp2
一起使用。
texturemap
答案 2 :(得分:1)
我不确定我理解你的问题,但我认为你需要做的是在网格的X,Y点处对纹理进行采样(绘图)。然后您可以简单地绘制曲面并将这些样本用作颜色。
以下是使用您在问题中提供的数据的示例。它看起来并不多,但使用更多的X,Y,Z点应该得到你想要的结果。
% define the non-uniform surface grid
X = [310,270,330; 430,410,400; 480,500,520];
Y = [300,400,500; 300,400,500; 300,400,500];
Z = [300,330,340; 300,310,330; 290,300,300];
% get texture data
load penny % loads data in variable P
% define texture grid based on image size
% note: using 600 so that a,b covers the range used by X,Y
[m,n] = size(P);
[a,b] = meshgrid(linspace(0,600,n), linspace(0,600,m));
% sample (map) the texture on the non-uniform grid
C = interp2(a, b, P, X, Y);
% plot the surface using sampled points for color
figure
surf(X, Y, Z, C)
colormap gray